diff --git a/ls/editors/code/README.md b/ls/editors/code/README.md index 933973956..68cb60e29 100644 --- a/ls/editors/code/README.md +++ b/ls/editors/code/README.md @@ -88,6 +88,10 @@ the following properties: date string. The format string supports specifiers like `%Y` (year), `%m` (month), `%d` (day), `%H` (hour), `%M` (minute), and `%S` (second). For example, for a date like `"2024-01-25"`, the format should be `"%Y-%m-%d"`. For more information see: https://docs.rs/chrono/latest/chrono/format/strftime/index.html +* `regex` (string, optional): When `type` is `"string"`, this property specifies a regular expression that the + metadata value must match. Use `^` and `$` to require a full-value match. For example, + `"^(draft|reviewed|approved)$"` restricts the field to those values. Patterns use Rust's regex syntax. + For more information see: https://docs.rs/regex/latest/regex/ For accessing these settings go to the Settings diff --git a/ls/editors/code/package.json b/ls/editors/code/package.json index 242d51ca6..1c877a703 100644 --- a/ls/editors/code/package.json +++ b/ls/editors/code/package.json @@ -106,6 +106,10 @@ "format": { "type": "string", "description": "The expected format of the date string (e.g., `%Y-%m-%d`)." + }, + "regex": { + "type": "string", + "description": "A regular expression that string metadata values must match (e.g., ^(draft|reviewed|approved)$)." } } } diff --git a/playground/README.MD b/playground/README.MD index 4cef9c66c..e37383034 100644 --- a/playground/README.MD +++ b/playground/README.MD @@ -16,7 +16,7 @@ Write, format and test YARA rules in the browser. Everything runs locally on Web - go-to-definition - formatting - **Sample modes**: Text, Base64, Hex and local File -- **Match highlighting**: inline highlights in Text and Hex modes, with rule, pattern, and byte-range details on hover +- **Match highlighting**: click a match range in Summary to focus it in Text and Hex modes, with rule, pattern, and byte-range details on hover - **Persistence**: rule source, sample drafts, and settings saved to Local Storage across refreshes - **Metadata validation**: formatting and validation rules aligned with the [YARA VS Code extension](https://marketplace.visualstudio.com/items?itemName=VirusTotal.yara-x-ls) configuration - **Scanner limits**: configurable maximum matches per pattern for noisy samples @@ -26,10 +26,10 @@ Write, format and test YARA rules in the browser. Everything runs locally on Web ### Shortcuts -| Shortcut | Action | -| --- | --- | -| `Cmd/Ctrl + S` | Format the current YARA rule | -| `Cmd/Ctrl + Space` | Trigger autocompletion | +| Shortcut | Action | +| ------------------ | --------------------------------------- | +| `Cmd/Ctrl + S` | Format the current YARA rule | +| `Cmd/Ctrl + Space` | Trigger autocompletion | | `Cmd/Ctrl + Enter` | Run the rule against the current sample | ### Sample Modes diff --git a/playground/package-lock.json b/playground/package-lock.json index dc8a9b93a..ca17674e8 100644 --- a/playground/package-lock.json +++ b/playground/package-lock.json @@ -9,7 +9,7 @@ "version": "0.0.0", "dependencies": { "@codingame/monaco-vscode-editor-api": "^25.1.2", - "@virustotal/yara-x": "1.15.0", + "@virustotal/yara-x": "^1.19.0", "lit": "^3.3.2", "monaco-languageclient": "^10.7.0", "vscode-languageclient": "^9.0.1", @@ -978,9 +978,6 @@ "arm" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -995,9 +992,6 @@ "arm" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1012,9 +1006,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1029,9 +1020,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1046,9 +1034,6 @@ "loong64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1063,9 +1048,6 @@ "loong64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1080,9 +1062,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1097,9 +1076,6 @@ "ppc64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1114,9 +1090,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1131,9 +1104,6 @@ "riscv64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1148,9 +1118,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1165,9 +1132,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1182,9 +1146,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1289,9 +1250,9 @@ "license": "MIT" }, "node_modules/@virustotal/yara-x": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@virustotal/yara-x/-/yara-x-1.15.0.tgz", - "integrity": "sha512-tR+Ue5ci9bURbD7/qjXY0VLVXDUP+NK/uvvgjX6UvSXN+3msfMtpAMaiCdsltFEciU+tXaZeGbHu3N07bvfjsw==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@virustotal/yara-x/-/yara-x-1.19.0.tgz", + "integrity": "sha512-yCVb8hLVYB6Yb6uFLmndDZL12/O1C28knNFSzarmKupMt+dLQwr5FjsA26mBDY0bBbPT6GkUGMe2bzXIVNM/oQ==", "license": "BSD-3-Clause" }, "node_modules/@vscode/iconv-lite-umd": { @@ -1416,9 +1377,9 @@ } }, "node_modules/dompurify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz", - "integrity": "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==", + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.11.tgz", + "integrity": "sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw==", "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" diff --git a/playground/package.json b/playground/package.json index 337abb5bb..fe525d49f 100644 --- a/playground/package.json +++ b/playground/package.json @@ -15,7 +15,7 @@ }, "dependencies": { "@codingame/monaco-vscode-editor-api": "^25.1.2", - "@virustotal/yara-x": "1.15.0", + "@virustotal/yara-x": "^1.19.0", "lit": "^3.3.2", "monaco-languageclient": "^10.7.0", "vscode-languageclient": "^9.0.1", @@ -26,5 +26,8 @@ "rollup-plugin-visualizer": "^7.0.1", "typescript": "~5.9.3", "vite": "^7.3.6" + }, + "overrides": { + "dompurify": "3.4.11" } } diff --git a/playground/pnpm-lock.yaml b/playground/pnpm-lock.yaml deleted file mode 100644 index e23080ced..000000000 --- a/playground/pnpm-lock.yaml +++ /dev/null @@ -1,1799 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@codingame/monaco-vscode-editor-api': - specifier: ^25.1.2 - version: 25.1.2 - '@virustotal/yara-x': - specifier: 1.15.0 - version: 1.15.0 - lit: - specifier: ^3.3.2 - version: 3.3.2 - monaco-languageclient: - specifier: ^10.7.0 - version: 10.7.0 - vscode-languageclient: - specifier: ^9.0.1 - version: 9.0.1 - vscode-languageserver-protocol: - specifier: ^3.17.5 - version: 3.17.5 - devDependencies: - prettier: - specifier: ^3.8.1 - version: 3.8.1 - rollup-plugin-visualizer: - specifier: ^7.0.1 - version: 7.0.1(rolldown@1.0.0-rc.10(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1))(rollup@4.62.2) - typescript: - specifier: ~5.9.3 - version: 5.9.3 - vite: - specifier: ^7.3.6 - version: 7.3.6(lightningcss@1.32.0) - -packages: - - '@codingame/monaco-vscode-api@25.1.2': - resolution: {integrity: sha512-K04QcQA+Zb0KXucBAK/BGCT5dldiwIqdUbBQq7yuLvBLbof3cP1WSUuxasMHGYwM0MWyzIAsDtyAYMS7is8ZuA==} - - '@codingame/monaco-vscode-base-service-override@25.1.2': - resolution: {integrity: sha512-OwYs6h1ATUAeMmX+Q1c8esTG7GLMqniBs+fLEr1/9b/ciY485ArKo5UvrUxVPDtRNy/7F06vRW9IUCq9iKP14w==} - - '@codingame/monaco-vscode-bulk-edit-service-override@25.1.2': - resolution: {integrity: sha512-+EfSzjiFakCf0IIJKPZrHVGioq5N8GBsp51bXuKBR5J/B58cUaJY0Dc12PNTSpgAusAGOppUIOSBqUk4F/7IaQ==} - - '@codingame/monaco-vscode-configuration-service-override@25.1.2': - resolution: {integrity: sha512-oeoZ3WtM42zHA1IWHrx9UGEfE+TixE+G8Bl9M9bjgFj1EROnkB5yOfELwRYPo4WOEtcK1C5nvIvWIj/hL9MaLg==} - - '@codingame/monaco-vscode-editor-api@25.1.2': - resolution: {integrity: sha512-dVXoBLRN8vyFHsLY6iYISaNetZ3ispXLut0qL+jvN0e0CEFkUv1F/3EAE7myptrJSS/N1AptrRIxATT3lwFP+Q==} - - '@codingame/monaco-vscode-editor-service-override@25.1.2': - resolution: {integrity: sha512-EadvDCyWdgxOPmaIvbcVVDNjTUYuKdjYWwKbPbbcTs9t4z1/DjdE7mV3ZdT6aGh5m6zkEEUOi143l27Y5eRt+Q==} - - '@codingame/monaco-vscode-environment-service-override@25.1.2': - resolution: {integrity: sha512-8GoD3lk0CN0dIMZOrZNS/i8RCaF1YSQ6nmrf+rqneOSHG9S382EnsZZD69d4+i7JnoeyttO7Kr9KH8WOhRV6OA==} - - '@codingame/monaco-vscode-extension-api@25.1.2': - resolution: {integrity: sha512-SJW/YOhjo+9MXEyzMwQMUWdJVR3Llc6pTq5JQqs6Y30v73gTrpLqtzbd9FNdCuQR8S6bUk5ScH8GL4QrVuL5FA==} - - '@codingame/monaco-vscode-extensions-service-override@25.1.2': - resolution: {integrity: sha512-rTTZW2biPxcg+JumhVf2L+38C5ptvNNxiJlwz39VfXFEh6qOHtAsIMy7vIXa0uGg5/y8DNp0SnOQJP/RKhLYZA==} - - '@codingame/monaco-vscode-files-service-override@25.1.2': - resolution: {integrity: sha512-TenLLAFIwY7keZFF8e3beUn7OVfnNINR5Noi4PVrjeeTcy6FuNH6Jghdul2JwpRAkvyJLdFMvomE2jlT6F03jQ==} - - '@codingame/monaco-vscode-host-service-override@25.1.2': - resolution: {integrity: sha512-lgaalpA9CUQW7i0bBwgBOK0DQNDvOo3QO3p6Rz6yVsHpgA4iMqq2d11dBDUKvuQSwIHPRu8CMHCqhQk/BQN/YA==} - - '@codingame/monaco-vscode-keybindings-service-override@25.1.2': - resolution: {integrity: sha512-cp/gGyTvCTAzCYnQm0HJykXJRB0Huz8Lvq60lj5LutgWcb8S3w6dOB2Houm8dHoeUm/jOko8SQNIP8hzWN92Zw==} - - '@codingame/monaco-vscode-language-pack-cs@25.1.2': - resolution: {integrity: sha512-v0cB2uAOCwj135aGIf0arGV+DNW32lbWh04bv8ctTxcWRt1Pr2kTQ1pjfE8ynKgxabPfAk8E25/CerKSYOmZ+A==} - - '@codingame/monaco-vscode-language-pack-de@25.1.2': - resolution: {integrity: sha512-xA3WOt1w5jlAOnyx4PBwx+qV3vx8C8/zie29qjYbgJMxGKDkb0HfpuKUwywDA2uUMI2wJZS+PnNG00zPDoLIrw==} - - '@codingame/monaco-vscode-language-pack-es@25.1.2': - resolution: {integrity: sha512-1/upuO9lRJilZ3sRr0QLTpz55KYRaBWDe8wtPvghOFYOHyWgW8A4VhUQxa6L9SJgY1JkypUAm0U8WcMX2G4LnQ==} - - '@codingame/monaco-vscode-language-pack-fr@25.1.2': - resolution: {integrity: sha512-iq+xx+tv1QIMmFD0eBhFRMF4xMAsVf/HyA1WogqBofteCWeAvRE9HUjZ5JzHz7jXBPe3dLP1LOM0r0GrJZs4fQ==} - - '@codingame/monaco-vscode-language-pack-it@25.1.2': - resolution: {integrity: sha512-FajWCML9OR8ppLnJ0mcg+sFHEhYJl8zhb3/DHnd+pNysw8dLfetXoSWjaPnwPPpwiQgkNN1UsToZHOU9czVifQ==} - - '@codingame/monaco-vscode-language-pack-ja@25.1.2': - resolution: {integrity: sha512-NwKh0BnPgUrJkxsm0X6vY4ftnd9DjxkcnQqK+bohta6UOzm09J1EjZ6QD42fjWngxrp/xiegtrYQ9NA2q6VpoA==} - - '@codingame/monaco-vscode-language-pack-ko@25.1.2': - resolution: {integrity: sha512-fvaisgfcg8YaAwnyPcGmQDLwkwqzamLQUyx9HmnwDpXw0YANzd058Kwn6bz+Vfn9MjwuMNT0nllD0qQMnpdyew==} - - '@codingame/monaco-vscode-language-pack-pl@25.1.2': - resolution: {integrity: sha512-9hDRyzFJkDia5rO9QE262JgxwP/cnalFisLFo7FQcw57ZhqzqXIdQIuwcKaHuAgzeQ6W2+A3KOLfTr3m7VZrXw==} - - '@codingame/monaco-vscode-language-pack-pt-br@25.1.2': - resolution: {integrity: sha512-7fFnqOTAJGb5RuJ4uwh9sh0JmXALuHPGOl7iL9rZkcgIuVP5y6wVDUDXq5qjiRTNSFDs7Bzh463Ir5m5D6mJbA==} - - '@codingame/monaco-vscode-language-pack-qps-ploc@25.1.2': - resolution: {integrity: sha512-IFjoqrSuPtIFWb+KlPT6PFWKszzNX+TCD9drgCV6AigvBO/xfGL3QwHB68l/DLbmDbohOz4Xdkutv20wuENAeA==} - - '@codingame/monaco-vscode-language-pack-ru@25.1.2': - resolution: {integrity: sha512-0uDAeXO+GllKUPhJzP893rlDhlFV1IwCu/515rBdcyegt48iGm/xAgj26V90hNz8hmB6EuM/7d8MFeklbiIpYA==} - - '@codingame/monaco-vscode-language-pack-tr@25.1.2': - resolution: {integrity: sha512-MJhHxDyJEiuVLQ9+jb8MnnN9lsbJOjJjMswVCeJ7v/Q/msAhq25QYUfn0DbOIzESJE1f7crffRb5e38XP8sYWA==} - - '@codingame/monaco-vscode-language-pack-zh-hans@25.1.2': - resolution: {integrity: sha512-c7MMrhnSLb59NxpAa8nVy9aIbxy4gVYrCpDMq8W380LOaXTYb7nueTrw8QJ5QbJBNi2P2KZoGkn2BlONuBtJJg==} - - '@codingame/monaco-vscode-language-pack-zh-hant@25.1.2': - resolution: {integrity: sha512-ARedFTM6JCluoPLJqkBcTJaQFdJNcN86OX6B8/NMApIPrnSIAfanMndpyilt8XjzUG6IH22cypR+DAlEjf48cA==} - - '@codingame/monaco-vscode-languages-service-override@25.1.2': - resolution: {integrity: sha512-ipuS1V3NgXDkNrj0vBcgMBFnqo+19HVsZjjFGfPFH3x0uptP9aiWWK42wtDK3Qbu4teSjHL7WnSLrmw94rplWw==} - - '@codingame/monaco-vscode-layout-service-override@25.1.2': - resolution: {integrity: sha512-SxBGcMK3RgkGtUn7ZDl7dCoyNW0CWFQ/bfSRYUY06A0IA4JNS5jq1lhof57d0WXewm+5l8w1Spr/vMsfx1c9ig==} - - '@codingame/monaco-vscode-localization-service-override@25.1.2': - resolution: {integrity: sha512-QLj62A8XDOIQW3KjsZlNxs+sfsNNHYxWMjQMwZu/y2Vw3IIHGly2Lpn4t4SFbeaBHJQJy4i5s7NpzlbF9MbEzQ==} - - '@codingame/monaco-vscode-log-service-override@25.1.2': - resolution: {integrity: sha512-OoileAUtPAJ0j3RW31DFSxtOipy0EcFq+iIXEdGvoRlsQPZJ3o9ayjf1JvCXpxUjJ3QkmvQVhXsWNUFREjEFLg==} - - '@codingame/monaco-vscode-model-service-override@25.1.2': - resolution: {integrity: sha512-MGz/eV1CxibLvnl6WzK6idUHJCXJOVepJvKM6Trkv5050vRe+f/o1TjCiG8PaznAypYqZvnwkTG0B7/OTizCpQ==} - - '@codingame/monaco-vscode-monarch-service-override@25.1.2': - resolution: {integrity: sha512-akyNHOJQRS7YHyk6kf0Encnkt+shlR+bIB84UJRUHFgSeF8s5gkDkQuFJph0YeUDWJWat+yBLUSZx2nHomdbHQ==} - - '@codingame/monaco-vscode-quickaccess-service-override@25.1.2': - resolution: {integrity: sha512-7IIrXnwHiF3w9d9p9kspEUz/LCibMLUztmRpGdZQfFtWBJw043q7rk8V1O42KdXr1hVg9IR5vfffwjy9nbiiUg==} - - '@codingame/monaco-vscode-textmate-service-override@25.1.2': - resolution: {integrity: sha512-AL0FtSQBW+1vtoXYQvUqB2hfWojpK73Kq/n6KuNXxjLF/XBJ5FpeeZDfrBfwhWPPoHuBTsaFUCQy4L8xQgbVlA==} - - '@codingame/monaco-vscode-theme-defaults-default-extension@25.1.2': - resolution: {integrity: sha512-0vTMFiC89YSDSmjFckuQBUKwRuFNtsILNO3k0PBiSLN/MW+VDItjJpiVLXC42+rUWlGgY2lYxOneGVa5slCV1w==} - - '@codingame/monaco-vscode-theme-service-override@25.1.2': - resolution: {integrity: sha512-hsTwl6YYTiheFuQMmCmiEGLIdIdgYaf8Z85XWyxe6YgPtDaYGnp0fGSOXKA9/bf0JtuynzoLKtUUfDupK/A7Tw==} - - '@codingame/monaco-vscode-view-banner-service-override@25.1.2': - resolution: {integrity: sha512-zhujHd1PQ6rRXsC2OQGrx/282G2v3lpPFl9heDFGKzpdj5119SgcW+B9p/MwJ1qF3LJpuRRgefNiQtqC/KT1eA==} - - '@codingame/monaco-vscode-view-common-service-override@25.1.2': - resolution: {integrity: sha512-4Po/YaHUvVf4VmhVCZmM2lc/flOptiWSM140bIRNpMcfH0VwihYg15CcDeu1Oc+6DaauzsG3u59GtEvlMmJ9Zw==} - - '@codingame/monaco-vscode-view-status-bar-service-override@25.1.2': - resolution: {integrity: sha512-Jp9ytLaWZ6evabTPtG3Mu3dFx+7WTIPz69BsGpl9PnU0kiSWUqQhPSob0Jz7E2qmMj0ZcNv2Wqvm6bMBu5OyrA==} - - '@codingame/monaco-vscode-view-title-bar-service-override@25.1.2': - resolution: {integrity: sha512-NVYtTAFR35NV/Fx7tSlbASicvpAjK5A14fmxF7/LJJN8ZmzhA/P3Y+UzhqOQl6/VcPV4pAMU0Z7Sicgwbn37dw==} - - '@codingame/monaco-vscode-views-service-override@25.1.2': - resolution: {integrity: sha512-LfzlztsvobdP5L5EvJ/rqSEgy5fEVmrkMqRteuhEtNGd4hnmdBoX8W7BNMBPff6d4NfCK74pGHJF57RyT4Iixg==} - - '@codingame/monaco-vscode-workbench-service-override@25.1.2': - resolution: {integrity: sha512-2LMHr+na03FhOAaXpIGmamq9hf7e4wt2kULn8NqNZRd3i+0v1tx/TSSjGhsA5EkrNrFD7CMSoXayBq8tgpCq/A==} - - '@emnapi/core@1.9.1': - resolution: {integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==} - - '@emnapi/runtime@1.9.1': - resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==} - - '@emnapi/wasi-threads@1.2.0': - resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} - - '@esbuild/aix-ppc64@0.28.1': - resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.28.1': - resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.28.1': - resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.28.1': - resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.28.1': - resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.28.1': - resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.28.1': - resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.28.1': - resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.28.1': - resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.28.1': - resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.28.1': - resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.28.1': - resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.28.1': - resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.28.1': - resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.28.1': - resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.28.1': - resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.28.1': - resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.28.1': - resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.28.1': - resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.28.1': - resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.28.1': - resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openharmony-arm64@0.28.1': - resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/sunos-x64@0.28.1': - resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.28.1': - resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.28.1': - resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.28.1': - resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@lit-labs/ssr-dom-shim@1.5.1': - resolution: {integrity: sha512-Aou5UdlSpr5whQe8AA/bZG0jMj96CoJIWbGfZ91qieWu5AWUMKw8VR/pAkQkJYvBNhmCcWnZlyyk5oze8JIqYA==} - - '@lit/reactive-element@2.1.2': - resolution: {integrity: sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==} - - '@napi-rs/wasm-runtime@1.1.6': - resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} - peerDependencies: - '@emnapi/core': ^1.7.1 - '@emnapi/runtime': ^1.7.1 - - '@oxc-project/types@0.120.0': - resolution: {integrity: sha512-k1YNu55DuvAip/MGE1FTsIuU3FUCn6v/ujG9V7Nq5Df/kX2CWb13hhwD0lmJGMGqE+bE1MXvv9SZVnMzEXlWcg==} - - '@rolldown/binding-android-arm64@1.0.0-rc.10': - resolution: {integrity: sha512-jOHxwXhxmFKuXztiu1ORieJeTbx5vrTkcOkkkn2d35726+iwhrY1w/+nYY/AGgF12thg33qC3R1LMBF5tHTZHg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [android] - - '@rolldown/binding-darwin-arm64@1.0.0-rc.10': - resolution: {integrity: sha512-gED05Teg/vtTZbIJBc4VNMAxAFDUPkuO/rAIyyxZjTj1a1/s6z5TII/5yMGZ0uLRCifEtwUQn8OlYzuYc0m70w==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [darwin] - - '@rolldown/binding-darwin-x64@1.0.0-rc.10': - resolution: {integrity: sha512-rI15NcM1mA48lqrIxVkHfAqcyFLcQwyXWThy+BQ5+mkKKPvSO26ir+ZDp36AgYoYVkqvMcdS8zOE6SeBsR9e8A==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [darwin] - - '@rolldown/binding-freebsd-x64@1.0.0-rc.10': - resolution: {integrity: sha512-XZRXHdTa+4ME1MuDVp021+doQ+z6Ei4CCFmNc5/sKbqb8YmkiJdj8QKlV3rCI0AJtAeSB5n0WGPuJWNL9p/L2w==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [freebsd] - - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.10': - resolution: {integrity: sha512-R0SQMRluISSLzFE20sPWYHVmJdDQnRyc/FzSCN72BqQmh2SOZUFG+N3/vBZpR4C6WpEUVYJLrYUXaj43sJsNLA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.10': - resolution: {integrity: sha512-Y1reMrV/o+cwpduYhJuOE3OMKx32RMYCidf14y+HssARRmhDuWXJ4yVguDg2R/8SyyGNo+auzz64LnPK9Hq6jg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.10': - resolution: {integrity: sha512-vELN+HNb2IzuzSBUOD4NHmP9yrGwl1DVM29wlQvx1OLSclL0NgVWnVDKl/8tEks79EFek/kebQKnNJkIAA4W2g==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.10': - resolution: {integrity: sha512-ZqrufYTgzxbHwpqOjzSsb0UV/aV2TFIY5rP8HdsiPTv/CuAgCRjM6s9cYFwQ4CNH+hf9Y4erHW1GjZuZ7WoI7w==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.10': - resolution: {integrity: sha512-gSlmVS1FZJSRicA6IyjoRoKAFK7IIHBs7xJuHRSmjImqk3mPPWbR7RhbnfH2G6bcmMEllCt2vQ/7u9e6bBnByg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [s390x] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.10': - resolution: {integrity: sha512-eOCKUpluKgfObT2pHjztnaWEIbUabWzk3qPZ5PuacuPmr4+JtQG4k2vGTY0H15edaTnicgU428XW/IH6AimcQw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@rolldown/binding-linux-x64-musl@1.0.0-rc.10': - resolution: {integrity: sha512-Xdf2jQbfQowJnLcgYfD/m0Uu0Qj5OdxKallD78/IPPfzaiaI4KRAwZzHcKQ4ig1gtg1SuzC7jovNiM2TzQsBXA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [musl] - - '@rolldown/binding-openharmony-arm64@1.0.0-rc.10': - resolution: {integrity: sha512-o1hYe8hLi1EY6jgPFyxQgQ1wcycX+qz8eEbVmot2hFkgUzPxy9+kF0u0NIQBeDq+Mko47AkaFFaChcvZa9UX9Q==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [openharmony] - - '@rolldown/binding-wasm32-wasi@1.0.0-rc.10': - resolution: {integrity: sha512-Ugv9o7qYJudqQO5Y5y2N2SOo6S4WiqiNOpuQyoPInnhVzCY+wi/GHltcLHypG9DEUYMB0iTB/huJrpadiAcNcA==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.10': - resolution: {integrity: sha512-7UODQb4fQUNT/vmgDZBl3XOBAIOutP5R3O/rkxg0aLfEGQ4opbCgU5vOw/scPe4xOqBwL9fw7/RP1vAMZ6QlAQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [win32] - - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.10': - resolution: {integrity: sha512-PYxKHMVHOb5NJuDL53vBUl1VwUjymDcYI6rzpIni0C9+9mTiJedvUxSk7/RPp7OOAm3v+EjgMu9bIy3N6b408w==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [win32] - - '@rolldown/pluginutils@1.0.0-rc.10': - resolution: {integrity: sha512-UkVDEFk1w3mveXeKgaTuYfKWtPbvgck1dT8TUG3bnccrH0XtLTuAyfCoks4Q/M5ZGToSVJTIQYCzy2g/atAOeg==} - - '@rollup/rollup-android-arm-eabi@4.62.2': - resolution: {integrity: sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.62.2': - resolution: {integrity: sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.62.2': - resolution: {integrity: sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.62.2': - resolution: {integrity: sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-freebsd-arm64@4.62.2': - resolution: {integrity: sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.62.2': - resolution: {integrity: sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-linux-arm-gnueabihf@4.62.2': - resolution: {integrity: sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==} - cpu: [arm] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-arm-musleabihf@4.62.2': - resolution: {integrity: sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==} - cpu: [arm] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-arm64-gnu@4.62.2': - resolution: {integrity: sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-arm64-musl@4.62.2': - resolution: {integrity: sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-loong64-gnu@4.62.2': - resolution: {integrity: sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==} - cpu: [loong64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-loong64-musl@4.62.2': - resolution: {integrity: sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==} - cpu: [loong64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-ppc64-gnu@4.62.2': - resolution: {integrity: sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-ppc64-musl@4.62.2': - resolution: {integrity: sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==} - cpu: [ppc64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-riscv64-gnu@4.62.2': - resolution: {integrity: sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==} - cpu: [riscv64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-riscv64-musl@4.62.2': - resolution: {integrity: sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==} - cpu: [riscv64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-s390x-gnu@4.62.2': - resolution: {integrity: sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==} - cpu: [s390x] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-x64-gnu@4.62.2': - resolution: {integrity: sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-x64-musl@4.62.2': - resolution: {integrity: sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==} - cpu: [x64] - os: [linux] - libc: [musl] - - '@rollup/rollup-openbsd-x64@4.62.2': - resolution: {integrity: sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==} - cpu: [x64] - os: [openbsd] - - '@rollup/rollup-openharmony-arm64@4.62.2': - resolution: {integrity: sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==} - cpu: [arm64] - os: [openharmony] - - '@rollup/rollup-win32-arm64-msvc@4.62.2': - resolution: {integrity: sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.62.2': - resolution: {integrity: sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-gnu@4.62.2': - resolution: {integrity: sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==} - cpu: [x64] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.62.2': - resolution: {integrity: sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==} - cpu: [x64] - os: [win32] - - '@tybys/wasm-util@0.10.3': - resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} - - '@types/estree@1.0.9': - resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - - '@types/trusted-types@2.0.7': - resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - - '@virustotal/yara-x@1.15.0': - resolution: {integrity: sha512-tR+Ue5ci9bURbD7/qjXY0VLVXDUP+NK/uvvgjX6UvSXN+3msfMtpAMaiCdsltFEciU+tXaZeGbHu3N07bvfjsw==} - - '@vscode/iconv-lite-umd@0.7.1': - resolution: {integrity: sha512-tK6k0DXFHW7q5+GGuGZO+phpAqpxO4WXl+BLc/8/uOk3RsM2ssAL3CQUQDb1TGfwltjsauhN6S4ghYZzs4sPFw==} - - ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} - engines: {node: '>=12'} - - ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} - engines: {node: '>=12'} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - - bundle-name@4.1.0: - resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} - engines: {node: '>=18'} - - cliui@9.0.1: - resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} - engines: {node: '>=20'} - - default-browser-id@5.0.1: - resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} - engines: {node: '>=18'} - - default-browser@5.5.0: - resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} - engines: {node: '>=18'} - - define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} - - detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} - engines: {node: '>=8'} - - dompurify@3.3.1: - resolution: {integrity: sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==} - - emoji-regex@10.6.0: - resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} - - esbuild@0.28.1: - resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} - engines: {node: '>=18'} - hasBin: true - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - fdir@6.5.0: - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} - engines: {node: '>=12.0.0'} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-east-asian-width@1.5.0: - resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} - engines: {node: '>=18'} - - is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - - is-in-ssh@1.0.0: - resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} - engines: {node: '>=20'} - - is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - - is-wsl@3.1.1: - resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} - engines: {node: '>=16'} - - jschardet@3.1.4: - resolution: {integrity: sha512-/kmVISmrwVwtyYU40iQUOp3SUPk2dhNCMsZBQX0R1/jZ8maaXJ/oZIzUOiyOqcgtLnETFKYChbJ5iDC/eWmFHg==} - engines: {node: '>=0.1.90'} - - lightningcss-android-arm64@1.32.0: - resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [android] - - lightningcss-darwin-arm64@1.32.0: - resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [darwin] - - lightningcss-darwin-x64@1.32.0: - resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [darwin] - - lightningcss-freebsd-x64@1.32.0: - resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [freebsd] - - lightningcss-linux-arm-gnueabihf@1.32.0: - resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} - engines: {node: '>= 12.0.0'} - cpu: [arm] - os: [linux] - - lightningcss-linux-arm64-gnu@1.32.0: - resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - lightningcss-linux-arm64-musl@1.32.0: - resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - libc: [musl] - - lightningcss-linux-x64-gnu@1.32.0: - resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - libc: [glibc] - - lightningcss-linux-x64-musl@1.32.0: - resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - libc: [musl] - - lightningcss-win32-arm64-msvc@1.32.0: - resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [win32] - - lightningcss-win32-x64-msvc@1.32.0: - resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [win32] - - lightningcss@1.32.0: - resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} - engines: {node: '>= 12.0.0'} - - lit-element@4.2.2: - resolution: {integrity: sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==} - - lit-html@3.3.2: - resolution: {integrity: sha512-Qy9hU88zcmaxBXcc10ZpdK7cOLXvXpRoBxERdtqV9QOrfpMZZ6pSYP91LhpPtap3sFMUiL7Tw2RImbe0Al2/kw==} - - lit@3.3.2: - resolution: {integrity: sha512-NF9zbsP79l4ao2SNrH3NkfmFgN/hBYSQo90saIVI1o5GpjAdCPVstVzO1MrLOakHoEhYkrtRjPK6Ob521aoYWQ==} - - marked@14.0.0: - resolution: {integrity: sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==} - engines: {node: '>= 18'} - hasBin: true - - minimatch@5.1.9: - resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} - engines: {node: '>=10'} - - monaco-languageclient@10.7.0: - resolution: {integrity: sha512-oA5cOFixkF4bspVL2zMSn48LvlNR/Cu3vJ8MCVam3PdjobSULGgHtOASuZIi3FgWK42X1z8/6hrG0LCjvNu1Hw==} - engines: {node: '>=20.10.0', npm: '>=10.2.3'} - - nanoid@3.3.16: - resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - open@11.0.0: - resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} - engines: {node: '>=20'} - - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} - engines: {node: '>=12'} - - picomatch@4.0.5: - resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} - engines: {node: '>=12'} - - postcss@8.5.18: - resolution: {integrity: sha512-xdB1oSLHbz1vRWgCDalrCqEFTWzFlhqFC5tIHLMOSUIjhm3XXQ1qrFy8S/ESr1JYRRXqM3c1QFiMZUJdUTqyMQ==} - engines: {node: ^10 || ^12 || >=14} - - powershell-utils@0.1.0: - resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} - engines: {node: '>=20'} - - prettier@3.8.1: - resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} - engines: {node: '>=14'} - hasBin: true - - rolldown@1.0.0-rc.10: - resolution: {integrity: sha512-q7j6vvarRFmKpgJUT8HCAUljkgzEp4LAhPlJUvQhA5LA1SUL36s5QCysMutErzL3EbNOZOkoziSx9iZC4FddKA==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - - rollup-plugin-visualizer@7.0.1: - resolution: {integrity: sha512-UJUT4+1Ho4OcWmPYU3sYXgUqI8B8Ayfe06MX7y0qCJ1K8aGoKtR/NDd/2nZqM7ADkrzny+I99Ul7GgyoiVNAgg==} - engines: {node: '>=22'} - hasBin: true - peerDependencies: - rolldown: 1.x || ^1.0.0-beta || ^1.0.0-rc - rollup: 2.x || 3.x || 4.x - peerDependenciesMeta: - rolldown: - optional: true - rollup: - optional: true - - rollup@4.62.2: - resolution: {integrity: sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - - run-applescript@7.1.0: - resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} - engines: {node: '>=18'} - - semver@7.7.4: - resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} - engines: {node: '>=10'} - hasBin: true - - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - - source-map@0.7.6: - resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} - engines: {node: '>= 12'} - - string-width@7.2.0: - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} - engines: {node: '>=18'} - - strip-ansi@7.2.0: - resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} - engines: {node: '>=12'} - - tinyglobby@0.2.17: - resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} - engines: {node: '>=12.0.0'} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - - vite@7.3.6: - resolution: {integrity: sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - jiti: '>=1.21.0' - less: ^4.0.0 - lightningcss: ^1.21.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: '>=0.54.8' - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - - vscode-jsonrpc@8.2.0: - resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} - engines: {node: '>=14.0.0'} - - vscode-jsonrpc@8.2.1: - resolution: {integrity: sha512-kdjOSJ2lLIn7r1rtrMbbNCHjyMPfRnowdKjBQ+mGq6NAW5QY2bEZC/khaC5OR8svbbjvLEaIXkOq45e2X9BIbQ==} - engines: {node: '>=14.0.0'} - - vscode-languageclient@9.0.1: - resolution: {integrity: sha512-JZiimVdvimEuHh5olxhxkht09m3JzUGwggb5eRUkzzJhZ2KjCN0nh55VfiED9oez9DyF8/fz1g1iBV3h+0Z2EA==} - engines: {vscode: ^1.82.0} - - vscode-languageserver-protocol@3.17.5: - resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} - - vscode-languageserver-types@3.17.5: - resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} - - vscode-ws-jsonrpc@3.5.0: - resolution: {integrity: sha512-13ZDy7Od4AfEPK2HIfY3DtyRi4FVsvFql1yobVJrpIoHOKGGJpIjVvIJpMxkrHzCZzWlYlg+WEu2hrYkCTvM0Q==} - engines: {node: '>=20.10.0', npm: '>=10.2.3'} - - wrap-ansi@9.0.2: - resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} - engines: {node: '>=18'} - - wsl-utils@0.3.1: - resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} - engines: {node: '>=20'} - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@22.0.0: - resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=23} - - yargs@18.0.0: - resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=23} - -snapshots: - - '@codingame/monaco-vscode-api@25.1.2': - dependencies: - '@codingame/monaco-vscode-base-service-override': 25.1.2 - '@codingame/monaco-vscode-environment-service-override': 25.1.2 - '@codingame/monaco-vscode-extensions-service-override': 25.1.2 - '@codingame/monaco-vscode-files-service-override': 25.1.2 - '@codingame/monaco-vscode-host-service-override': 25.1.2 - '@codingame/monaco-vscode-layout-service-override': 25.1.2 - '@codingame/monaco-vscode-quickaccess-service-override': 25.1.2 - '@vscode/iconv-lite-umd': 0.7.1 - dompurify: 3.3.1 - jschardet: 3.1.4 - marked: 14.0.0 - - '@codingame/monaco-vscode-base-service-override@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-bulk-edit-service-override@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-configuration-service-override@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - '@codingame/monaco-vscode-files-service-override': 25.1.2 - - '@codingame/monaco-vscode-editor-api@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-editor-service-override@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-environment-service-override@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-extension-api@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - '@codingame/monaco-vscode-extensions-service-override': 25.1.2 - - '@codingame/monaco-vscode-extensions-service-override@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - '@codingame/monaco-vscode-files-service-override': 25.1.2 - - '@codingame/monaco-vscode-files-service-override@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-host-service-override@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-keybindings-service-override@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - '@codingame/monaco-vscode-files-service-override': 25.1.2 - - '@codingame/monaco-vscode-language-pack-cs@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-language-pack-de@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-language-pack-es@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-language-pack-fr@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-language-pack-it@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-language-pack-ja@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-language-pack-ko@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-language-pack-pl@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-language-pack-pt-br@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-language-pack-qps-ploc@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-language-pack-ru@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-language-pack-tr@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-language-pack-zh-hans@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-language-pack-zh-hant@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-languages-service-override@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - '@codingame/monaco-vscode-files-service-override': 25.1.2 - - '@codingame/monaco-vscode-layout-service-override@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-localization-service-override@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-log-service-override@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - '@codingame/monaco-vscode-environment-service-override': 25.1.2 - - '@codingame/monaco-vscode-model-service-override@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-monarch-service-override@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-quickaccess-service-override@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-textmate-service-override@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - '@codingame/monaco-vscode-files-service-override': 25.1.2 - - '@codingame/monaco-vscode-theme-defaults-default-extension@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-theme-service-override@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - '@codingame/monaco-vscode-files-service-override': 25.1.2 - - '@codingame/monaco-vscode-view-banner-service-override@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-view-common-service-override@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - '@codingame/monaco-vscode-bulk-edit-service-override': 25.1.2 - - '@codingame/monaco-vscode-view-status-bar-service-override@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-view-title-bar-service-override@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - - '@codingame/monaco-vscode-views-service-override@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - '@codingame/monaco-vscode-keybindings-service-override': 25.1.2 - '@codingame/monaco-vscode-layout-service-override': 25.1.2 - '@codingame/monaco-vscode-quickaccess-service-override': 25.1.2 - '@codingame/monaco-vscode-view-common-service-override': 25.1.2 - - '@codingame/monaco-vscode-workbench-service-override@25.1.2': - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - '@codingame/monaco-vscode-keybindings-service-override': 25.1.2 - '@codingame/monaco-vscode-quickaccess-service-override': 25.1.2 - '@codingame/monaco-vscode-view-banner-service-override': 25.1.2 - '@codingame/monaco-vscode-view-common-service-override': 25.1.2 - '@codingame/monaco-vscode-view-status-bar-service-override': 25.1.2 - '@codingame/monaco-vscode-view-title-bar-service-override': 25.1.2 - - '@emnapi/core@1.9.1': - dependencies: - '@emnapi/wasi-threads': 1.2.0 - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.9.1': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/wasi-threads@1.2.0': - dependencies: - tslib: 2.8.1 - optional: true - - '@esbuild/aix-ppc64@0.28.1': - optional: true - - '@esbuild/android-arm64@0.28.1': - optional: true - - '@esbuild/android-arm@0.28.1': - optional: true - - '@esbuild/android-x64@0.28.1': - optional: true - - '@esbuild/darwin-arm64@0.28.1': - optional: true - - '@esbuild/darwin-x64@0.28.1': - optional: true - - '@esbuild/freebsd-arm64@0.28.1': - optional: true - - '@esbuild/freebsd-x64@0.28.1': - optional: true - - '@esbuild/linux-arm64@0.28.1': - optional: true - - '@esbuild/linux-arm@0.28.1': - optional: true - - '@esbuild/linux-ia32@0.28.1': - optional: true - - '@esbuild/linux-loong64@0.28.1': - optional: true - - '@esbuild/linux-mips64el@0.28.1': - optional: true - - '@esbuild/linux-ppc64@0.28.1': - optional: true - - '@esbuild/linux-riscv64@0.28.1': - optional: true - - '@esbuild/linux-s390x@0.28.1': - optional: true - - '@esbuild/linux-x64@0.28.1': - optional: true - - '@esbuild/netbsd-arm64@0.28.1': - optional: true - - '@esbuild/netbsd-x64@0.28.1': - optional: true - - '@esbuild/openbsd-arm64@0.28.1': - optional: true - - '@esbuild/openbsd-x64@0.28.1': - optional: true - - '@esbuild/openharmony-arm64@0.28.1': - optional: true - - '@esbuild/sunos-x64@0.28.1': - optional: true - - '@esbuild/win32-arm64@0.28.1': - optional: true - - '@esbuild/win32-ia32@0.28.1': - optional: true - - '@esbuild/win32-x64@0.28.1': - optional: true - - '@lit-labs/ssr-dom-shim@1.5.1': {} - - '@lit/reactive-element@2.1.2': - dependencies: - '@lit-labs/ssr-dom-shim': 1.5.1 - - '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)': - dependencies: - '@emnapi/core': 1.9.1 - '@emnapi/runtime': 1.9.1 - '@tybys/wasm-util': 0.10.3 - optional: true - - '@oxc-project/types@0.120.0': - optional: true - - '@rolldown/binding-android-arm64@1.0.0-rc.10': - optional: true - - '@rolldown/binding-darwin-arm64@1.0.0-rc.10': - optional: true - - '@rolldown/binding-darwin-x64@1.0.0-rc.10': - optional: true - - '@rolldown/binding-freebsd-x64@1.0.0-rc.10': - optional: true - - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.10': - optional: true - - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.10': - optional: true - - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.10': - optional: true - - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.10': - optional: true - - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.10': - optional: true - - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.10': - optional: true - - '@rolldown/binding-linux-x64-musl@1.0.0-rc.10': - optional: true - - '@rolldown/binding-openharmony-arm64@1.0.0-rc.10': - optional: true - - '@rolldown/binding-wasm32-wasi@1.0.0-rc.10(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)': - dependencies: - '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1) - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' - optional: true - - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.10': - optional: true - - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.10': - optional: true - - '@rolldown/pluginutils@1.0.0-rc.10': - optional: true - - '@rollup/rollup-android-arm-eabi@4.62.2': - optional: true - - '@rollup/rollup-android-arm64@4.62.2': - optional: true - - '@rollup/rollup-darwin-arm64@4.62.2': - optional: true - - '@rollup/rollup-darwin-x64@4.62.2': - optional: true - - '@rollup/rollup-freebsd-arm64@4.62.2': - optional: true - - '@rollup/rollup-freebsd-x64@4.62.2': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.62.2': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.62.2': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.62.2': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.62.2': - optional: true - - '@rollup/rollup-linux-loong64-gnu@4.62.2': - optional: true - - '@rollup/rollup-linux-loong64-musl@4.62.2': - optional: true - - '@rollup/rollup-linux-ppc64-gnu@4.62.2': - optional: true - - '@rollup/rollup-linux-ppc64-musl@4.62.2': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.62.2': - optional: true - - '@rollup/rollup-linux-riscv64-musl@4.62.2': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.62.2': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.62.2': - optional: true - - '@rollup/rollup-linux-x64-musl@4.62.2': - optional: true - - '@rollup/rollup-openbsd-x64@4.62.2': - optional: true - - '@rollup/rollup-openharmony-arm64@4.62.2': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.62.2': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.62.2': - optional: true - - '@rollup/rollup-win32-x64-gnu@4.62.2': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.62.2': - optional: true - - '@tybys/wasm-util@0.10.3': - dependencies: - tslib: 2.8.1 - optional: true - - '@types/estree@1.0.9': {} - - '@types/trusted-types@2.0.7': {} - - '@virustotal/yara-x@1.15.0': {} - - '@vscode/iconv-lite-umd@0.7.1': {} - - ansi-regex@6.2.2: {} - - ansi-styles@6.2.3: {} - - balanced-match@1.0.2: {} - - brace-expansion@2.0.2: - dependencies: - balanced-match: 1.0.2 - - bundle-name@4.1.0: - dependencies: - run-applescript: 7.1.0 - - cliui@9.0.1: - dependencies: - string-width: 7.2.0 - strip-ansi: 7.2.0 - wrap-ansi: 9.0.2 - - default-browser-id@5.0.1: {} - - default-browser@5.5.0: - dependencies: - bundle-name: 4.1.0 - default-browser-id: 5.0.1 - - define-lazy-prop@3.0.0: {} - - detect-libc@2.1.2: - optional: true - - dompurify@3.3.1: - optionalDependencies: - '@types/trusted-types': 2.0.7 - - emoji-regex@10.6.0: {} - - esbuild@0.28.1: - optionalDependencies: - '@esbuild/aix-ppc64': 0.28.1 - '@esbuild/android-arm': 0.28.1 - '@esbuild/android-arm64': 0.28.1 - '@esbuild/android-x64': 0.28.1 - '@esbuild/darwin-arm64': 0.28.1 - '@esbuild/darwin-x64': 0.28.1 - '@esbuild/freebsd-arm64': 0.28.1 - '@esbuild/freebsd-x64': 0.28.1 - '@esbuild/linux-arm': 0.28.1 - '@esbuild/linux-arm64': 0.28.1 - '@esbuild/linux-ia32': 0.28.1 - '@esbuild/linux-loong64': 0.28.1 - '@esbuild/linux-mips64el': 0.28.1 - '@esbuild/linux-ppc64': 0.28.1 - '@esbuild/linux-riscv64': 0.28.1 - '@esbuild/linux-s390x': 0.28.1 - '@esbuild/linux-x64': 0.28.1 - '@esbuild/netbsd-arm64': 0.28.1 - '@esbuild/netbsd-x64': 0.28.1 - '@esbuild/openbsd-arm64': 0.28.1 - '@esbuild/openbsd-x64': 0.28.1 - '@esbuild/openharmony-arm64': 0.28.1 - '@esbuild/sunos-x64': 0.28.1 - '@esbuild/win32-arm64': 0.28.1 - '@esbuild/win32-ia32': 0.28.1 - '@esbuild/win32-x64': 0.28.1 - - escalade@3.2.0: {} - - fdir@6.5.0(picomatch@4.0.5): - optionalDependencies: - picomatch: 4.0.5 - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-east-asian-width@1.5.0: {} - - is-docker@3.0.0: {} - - is-in-ssh@1.0.0: {} - - is-inside-container@1.0.0: - dependencies: - is-docker: 3.0.0 - - is-wsl@3.1.1: - dependencies: - is-inside-container: 1.0.0 - - jschardet@3.1.4: {} - - lightningcss-android-arm64@1.32.0: - optional: true - - lightningcss-darwin-arm64@1.32.0: - optional: true - - lightningcss-darwin-x64@1.32.0: - optional: true - - lightningcss-freebsd-x64@1.32.0: - optional: true - - lightningcss-linux-arm-gnueabihf@1.32.0: - optional: true - - lightningcss-linux-arm64-gnu@1.32.0: - optional: true - - lightningcss-linux-arm64-musl@1.32.0: - optional: true - - lightningcss-linux-x64-gnu@1.32.0: - optional: true - - lightningcss-linux-x64-musl@1.32.0: - optional: true - - lightningcss-win32-arm64-msvc@1.32.0: - optional: true - - lightningcss-win32-x64-msvc@1.32.0: - optional: true - - lightningcss@1.32.0: - dependencies: - detect-libc: 2.1.2 - optionalDependencies: - lightningcss-android-arm64: 1.32.0 - lightningcss-darwin-arm64: 1.32.0 - lightningcss-darwin-x64: 1.32.0 - lightningcss-freebsd-x64: 1.32.0 - lightningcss-linux-arm-gnueabihf: 1.32.0 - lightningcss-linux-arm64-gnu: 1.32.0 - lightningcss-linux-arm64-musl: 1.32.0 - lightningcss-linux-x64-gnu: 1.32.0 - lightningcss-linux-x64-musl: 1.32.0 - lightningcss-win32-arm64-msvc: 1.32.0 - lightningcss-win32-x64-msvc: 1.32.0 - optional: true - - lit-element@4.2.2: - dependencies: - '@lit-labs/ssr-dom-shim': 1.5.1 - '@lit/reactive-element': 2.1.2 - lit-html: 3.3.2 - - lit-html@3.3.2: - dependencies: - '@types/trusted-types': 2.0.7 - - lit@3.3.2: - dependencies: - '@lit/reactive-element': 2.1.2 - lit-element: 4.2.2 - lit-html: 3.3.2 - - marked@14.0.0: {} - - minimatch@5.1.9: - dependencies: - brace-expansion: 2.0.2 - - monaco-languageclient@10.7.0: - dependencies: - '@codingame/monaco-vscode-api': 25.1.2 - '@codingame/monaco-vscode-configuration-service-override': 25.1.2 - '@codingame/monaco-vscode-editor-api': 25.1.2 - '@codingame/monaco-vscode-editor-service-override': 25.1.2 - '@codingame/monaco-vscode-extension-api': 25.1.2 - '@codingame/monaco-vscode-extensions-service-override': 25.1.2 - '@codingame/monaco-vscode-language-pack-cs': 25.1.2 - '@codingame/monaco-vscode-language-pack-de': 25.1.2 - '@codingame/monaco-vscode-language-pack-es': 25.1.2 - '@codingame/monaco-vscode-language-pack-fr': 25.1.2 - '@codingame/monaco-vscode-language-pack-it': 25.1.2 - '@codingame/monaco-vscode-language-pack-ja': 25.1.2 - '@codingame/monaco-vscode-language-pack-ko': 25.1.2 - '@codingame/monaco-vscode-language-pack-pl': 25.1.2 - '@codingame/monaco-vscode-language-pack-pt-br': 25.1.2 - '@codingame/monaco-vscode-language-pack-qps-ploc': 25.1.2 - '@codingame/monaco-vscode-language-pack-ru': 25.1.2 - '@codingame/monaco-vscode-language-pack-tr': 25.1.2 - '@codingame/monaco-vscode-language-pack-zh-hans': 25.1.2 - '@codingame/monaco-vscode-language-pack-zh-hant': 25.1.2 - '@codingame/monaco-vscode-languages-service-override': 25.1.2 - '@codingame/monaco-vscode-localization-service-override': 25.1.2 - '@codingame/monaco-vscode-log-service-override': 25.1.2 - '@codingame/monaco-vscode-model-service-override': 25.1.2 - '@codingame/monaco-vscode-monarch-service-override': 25.1.2 - '@codingame/monaco-vscode-textmate-service-override': 25.1.2 - '@codingame/monaco-vscode-theme-defaults-default-extension': 25.1.2 - '@codingame/monaco-vscode-theme-service-override': 25.1.2 - '@codingame/monaco-vscode-views-service-override': 25.1.2 - '@codingame/monaco-vscode-workbench-service-override': 25.1.2 - vscode: '@codingame/monaco-vscode-extension-api@25.1.2' - vscode-languageclient: 9.0.1 - vscode-languageserver-protocol: 3.17.5 - vscode-ws-jsonrpc: 3.5.0 - - nanoid@3.3.16: {} - - open@11.0.0: - dependencies: - default-browser: 5.5.0 - define-lazy-prop: 3.0.0 - is-in-ssh: 1.0.0 - is-inside-container: 1.0.0 - powershell-utils: 0.1.0 - wsl-utils: 0.3.1 - - picocolors@1.1.1: {} - - picomatch@4.0.3: {} - - picomatch@4.0.5: {} - - postcss@8.5.18: - dependencies: - nanoid: 3.3.16 - picocolors: 1.1.1 - source-map-js: 1.2.1 - - powershell-utils@0.1.0: {} - - prettier@3.8.1: {} - - rolldown@1.0.0-rc.10(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1): - dependencies: - '@oxc-project/types': 0.120.0 - '@rolldown/pluginutils': 1.0.0-rc.10 - optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.10 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.10 - '@rolldown/binding-darwin-x64': 1.0.0-rc.10 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.10 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.10 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.10 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.10 - '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.10 - '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.10 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.10 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.10 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.10 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.10(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1) - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.10 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.10 - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' - optional: true - - rollup-plugin-visualizer@7.0.1(rolldown@1.0.0-rc.10(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1))(rollup@4.62.2): - dependencies: - open: 11.0.0 - picomatch: 4.0.3 - source-map: 0.7.6 - yargs: 18.0.0 - optionalDependencies: - rolldown: 1.0.0-rc.10(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1) - rollup: 4.62.2 - - rollup@4.62.2: - dependencies: - '@types/estree': 1.0.9 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.62.2 - '@rollup/rollup-android-arm64': 4.62.2 - '@rollup/rollup-darwin-arm64': 4.62.2 - '@rollup/rollup-darwin-x64': 4.62.2 - '@rollup/rollup-freebsd-arm64': 4.62.2 - '@rollup/rollup-freebsd-x64': 4.62.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.62.2 - '@rollup/rollup-linux-arm-musleabihf': 4.62.2 - '@rollup/rollup-linux-arm64-gnu': 4.62.2 - '@rollup/rollup-linux-arm64-musl': 4.62.2 - '@rollup/rollup-linux-loong64-gnu': 4.62.2 - '@rollup/rollup-linux-loong64-musl': 4.62.2 - '@rollup/rollup-linux-ppc64-gnu': 4.62.2 - '@rollup/rollup-linux-ppc64-musl': 4.62.2 - '@rollup/rollup-linux-riscv64-gnu': 4.62.2 - '@rollup/rollup-linux-riscv64-musl': 4.62.2 - '@rollup/rollup-linux-s390x-gnu': 4.62.2 - '@rollup/rollup-linux-x64-gnu': 4.62.2 - '@rollup/rollup-linux-x64-musl': 4.62.2 - '@rollup/rollup-openbsd-x64': 4.62.2 - '@rollup/rollup-openharmony-arm64': 4.62.2 - '@rollup/rollup-win32-arm64-msvc': 4.62.2 - '@rollup/rollup-win32-ia32-msvc': 4.62.2 - '@rollup/rollup-win32-x64-gnu': 4.62.2 - '@rollup/rollup-win32-x64-msvc': 4.62.2 - fsevents: 2.3.3 - - run-applescript@7.1.0: {} - - semver@7.7.4: {} - - source-map-js@1.2.1: {} - - source-map@0.7.6: {} - - string-width@7.2.0: - dependencies: - emoji-regex: 10.6.0 - get-east-asian-width: 1.5.0 - strip-ansi: 7.2.0 - - strip-ansi@7.2.0: - dependencies: - ansi-regex: 6.2.2 - - tinyglobby@0.2.17: - dependencies: - fdir: 6.5.0(picomatch@4.0.5) - picomatch: 4.0.5 - - tslib@2.8.1: - optional: true - - typescript@5.9.3: {} - - vite@7.3.6(lightningcss@1.32.0): - dependencies: - esbuild: 0.28.1 - fdir: 6.5.0(picomatch@4.0.5) - picomatch: 4.0.5 - postcss: 8.5.18 - rollup: 4.62.2 - tinyglobby: 0.2.17 - optionalDependencies: - fsevents: 2.3.3 - lightningcss: 1.32.0 - - vscode-jsonrpc@8.2.0: {} - - vscode-jsonrpc@8.2.1: {} - - vscode-languageclient@9.0.1: - dependencies: - minimatch: 5.1.9 - semver: 7.7.4 - vscode-languageserver-protocol: 3.17.5 - - vscode-languageserver-protocol@3.17.5: - dependencies: - vscode-jsonrpc: 8.2.0 - vscode-languageserver-types: 3.17.5 - - vscode-languageserver-types@3.17.5: {} - - vscode-ws-jsonrpc@3.5.0: - dependencies: - vscode-jsonrpc: 8.2.1 - - wrap-ansi@9.0.2: - dependencies: - ansi-styles: 6.2.3 - string-width: 7.2.0 - strip-ansi: 7.2.0 - - wsl-utils@0.3.1: - dependencies: - is-wsl: 3.1.1 - powershell-utils: 0.1.0 - - y18n@5.0.8: {} - - yargs-parser@22.0.0: {} - - yargs@18.0.0: - dependencies: - cliui: 9.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - string-width: 7.2.0 - y18n: 5.0.8 - yargs-parser: 22.0.0 diff --git a/playground/src/app/yara-playground-app.ts b/playground/src/app/yara-playground-app.ts index 5501a1b10..5bfa5a2a1 100644 --- a/playground/src/app/yara-playground-app.ts +++ b/playground/src/app/yara-playground-app.ts @@ -15,9 +15,16 @@ import { loadStoredPlaygroundSettings, storePlaygroundSettings, } from "../persistence/playground-settings-storage"; -import type { ExecutionState, ResultMode } from "../results/result-types"; +import type { + ExecutionState, + MatchRange, + ResultMode, +} from "../results/result-types"; import { summarizeResult } from "../results/summarize-result"; -import { createSampleHighlights } from "../sample/sample-highlights"; +import { + createSampleHighlights, + mapSampleByteRangeToEditorRange, +} from "../sample/sample-highlights"; import type { LoadedSampleFile } from "../sample/sample-file"; import { isInlineSampleMode, type SampleMode } from "../sample/sample-modes"; import { @@ -100,6 +107,12 @@ export class YaraPlaygroundApp extends LitElement { @state() private settings = createDefaultPlaygroundSettings(); + @state() + private canNavigateMatches = false; + + @state() + private activeMatchRange: MatchRange | null = null; + private scanService?: ScanService; private sampleEditorLayoutFrameId?: number; @@ -110,6 +123,7 @@ export class YaraPlaygroundApp extends LitElement { { onSampleChange: () => { this.clearSampleHighlights(); + this.invalidateMatchNavigation(); }, }, ); @@ -121,6 +135,12 @@ export class YaraPlaygroundApp extends LitElement { onStatus: (status) => { this.lspStatus = status; }, + onFormatRequest: () => { + void this.formatRule(); + }, + onRunRequest: () => { + void this.runScan(); + }, }); private readonly editorResizeController = new SplitResizeController(this, { @@ -163,6 +183,10 @@ export class YaraPlaygroundApp extends LitElement { } } + if (event.defaultPrevented) { + return; + } + if ( (event.metaKey || event.ctrlKey) && !event.shiftKey && @@ -280,10 +304,28 @@ export class YaraPlaygroundApp extends LitElement { } this.editorController.sample.setHighlights( - createSampleHighlights(raw, mode, source), + createSampleHighlights(raw, mode, source, this.activeMatchRange), ); } + private refreshCurrentSampleHighlights() { + if (!isInlineSampleMode(this.sampleMode)) { + return; + } + + const source = this.editorController.sample?.getValue(); + if (!source) { + return; + } + + this.syncSampleHighlights(this.execution.raw, this.sampleMode, source); + } + + private invalidateMatchNavigation() { + this.activeMatchRange = null; + this.canNavigateMatches = false; + } + private scheduleSampleEditorLayout() { if (!this.editorController.sample) return; @@ -384,15 +426,21 @@ export class YaraPlaygroundApp extends LitElement { this.editorController.sample?.getValue() !== input.sample.source ) { this.clearSampleHighlights(); - return; + return false; } this.syncSampleHighlights(raw, input.sample.mode, input.sample.source); + return true; } private async runScan() { if (!this.canRun) return; + const hadActiveMatchRange = this.activeMatchRange !== null; + this.invalidateMatchNavigation(); + if (hadActiveMatchRange) { + this.refreshCurrentSampleHighlights(); + } this.scanStage = "preparing"; const startedAt = performance.now(); @@ -407,7 +455,10 @@ export class YaraPlaygroundApp extends LitElement { startedAt, finishedAt, ); - this.syncScanHighlights(scanResponse.raw, input); + this.canNavigateMatches = this.syncScanHighlights( + scanResponse.raw, + input, + ); } catch (error) { if (error instanceof ScanCancelledError) { const raw = { cancelled: true }; @@ -418,6 +469,7 @@ export class YaraPlaygroundApp extends LitElement { Math.round(performance.now() - startedAt), ); this.clearSampleHighlights(); + this.invalidateMatchNavigation(); return; } @@ -432,6 +484,7 @@ export class YaraPlaygroundApp extends LitElement { await this.publishScanExecution(raw, [], startedAt, finishedAt); this.clearSampleHighlights(); + this.invalidateMatchNavigation(); } finally { this.scanStage = "idle"; } @@ -466,6 +519,7 @@ export class YaraPlaygroundApp extends LitElement { } this.clearSampleHighlights(); + this.invalidateMatchNavigation(); }; private handleSampleFileLoad = (event: CustomEvent) => { @@ -473,6 +527,7 @@ export class YaraPlaygroundApp extends LitElement { this.loadedSampleFile = event.detail; this.sampleMode = "file"; this.clearSampleHighlights(); + this.invalidateMatchNavigation(); }; private handleSampleFileClear = () => { @@ -482,12 +537,49 @@ export class YaraPlaygroundApp extends LitElement { this.sampleMode = inlineSampleMode; this.sessionController.restoreActiveSampleDraft(); this.clearSampleHighlights(); + this.invalidateMatchNavigation(); }; private handleResultModeChange = (event: CustomEvent) => { this.resultMode = event.detail; }; + private handleMatchRangeRequest = (event: CustomEvent) => { + if ( + !this.canNavigateMatches || + (this.sampleMode !== "text" && this.sampleMode !== "hex") + ) { + return; + } + + const source = this.editorController.sample?.getValue(); + if (!source) { + return; + } + + const isActiveRange = + this.activeMatchRange?.start === event.detail.start && + this.activeMatchRange.end === event.detail.end; + + if (isActiveRange) { + this.activeMatchRange = null; + this.syncSampleHighlights(this.execution.raw, this.sampleMode, source); + return; + } + + const range = mapSampleByteRangeToEditorRange( + this.sampleMode, + source, + event.detail, + ); + + if (range) { + this.activeMatchRange = event.detail; + this.syncSampleHighlights(this.execution.raw, this.sampleMode, source); + this.editorController.sample?.revealRange(range.start, range.end); + } + }; + private handleSettingsRequest = () => { this.settingsModalOpen = true; }; @@ -602,7 +694,10 @@ export class YaraPlaygroundApp extends LitElement { diff --git a/playground/src/components/yara-help-dialog.ts b/playground/src/components/yara-help-dialog.ts index 71a3f879c..a91c84d2e 100644 --- a/playground/src/components/yara-help-dialog.ts +++ b/playground/src/components/yara-help-dialog.ts @@ -158,8 +158,9 @@ export class YaraHelpDialog extends LitElement { when testing that modifier.

- Text and Hex highlight matching ranges in the editor. Hover a - highlight to see the rule, pattern, and exact byte range. + Text and Hex highlight matching ranges in the editor. Click a + match range in Summary to focus it, or hover a highlight to see + the rule, pattern, and exact byte range.

diff --git a/playground/src/components/yara-result-panel.ts b/playground/src/components/yara-result-panel.ts index 0666be30e..f3f2da89a 100644 --- a/playground/src/components/yara-result-panel.ts +++ b/playground/src/components/yara-result-panel.ts @@ -2,7 +2,11 @@ import { LitElement, html, nothing } from "lit"; import { customElement, property, state } from "lit/decorators.js"; import { classMap } from "lit/directives/class-map.js"; -import type { ExecutionState, ResultMode } from "../results/result-types"; +import type { + ExecutionState, + MatchRange, + ResultMode, +} from "../results/result-types"; import { summarizeResult } from "../results/summarize-result"; const EMPTY_EXECUTION: ExecutionState = { @@ -50,6 +54,12 @@ export class YaraResultPanel extends LitElement { @property({ attribute: false }) execution: ExecutionState = EMPTY_EXECUTION; + @property({ type: Boolean }) + canNavigateMatches = false; + + @property({ attribute: false }) + activeMatchRange: MatchRange | null = null; + @state() private copiedMode: CopyableResultMode | null = null; @@ -95,6 +105,23 @@ export class YaraResultPanel extends LitElement { ); } + private dispatchMatchRangeRequest(range: MatchRange) { + this.dispatchEvent( + new CustomEvent("match-range-request", { + detail: range, + bubbles: true, + composed: true, + }), + ); + } + + private isActiveMatchRange(range: MatchRange) { + return ( + this.activeMatchRange?.start === range.start && + this.activeMatchRange.end === range.end + ); + } + private renderStat(label: string, value: number) { return html`
@@ -154,10 +181,38 @@ export class YaraResultPanel extends LitElement { (pattern) => html`
${pattern.identifier} - ${pattern.ranges.join(", ") || - "No ranges"} +
+ ${pattern.ranges.length === 0 + ? html`No ranges` + : pattern.ranges.map((range) => { + const isActive = + this.isActiveMatchRange(range); + + return html` + + `; + })} +
`, )} diff --git a/playground/src/controllers/playground-editor-controller.ts b/playground/src/controllers/playground-editor-controller.ts index d5ca66cb6..0cf90f158 100644 --- a/playground/src/controllers/playground-editor-controller.ts +++ b/playground/src/controllers/playground-editor-controller.ts @@ -3,6 +3,7 @@ import type { ReactiveController, ReactiveControllerHost } from "lit"; import { createPlainTextEditor, createYaraEditor, + type EditorActionHandlers, type EditorHandle, } from "../editor/yara-monaco"; import type { LanguageServerStatus } from "../language-server/language-server"; @@ -10,6 +11,8 @@ import type { LanguageServerStatus } from "../language-server/language-server"; type PlaygroundEditorEvents = { onLanguageServerVersion: (version: string | null) => void; onStatus: (status: LanguageServerStatus) => void; + onFormatRequest: () => void; + onRunRequest: () => void; }; export class PlaygroundEditorController implements ReactiveController { @@ -45,8 +48,12 @@ export class PlaygroundEditorController implements ReactiveController { try { const [ruleEditor, sampleEditor] = await Promise.all([ - createYaraEditor(ruleHost, ruleSource), - createPlainTextEditor(sampleHost, sampleSource), + createYaraEditor(ruleHost, ruleSource, this.ruleEditorActions), + createPlainTextEditor( + sampleHost, + sampleSource, + this.sampleEditorActions, + ), ]); this.ruleEditor = ruleEditor; @@ -75,7 +82,11 @@ export class PlaygroundEditorController implements ReactiveController { this.events.onLanguageServerVersion(null); try { - const ruleEditor = await createYaraEditor(ruleHost, ruleSource); + const ruleEditor = await createYaraEditor( + ruleHost, + ruleSource, + this.ruleEditorActions, + ); this.ruleEditor = ruleEditor; this.events.onLanguageServerVersion(ruleEditor.languageServerVersion); this.events.onStatus("ready"); @@ -104,4 +115,17 @@ export class PlaygroundEditorController implements ReactiveController { this.ruleEditor = undefined; this.sampleEditor = undefined; } + + private get ruleEditorActions(): EditorActionHandlers { + return { + onFormatRequest: this.events.onFormatRequest, + onRunRequest: this.events.onRunRequest, + }; + } + + private get sampleEditorActions(): EditorActionHandlers { + return { + onRunRequest: this.events.onRunRequest, + }; + } } diff --git a/playground/src/editor/yara-monaco.ts b/playground/src/editor/yara-monaco.ts index bc6c7b4a1..365767fcc 100644 --- a/playground/src/editor/yara-monaco.ts +++ b/playground/src/editor/yara-monaco.ts @@ -77,15 +77,22 @@ export type EditorHandle = { layout: () => void; setHighlights: (highlights: EditorHighlight[]) => void; clearHighlights: () => void; + revealRange: (start: number, end: number) => boolean; onDidChangeValue: (listener: () => void) => { dispose: () => void }; format: () => Promise; dispose: () => void; }; +export type EditorActionHandlers = { + onFormatRequest?: () => void; + onRunRequest?: () => void; +}; + export type EditorHighlight = { start: number; end: number; hoverMessage?: string; + isActive?: boolean; }; let vscodeApiInitPromise: Promise | undefined; @@ -272,21 +279,25 @@ async function createYaraLanguageClient() { return { languageServerVersion: client.initializeResult?.serverInfo?.version ?? null, dispose: () => { - void client.stop().catch((error) => { - console.error("failed to stop yara-x language client", error); - }); - worker.terminate(); + void client + .stop() + .catch((error) => { + console.error("failed to stop yara-x language client", error); + }) + .finally(() => { + worker.terminate(); + }); }, }; } function buildEditor( element: HTMLElement, - model: unknown, + model: monaco.editor.ITextModel, options: monaco.editor.IStandaloneEditorConstructionOptions, ): monaco.editor.IStandaloneCodeEditor { return monaco.editor.create(element, { - model: model as never, + model, automaticLayout: true, colorDecorators: false, fixedOverflowWidgets: true, @@ -302,21 +313,45 @@ function buildEditor( }); } -function registerYaraEditorActions( +function registerEditorActions( editor: monaco.editor.IStandaloneCodeEditor, + handlers: EditorActionHandlers, ) { - return editor.addAction({ - id: "yara-x.format-document", - label: "Format YARA document", - keybindings: [ - monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS, - monaco.KeyMod.CtrlCmd | monaco.KeyMod.Shift | monaco.KeyCode.KeyF, - ], - run: async () => { - const action = editor.getAction("editor.action.formatDocument"); - await action?.run(); + const actions: monaco.IDisposable[] = []; + const { onFormatRequest, onRunRequest } = handlers; + + if (onFormatRequest) { + actions.push( + editor.addAction({ + id: "yara-x.format-document", + label: "Format YARA document", + keybindings: [ + monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS, + monaco.KeyMod.CtrlCmd | monaco.KeyMod.Shift | monaco.KeyCode.KeyF, + ], + run: onFormatRequest, + }), + ); + } + + if (onRunRequest) { + actions.push( + editor.addAction({ + id: "yara-x.run-scan", + label: "Run YARA rule", + keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter], + run: onRunRequest, + }), + ); + } + + return { + dispose: () => { + for (const action of actions) { + action.dispose(); + } }, - }); + }; } function toHandle( @@ -338,36 +373,75 @@ function toHandle( if (!model) { decorations.clear(); + editor + .getDomNode() + ?.parentElement?.classList.remove("has-active-match"); return; } - decorations.set( - highlights - .filter((highlight) => highlight.end > highlight.start) - .map((highlight) => { - const start = model.getPositionAt(highlight.start); - const end = model.getPositionAt(highlight.end); - - return { - range: { - startLineNumber: start.lineNumber, - startColumn: start.column, - endLineNumber: end.lineNumber, - endColumn: end.column, - }, - options: { - inlineClassName: "sample-match-highlight", - hoverMessage: highlight.hoverMessage - ? { - value: highlight.hoverMessage, - } - : undefined, - }, - }; - }), + const nextDecorations: monaco.editor.IModelDeltaDecoration[] = []; + let hasActiveMatch = false; + + for (const highlight of highlights) { + if (highlight.end <= highlight.start) { + continue; + } + + const start = model.getPositionAt(highlight.start); + const end = model.getPositionAt(highlight.end); + + if (highlight.isActive === true) { + hasActiveMatch = true; + } + + nextDecorations.push({ + range: { + startLineNumber: start.lineNumber, + startColumn: start.column, + endLineNumber: end.lineNumber, + endColumn: end.column, + }, + options: { + inlineClassName: highlight.isActive + ? "sample-match-highlight is-active" + : "sample-match-highlight", + hoverMessage: highlight.hoverMessage + ? { + value: highlight.hoverMessage, + } + : undefined, + }, + }); + } + + editor + .getDomNode() + ?.parentElement?.classList.toggle("has-active-match", hasActiveMatch); + decorations.set(nextDecorations); + }, + clearHighlights: () => { + decorations.clear(); + editor.getDomNode()?.parentElement?.classList.remove("has-active-match"); + }, + revealRange: (start, end) => { + const model = editor.getModel(); + + if (!model || start < 0 || end <= start) { + return false; + } + + const startPosition = model.getPositionAt(start); + const endPosition = model.getPositionAt(end); + const range = new monaco.Range( + startPosition.lineNumber, + startPosition.column, + endPosition.lineNumber, + endPosition.column, ); + + editor.revealRangeInCenter(range, monaco.editor.ScrollType.Smooth); + return true; }, - clearHighlights: () => decorations.clear(), onDidChangeValue: (listener) => editor.onDidChangeModelContent(() => { listener(); @@ -390,6 +464,7 @@ function toHandle( export async function createYaraEditor( element: HTMLElement, initialValue: string, + actionHandlers: EditorActionHandlers, ): Promise { await ensureVscodeApi(); registerYaraLanguage(); @@ -405,14 +480,14 @@ export async function createYaraEditor( tabSize: 2, insertSpaces: true, }); - const editorAction = registerYaraEditorActions(editor); + const editorActions = registerEditorActions(editor, actionHandlers); const languageClient = await createYaraLanguageClient(); return toHandle( editor, modelRef, () => { - editorAction.dispose(); + editorActions.dispose(); languageClient.dispose(); }, languageClient.languageServerVersion, @@ -422,6 +497,7 @@ export async function createYaraEditor( export async function createPlainTextEditor( element: HTMLElement, initialValue: string, + actionHandlers: EditorActionHandlers, ): Promise { await ensureVscodeApi(); @@ -440,6 +516,7 @@ export async function createPlainTextEditor( quickSuggestions: false, suggestOnTriggerCharacters: false, }); + const editorActions = registerEditorActions(editor, actionHandlers); - return toHandle(editor, modelRef); + return toHandle(editor, modelRef, () => editorActions.dispose()); } diff --git a/playground/src/results/result-types.ts b/playground/src/results/result-types.ts index 5ed723980..f4c782939 100644 --- a/playground/src/results/result-types.ts +++ b/playground/src/results/result-types.ts @@ -11,7 +11,12 @@ export type ResultTone = export type PatternSummary = { identifier: string; hits: number; - ranges: string[]; + ranges: MatchRange[]; +}; + +export type MatchRange = { + start: number; + end: number; }; export type RuleSummary = { diff --git a/playground/src/results/summarize-result.ts b/playground/src/results/summarize-result.ts index 7d56dca4d..f3372ef3b 100644 --- a/playground/src/results/summarize-result.ts +++ b/playground/src/results/summarize-result.ts @@ -1,5 +1,9 @@ -import type { ResultSummary, RuleSummary } from "./result-types"; -import { normalizeScanResult, type ScanResultRule } from "./scan-result"; +import type { MatchRange, ResultSummary, RuleSummary } from "./result-types"; +import { + normalizeScanResult, + type ScanResultMatch, + type ScanResultRule, +} from "./scan-result"; import { asRecord } from "../validation/guards"; function formatIssue(value: unknown): string { @@ -17,19 +21,24 @@ function formatIssue(value: unknown): string { } } -function formatRange(start: number | null, end: number | null): string | null { - if (start === null || end === null) { +function summarizeRange(match: ScanResultMatch): MatchRange | null { + if (match.start === null || match.end === null) { return null; } - return `${start}-${end}`; + return { + start: match.start, + end: match.end, + }; +} + +function isMatchRange(range: MatchRange | null): range is MatchRange { + return range !== null; } function summarizeRule(rule: ScanResultRule): RuleSummary { const patterns = rule.patterns.map((pattern) => { - const ranges = pattern.matches - .map((match) => formatRange(match.start, match.end)) - .filter((value): value is string => Boolean(value)); + const ranges = pattern.matches.map(summarizeRange).filter(isMatchRange); return { identifier: pattern.identifier, diff --git a/playground/src/sample/sample-highlights.ts b/playground/src/sample/sample-highlights.ts index 5914d3e25..01a05a64b 100644 --- a/playground/src/sample/sample-highlights.ts +++ b/playground/src/sample/sample-highlights.ts @@ -1,4 +1,5 @@ import type { EditorHighlight } from "../editor/yara-monaco"; +import type { MatchRange } from "../results/result-types"; import { normalizeScanResult } from "../results/scan-result"; import type { InlineSampleMode } from "./sample-modes"; @@ -13,6 +14,11 @@ type HighlightOffsets = { end: number | null; }; +export type SampleEditorRange = { + start: number; + end: number; +}; + type TextBoundary = { byteOffset: number; highlightIndex: number; @@ -200,19 +206,28 @@ function isEditorHighlight( function toEditorHighlights( highlights: ByteHighlight[], offsets: HighlightOffsets[], + activeRange: MatchRange | null, ): EditorHighlight[] { return highlights .map((highlight, index) => { - const { start, end } = offsets[index]!; - - if (start == null || end == null || end <= start) { + const offset = offsets[index]; + + if ( + offset == null || + offset.start == null || + offset.end == null || + offset.end <= offset.start + ) { return null; } return { - start, - end, + start: offset.start, + end: offset.end, hoverMessage: highlight.labels.join("\n"), + isActive: + activeRange?.start === highlight.start && + activeRange?.end === highlight.end, }; }) .filter(isEditorHighlight); @@ -307,25 +322,63 @@ function mapHexHighlightOffsets( return offsets; } -export function createSampleHighlights( - raw: unknown, +function mapHighlightOffsets( mode: InlineSampleMode, source: string, -): EditorHighlight[] { - const highlights = extractByteHighlights(raw); - + highlights: ByteHighlight[], +): HighlightOffsets[] { switch (mode) { case "text": - return toEditorHighlights( - highlights, - mapTextHighlightOffsets(source, highlights), - ); + return mapTextHighlightOffsets(source, highlights); case "hex": - return toEditorHighlights( - highlights, - mapHexHighlightOffsets(source, highlights), - ); + return mapHexHighlightOffsets(source, highlights); case "base64": return []; } } + +export function mapSampleByteRangeToEditorRange( + mode: InlineSampleMode, + source: string, + range: { start: number; end: number }, +): SampleEditorRange | null { + if (range.start < 0 || range.end <= range.start) { + return null; + } + + const [offsets] = mapHighlightOffsets(mode, source, [ + { ...range, labels: [] }, + ]); + + if ( + offsets?.start == null || + offsets.end == null || + offsets.end <= offsets.start + ) { + return null; + } + + return { + start: offsets.start, + end: offsets.end, + }; +} + +export function createSampleHighlights( + raw: unknown, + mode: InlineSampleMode, + source: string, + activeRange: MatchRange | null = null, +): EditorHighlight[] { + if (mode === "base64") { + return []; + } + + const highlights = extractByteHighlights(raw); + + return toEditorHighlights( + highlights, + mapHighlightOffsets(mode, source, highlights), + activeRange, + ); +} diff --git a/playground/src/styles/playground.css b/playground/src/styles/playground.css index 9c2a7d67b..5c99d62d6 100644 --- a/playground/src/styles/playground.css +++ b/playground/src/styles/playground.css @@ -1270,6 +1270,20 @@ yara-help-dialog { border-radius: 3px; } +.sample-editor.has-active-match + .view-line + > span + > span:not(.sample-match-highlight) { + opacity: 0.15; +} + +.sample-editor.has-active-match .sample-match-highlight:not(.is-active) { + animation: none; + background-color: rgba(146, 242, 223, 0.06); + background-image: none; + box-shadow: inset 0 0 0 1px rgba(146, 242, 223, 0.14); +} + @keyframes sample-match-sweep { 0% { background-position: 130% 0; @@ -1473,6 +1487,49 @@ yara-help-dialog { border: 1px solid rgba(134, 170, 249, 0.08); } +.match-range-list { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + gap: 6px; +} + +.match-range-button { + appearance: none; + border: 1px solid rgba(134, 170, 249, 0.18); + border-radius: 999px; + padding: 0.26rem 0.52rem; + background: rgba(134, 170, 249, 0.07); + color: #86aaf9; + font-family: "IBM Plex Mono", ui-monospace, monospace; + font-size: 0.76rem; + line-height: 1; + cursor: pointer; + transition: + background 160ms ease, + border-color 160ms ease, + color 160ms ease; +} + +.match-range-button:hover:not(:disabled), +.match-range-button:focus-visible { + border-color: rgba(146, 242, 223, 0.5); + background: rgba(146, 242, 223, 0.12); + color: #d8fff4; + outline: 0; +} + +.match-range-button.is-active { + border-color: rgba(146, 242, 223, 0.5); + background: rgba(146, 242, 223, 0.12); + color: #d8fff4; +} + +.match-range-button:disabled { + opacity: 1; + cursor: default; +} + .token-row { flex-wrap: wrap; margin-top: 12px;