diff --git a/README.md b/README.md index 17b708b..36aacfe 100644 --- a/README.md +++ b/README.md @@ -8,11 +8,11 @@

Repository - + + Releases - + + Discussions - + + Marketplace

@@ -22,25 +22,199 @@
-## Extension +## Features -This icon theme is heavily inspired by the latest modern trends and follows an ultra-minimalistic style. Also, the project is built with TypeScript under the hood so it can be very easily extended in dev mode. +- Adds minimalistic modern style +- Dynamically infers colors based on state +- Allows additional customization via options +- Provides special commands ## Installation ### Marketplace -Search for `Hypernym Icons` in the official VSCode Marketplace and install the extension. +Install [Hypernym Icons](https://marketplace.visualstudio.com/items?itemName=hypernym-studio.hypernym-icons) extension from the official VSCode Marketplace. ### Manual +If necessary, the extension can be installed manually (optional). + 1. Download the [latest version](https://github.com/hypernym-studio/vscode-icons/releases/latest) of the extension. -2. Open the Command Palette dropdown (⇧⌘P). +2. Open the **Command Palette** dropdown (**⇧⌘P**). - Run the `Extensions: Install from VSIX` command. - Select previously downloaded `.vsix` extension file. 3. After installation, simply activate the extension. -Read the official guide to learn more about manual installation. +Read the official VSCode guide to learn more about manual installation. + +## Options + +Extension provides a configuration system that allows additional customization such as changing the color, opacity and size of icons. + +All options are optional and will fall back to defaults if not specified. + +See the official VSCode settings section for more info. + +### Explorer Arrows + +- Type: `boolean` +- Default: `true` + +Specifies the visibility of the Explorer arrows. + +```ts +// settings.json + +{ + "hypernym-icons.hidesExplorerArrows": true +} +``` + +### Folder Color + +- Type: `string` +- Default: `undefined` + +Specifies a custom color for folder icons. Accepts valid HEX color format. + +```ts +// settings.json + +{ + "hypernym-icons.folders.color": "#fff" // #fff, #ffffff, #ffffff66 +} +``` + +### Folder Opacity + +- Type: `string` +- Default: `undefined` + +Specifies a custom opacity for folder icons. Accepts a percentage size format. + +```ts +// settings.json + +{ + "hypernym-icons.folders.opacity": "60%" // 0-100% +} +``` + +### Folder Size + +- Type: `string` +- Default: `undefined` + +Specifies a custom size for folder icons. Accepts a percentage size format. + +```ts +// settings.json + +{ + "hypernym-icons.folders.size": "130%" +} +``` + +### Icon Color + +- Type: `string` +- Default: `undefined` + +Specifies a custom color for all icons. Accepts valid HEX color format. + +```ts +// settings.json + +{ + "hypernym-icons.icons.color": "#fff" // #fff, #ffffff, #ffffff66 +} +``` + +### Icon Opacity + +- Type: `string` +- Default: `undefined` + +Specifies a custom opacity for all icons. Accepts a percentage size format. + +```ts +// settings.json + +{ + "hypernym-icons.icons.opacity": "60%" // 0-100% +} +``` + +### Icon Size + +- Type: `string` +- Default: `undefined` + +Specifies a custom size for all icons. Accepts a percentage size format. + +```ts +// settings.json + +{ + "hypernym-icons.icons.size": "130%" +} +``` + +## Commands + +Extension includes a set of specific `commands` that can simplify customization. + +1. Open the **Command Palette** dropdown (**⇧⌘P**). +2. Type `Hypernym Icons` to see a list of all available commands. +3. Run the selected command. + +See the official VSCode commands section for more info. + +### Toggle Explorer Arrows + +- Command: `Hypernym Icons: Toggle Explorer Arrows` + +Specifies the visibility of the explorer arrows. + +### Set Folder Color + +- Command: `Hypernym Icons: Set Folder Color` + +Specifies a custom color for folder icons. Accepts valid HEX color format. + +### Set Folder Opacity + +- Command: `Hypernym Icons: Set Folder Opacity` + +Specifies a custom opacity for folder icons. Accepts a percentage size format. + +### Set Folder Size + +- Command: `Hypernym Icons: Set Folder Size` + +Specifies a custom size for folder icons. Accepts a percentage size format. + +### Set Icon Color + +- Command: `Hypernym Icons: Set Icon Color` + +Specifies a custom color for all icons. Accepts valid HEX color format. + +### Set Icon Opacity + +- Command: `Hypernym Icons: Set Icon Opacity` + +Specifies a custom opacity for all icons. Accepts a percentage size format. + +### Set Icon Size + +- Command: `Hypernym Icons: Set Icon Size` + +Specifies a custom size for all icons. Accepts a percentage size format. + +### Reset Commands + +It is also possible to reset settings via commands if they are input type. Simply select a command, type `default` and run it. This will reset the option to its default value. ## Community diff --git a/icons/10_info.svg b/icons/10_info.svg deleted file mode 100644 index f41d4a4..0000000 --- a/icons/10_info.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/icons/11_json.svg b/icons/11_json.svg deleted file mode 100644 index 9532351..0000000 --- a/icons/11_json.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/icons/12_style.svg b/icons/12_style.svg deleted file mode 100644 index 03d71b1..0000000 --- a/icons/12_style.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/icons/13_terminal.svg b/icons/13_terminal.svg deleted file mode 100644 index 5ccadf2..0000000 --- a/icons/13_terminal.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/icons/14_verified.svg b/icons/14_verified.svg deleted file mode 100644 index 68392c9..0000000 --- a/icons/14_verified.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/icons/1_config.svg b/icons/1_config.svg deleted file mode 100644 index 7b997e6..0000000 --- a/icons/1_config.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/icons/2_copyright.svg b/icons/2_copyright.svg deleted file mode 100644 index 1823ca6..0000000 --- a/icons/2_copyright.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/icons/3_file.svg b/icons/3_file.svg deleted file mode 100644 index 55b29e3..0000000 --- a/icons/3_file.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/icons/4_folder.svg b/icons/4_folder.svg deleted file mode 100644 index fc65daf..0000000 --- a/icons/4_folder.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/icons/5_folder-open.svg b/icons/5_folder-open.svg deleted file mode 100644 index ec3b01b..0000000 --- a/icons/5_folder-open.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/icons/6_font.svg b/icons/6_font.svg deleted file mode 100644 index 0d9e9a4..0000000 --- a/icons/6_font.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/icons/7_hidden.svg b/icons/7_hidden.svg deleted file mode 100644 index f2389d6..0000000 --- a/icons/7_hidden.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/icons/8_html.svg b/icons/8_html.svg deleted file mode 100644 index 093278a..0000000 --- a/icons/8_html.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/icons/9_image.svg b/icons/9_image.svg deleted file mode 100644 index 3194607..0000000 --- a/icons/9_image.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/package.json b/package.json index 4499b95..8611e8d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hypernym-icons", - "version": "1.4.1", + "version": "1.5.0", "author": "Hypernym Studio", "description": "An ultra-minimalistic VSCode icon set for modern devs.", "license": "Apache-2.0", @@ -10,6 +10,10 @@ "type": "module", "private": true, "homepage": "https://github.com/hypernym-studio/vscode-icons", + "funding": "https://github.com/sponsors/ivodolenc", + "sponsor": { + "url": "https://github.com/sponsors/ivodolenc" + }, "repository": { "type": "git", "url": "https://github.com/hypernym-studio/vscode-icons" @@ -42,31 +46,120 @@ "color": "#0d0d0d", "theme": "dark" }, + "main": "./dist/extension/index.cjs", + "activationEvents": [ + "onStartupFinished" + ], "contributes": { "iconThemes": [ { "id": "hypernym-icons", "label": "Hypernym Icons", - "path": "./dist/extension.json" + "path": "./dist/hypernym-icons.json" + } + ], + "configuration": { + "title": "Hypernym Icons", + "properties": { + "hypernym-icons.hidesExplorerArrows": { + "order": 1, + "type": "boolean", + "default": true, + "markdownDescription": "Specifies the visibility of the explorer arrows. \n\n Default: `true`" + }, + "hypernym-icons.folders.color": { + "order": 2, + "type": "string", + "default": "", + "markdownDescription": "Specifies a custom color for folder icons. Accepts valid HEX color format. \n\n Default: `undefined` \n\n Example: `#fff`, `#ffffff`, `#ffffff33`" + }, + "hypernym-icons.folders.opacity": { + "order": 3, + "type": "string", + "default": "", + "markdownDescription": "Specifies a custom opacity for folder icons. Accepts a percentage size format. \n\n Default: `undefined` \n\n Example: `60%`" + }, + "hypernym-icons.folders.size": { + "order": 4, + "type": "string", + "default": "", + "markdownDescription": "Specifies a custom size for folder icons. Accepts a percentage size format. \n\n Default: `undefined` \n\n Example: `130%`" + }, + "hypernym-icons.icons.color": { + "order": 5, + "type": "string", + "default": "", + "markdownDescription": "Specifies a custom color for all icons. Accepts valid HEX color format. \n\n Default: `undefined` \n\n Example: `#fff`, `#ffffff`, `#ffffff33`" + }, + "hypernym-icons.icons.opacity": { + "order": 6, + "type": "string", + "default": "", + "markdownDescription": "Specifies a custom opacity for all icons. Accepts a percentage size format. \n\n Default: `undefined` \n\n Example: `60%`" + }, + "hypernym-icons.icons.size": { + "order": 7, + "type": "string", + "default": "", + "markdownDescription": "Specifies a custom size for all icons. Accepts a percentage size format. \n\n Default: `undefined` \n\n Example: `130%`" + } + } + }, + "commands": [ + { + "category": "Hypernym Icons", + "command": "hypernym-icons.toggleExplorerArrows", + "title": "Toggle Explorer Arrows" + }, + { + "category": "Hypernym Icons", + "command": "hypernym-icons.setFolderColor", + "title": "Set Folder Color" + }, + { + "category": "Hypernym Icons", + "command": "hypernym-icons.setFolderOpacity", + "title": "Set Folder Opacity" + }, + { + "category": "Hypernym Icons", + "command": "hypernym-icons.setFolderSize", + "title": "Set Folder Size" + }, + { + "category": "Hypernym Icons", + "command": "hypernym-icons.setIconColor", + "title": "Set Icon Color" + }, + { + "category": "Hypernym Icons", + "command": "hypernym-icons.setIconOpacity", + "title": "Set Icon Opacity" + }, + { + "category": "Hypernym Icons", + "command": "hypernym-icons.setIconSize", + "title": "Set Icon Size" } ] }, "scripts": { - "dev": "pnpm build:start && bun run --watch ./src/extension.ts", - "build:start": "bun run ./src/utils/build-start.ts", - "build": "pnpm build:start && bun run ./src/extension.ts", - "export": "pnpm build && vsce package --no-dependencies", + "build:static": "bun run ./scripts/build-static.ts", + "build:theme": "bun run ./scripts/build-theme.ts", + "build:bundle": "bun run ./scripts/build-bundle.ts", + "build:all": "pnpm build:static && pnpm build:theme && pnpm build:bundle", "export:list": "vsce ls --tree --no-dependencies", - "publish": "pnpm build && vsce publish --no-dependencies", + "export:extension": "pnpm build:static && pnpm build:theme && pnpm build:bundle --production && vsce package --no-dependencies", + "publish:extension": "pnpm build:static && pnpm build:theme && pnpm build:bundle --production && vsce publish --no-dependencies", + "dev": "pnpm build:static && pnpm build:theme && bun run ./scripts/build-watch.ts", "lint": "eslint .", "lint:fix": "eslint --fix .", - "format": "prettier --write .", - "replace": "bun run ./scripts/replace.ts" + "format": "prettier --write ." }, "sideEffects": false, - "packageManager": "pnpm@9.10.0", + "packageManager": "pnpm@9.12.2", "engines": { - "vscode": ">=1.69.0", + "vscode": "^1.94.0", "node": ">=20.0.0", "pnpm": ">=9.0.0" }, @@ -83,15 +176,16 @@ } }, "devDependencies": { - "@hypernym/eslint-config": "^3.5.0", + "@hypernym/eslint-config": "^3.5.1", "@hypernym/prettier-config": "^3.2.0", "@hypernym/tsconfig": "^2.4.0", - "@hypernym/utils": "^3.3.0", - "@types/node": "^22.5.5", - "@vscode/vsce": "^3.1.0", - "eslint": "^9.10.0", - "fast-glob": "^3.3.2", + "@hypernym/utils": "^3.4.0", + "@types/node": "^22.7.7", + "@types/vscode": "^1.94.0", + "@vscode/vsce": "^3.2.0", + "esbuild": "^0.24.0", + "eslint": "^9.13.0", "prettier": "^3.3.3", - "typescript": "^5.6.2" + "typescript": "^5.6.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ed3759c..6a242fd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,48 +9,47 @@ importers: .: devDependencies: '@hypernym/eslint-config': - specifier: ^3.5.0 - version: 3.5.0(eslint@9.10.0)(typescript@5.6.2) + specifier: ^3.5.1 + version: 3.5.1(eslint@9.13.0)(typescript@5.6.3) '@hypernym/prettier-config': specifier: ^3.2.0 version: 3.2.0(prettier@3.3.3) '@hypernym/tsconfig': specifier: ^2.4.0 - version: 2.4.0(@types/node@22.5.5)(typescript@5.6.2) + version: 2.4.0(@types/node@22.7.7)(typescript@5.6.3) '@hypernym/utils': - specifier: ^3.3.0 - version: 3.3.0(@types/node@22.5.5)(typescript@5.6.2) + specifier: ^3.4.0 + version: 3.4.0(@types/node@22.7.7)(typescript@5.6.3) '@types/node': - specifier: ^22.5.5 - version: 22.5.5 + specifier: ^22.7.7 + version: 22.7.7 + '@types/vscode': + specifier: ^1.94.0 + version: 1.94.0 '@vscode/vsce': - specifier: ^3.1.0 - version: 3.1.0 + specifier: ^3.2.0 + version: 3.2.0 + esbuild: + specifier: ^0.24.0 + version: 0.24.0 eslint: - specifier: ^9.10.0 - version: 9.10.0 - fast-glob: - specifier: ^3.3.2 - version: 3.3.2 + specifier: ^9.13.0 + version: 9.13.0 prettier: specifier: ^3.3.3 version: 3.3.3 typescript: - specifier: ^5.6.2 - version: 5.6.2 + specifier: ^5.6.3 + version: 5.6.3 packages: - '@azure/abort-controller@1.1.0': - resolution: {integrity: sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==} - engines: {node: '>=12.0.0'} - '@azure/abort-controller@2.1.2': resolution: {integrity: sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==} engines: {node: '>=18.0.0'} - '@azure/core-auth@1.8.0': - resolution: {integrity: sha512-YvFMowkXzLbXNM11yZtVLhUCmuG0ex7JKOH366ipjmHBhL3vpDcPAeWF+jf0X+jVXwFqo3UhsWUq4kH0ZPdu/g==} + '@azure/core-auth@1.9.0': + resolution: {integrity: sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw==} engines: {node: '>=18.0.0'} '@azure/core-client@1.9.2': @@ -61,34 +60,178 @@ packages: resolution: {integrity: sha512-62Vv8nC+uPId3j86XJ0WI+sBf0jlqTqPUFCBNrGtlaUeQUIXWV/D8GE5A1d+Qx8H7OQojn2WguC8kChD6v0shA==} engines: {node: '>=18.0.0'} - '@azure/core-tracing@1.1.2': - resolution: {integrity: sha512-dawW9ifvWAWmUm9/h+/UQ2jrdvjCJ7VJEuCJ6XVNudzcOwm53BFZH4Q845vjfgoUAM8ZxokvVNxNxAITc502YA==} + '@azure/core-tracing@1.2.0': + resolution: {integrity: sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg==} engines: {node: '>=18.0.0'} - '@azure/core-util@1.10.0': - resolution: {integrity: sha512-dqLWQsh9Nro1YQU+405POVtXnwrIVqPyfUzc4zXCbThTg7+vNNaiMkwbX9AMXKyoFYFClxmB3s25ZFr3+jZkww==} + '@azure/core-util@1.11.0': + resolution: {integrity: sha512-DxOSLua+NdpWoSqULhjDyAZTXFdP/LKkqtYuxxz1SCN289zk3OG8UOpnCQAz/tygyACBtWp/BoO72ptK7msY8g==} engines: {node: '>=18.0.0'} - '@azure/identity@4.4.1': - resolution: {integrity: sha512-DwnG4cKFEM7S3T+9u05NstXU/HN0dk45kPOinUyNKsn5VWwpXd9sbPKEg6kgJzGbm1lMuhx9o31PVbCtM5sfBA==} + '@azure/identity@4.5.0': + resolution: {integrity: sha512-EknvVmtBuSIic47xkOqyNabAme0RYTw52BTMz8eBgU1ysTyMrD1uOoM+JdS0J/4Yfp98IBT3osqq3BfwSaNaGQ==} engines: {node: '>=18.0.0'} '@azure/logger@1.1.4': resolution: {integrity: sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ==} engines: {node: '>=18.0.0'} - '@azure/msal-browser@3.23.0': - resolution: {integrity: sha512-+QgdMvaeEpdtgRTD7AHHq9aw8uga7mXVHV1KshO1RQ2uI5B55xJ4aEpGlg/ga3H+0arEVcRfT4ZVmX7QLXiCVw==} + '@azure/msal-browser@3.26.1': + resolution: {integrity: sha512-y78sr9g61aCAH9fcLO1um+oHFXc1/5Ap88RIsUSuzkm0BHzFnN+PXGaQeuM1h5Qf5dTnWNOd6JqkskkMPAhh7Q==} engines: {node: '>=0.8.0'} - '@azure/msal-common@14.14.2': - resolution: {integrity: sha512-XV0P5kSNwDwCA/SjIxTe9mEAsKB0NqGNSuaVrkCCE2lAyBr/D6YtD80Vkdp4tjWnPFwjzkwldjr1xU/facOJog==} + '@azure/msal-common@14.15.0': + resolution: {integrity: sha512-ImAQHxmpMneJ/4S8BRFhjt1MZ3bppmpRPYYNyzeQPeFN288YKbb8TmmISQEbtfkQ1BPASvYZU5doIZOPBAqENQ==} engines: {node: '>=0.8.0'} - '@azure/msal-node@2.13.1': - resolution: {integrity: sha512-sijfzPNorKt6+9g1/miHwhj6Iapff4mPQx1azmmZExgzUROqWTM1o3ACyxDja0g47VpowFy/sxTM/WsuCyXTiw==} + '@azure/msal-node@2.15.0': + resolution: {integrity: sha512-gVPW8YLz92ZeCibQH2QUw96odJoiM3k/ZPH3f2HxptozmH6+OnyyvKXo/Egg39HAM230akarQKHf0W74UHlh0Q==} engines: {node: '>=16'} + '@esbuild/aix-ppc64@0.24.0': + resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.24.0': + resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.24.0': + resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.24.0': + resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.24.0': + resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.24.0': + resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.24.0': + resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.24.0': + resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.24.0': + resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.24.0': + resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.24.0': + resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.24.0': + resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.24.0': + resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.24.0': + resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.24.0': + resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.24.0': + resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.24.0': + resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.24.0': + resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.24.0': + resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.24.0': + resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.24.0': + resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.24.0': + resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.24.0': + resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.24.0': + resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -103,32 +246,44 @@ packages: resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@0.7.0': + resolution: {integrity: sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@3.1.0': resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.10.0': - resolution: {integrity: sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g==} + '@eslint/js@9.13.0': + resolution: {integrity: sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.4': resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.1.0': - resolution: {integrity: sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ==} + '@eslint/plugin-kit@0.2.1': + resolution: {integrity: sha512-HFZ4Mp26nbWk9d/BpvP0YNL6W4UoZF0VFcTw/aPPA8RpOxeFQgK+ClABGgAUXs9Y/RGX/l1vOmrqz1MQt9MNuw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@humanfs/core@0.19.0': + resolution: {integrity: sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.5': + resolution: {integrity: sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==} + engines: {node: '>=18.18.0'} + '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/retry@0.3.0': - resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@hypernym/eslint-config@3.5.0': - resolution: {integrity: sha512-nYwd3sLC1E4VPvakAAg5d0USRkT1crXmKfufemAbsyzH8G7oUY0eAVAoFPfM5KKcM1pFpJW9SbtYBy5xnRARjA==} + '@hypernym/eslint-config@3.5.1': + resolution: {integrity: sha512-JDFk9FlVpz3UF+MoypsM9IygCNTuKDrEWE9VWV0ok8gomVrsJJ6pkl1cg7esUM6LOETjWU/e3Nzf82EHLLG92A==} engines: {node: '>=20.0.0', pnpm: '>=9.0.0'} peerDependencies: eslint: '>=9.0.0' @@ -175,8 +330,8 @@ packages: '@types/node': optional: true - '@hypernym/utils@3.3.0': - resolution: {integrity: sha512-58g3A0TvkBvYaKTsEHj62mZGlvLOC3rw9plNMtrOr0t0s2UrPPgkFZZWJS5tgeIm9i6diiD/xhaJzYwK1dU8vA==} + '@hypernym/utils@3.4.0': + resolution: {integrity: sha512-zRN3piPeC3J/9GQe5G0qQ0GxJuPbQiyqPMj2/hWIalqfnv7HzSf0y2gAxafEk2Wc07UriQI9QKZgMQbMcNPh6g==} engines: {node: '>=20.0.0', pnpm: '>=9.0.0'} peerDependencies: '@types/node': '>=20.0.0' @@ -203,10 +358,6 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - '@types/eslint@9.6.1': resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} @@ -219,11 +370,14 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@22.5.5': - resolution: {integrity: sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==} + '@types/node@22.7.7': + resolution: {integrity: sha512-SRxCrrg9CL/y54aiMCG3edPKdprgMVGDXjA3gB8UmmBW5TcXzRUYAh8EWzTnSJFAd1rgImPELza+A3bJ+qxz8Q==} + + '@types/vscode@1.94.0': + resolution: {integrity: sha512-UyQOIUT0pb14XSqJskYnRwD2aG0QrPVefIfrW1djR+/J4KeFQ0i1+hjZoaAmeNf3Z2jleK+R2hv+EboG/m8ruw==} - '@typescript-eslint/eslint-plugin@8.6.0': - resolution: {integrity: sha512-UOaz/wFowmoh2G6Mr9gw60B1mm0MzUtm6Ic8G2yM1Le6gyj5Loi/N+O5mocugRGY+8OeeKmkMmbxNqUCq3B4Sg==} + '@typescript-eslint/eslint-plugin@8.10.0': + resolution: {integrity: sha512-phuB3hoP7FFKbRXxjl+DRlQDuJqhpOnm5MmtROXyWi3uS/Xg2ZXqiQfcG2BJHiN4QKyzdOJi3NEn/qTnjUlkmQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -233,8 +387,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.6.0': - resolution: {integrity: sha512-eQcbCuA2Vmw45iGfcyG4y6rS7BhWfz9MQuk409WD47qMM+bKCGQWXxvoOs1DUp+T7UBMTtRTVT+kXr7Sh4O9Ow==} + '@typescript-eslint/parser@8.10.0': + resolution: {integrity: sha512-E24l90SxuJhytWJ0pTQydFT46Nk0Z+bsLKo/L8rtQSL93rQ6byd1V/QbDpHUTdLPOMsBCcYXZweADNCfOCmOAg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -243,12 +397,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@8.6.0': - resolution: {integrity: sha512-ZuoutoS5y9UOxKvpc/GkvF4cuEmpokda4wRg64JEia27wX+PysIE9q+lzDtlHHgblwUWwo5/Qn+/WyTUvDwBHw==} + '@typescript-eslint/scope-manager@8.10.0': + resolution: {integrity: sha512-AgCaEjhfql9MDKjMUxWvH7HjLeBqMCBfIaBbzzIcBbQPZE7CPh1m6FF+L75NUMJFMLYhCywJXIDEMa3//1A0dw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.6.0': - resolution: {integrity: sha512-dtePl4gsuenXVwC7dVNlb4mGDcKjDT/Ropsk4za/ouMBPplCLyznIaR+W65mvCvsyS97dymoBRrioEXI7k0XIg==} + '@typescript-eslint/type-utils@8.10.0': + resolution: {integrity: sha512-PCpUOpyQSpxBn230yIcK+LeCQaXuxrgCm2Zk1S+PTIRJsEfU6nJ0TtwyH8pIwPK/vJoA+7TZtzyAJSGBz+s/dg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -256,12 +410,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@8.6.0': - resolution: {integrity: sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw==} + '@typescript-eslint/types@8.10.0': + resolution: {integrity: sha512-k/E48uzsfJCRRbGLapdZgrX52csmWJ2rcowwPvOZ8lwPUv3xW6CcFeJAXgx4uJm+Ge4+a4tFOkdYvSpxhRhg1w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.6.0': - resolution: {integrity: sha512-MOVAzsKJIPIlLK239l5s06YXjNqpKTVhBVDnqUumQJja5+Y94V3+4VUFRA0G60y2jNnTVwRCkhyGQpavfsbq/g==} + '@typescript-eslint/typescript-estree@8.10.0': + resolution: {integrity: sha512-3OE0nlcOHaMvQ8Xu5gAfME3/tWVDpb/HxtpUZ1WeOAksZ/h/gwrBzCklaGzwZT97/lBbbxJ16dMA98JMEngW4w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -269,14 +423,14 @@ packages: typescript: optional: true - '@typescript-eslint/utils@8.6.0': - resolution: {integrity: sha512-eNp9cWnYf36NaOVjkEUznf6fEgVy1TWpE0o52e4wtojjBx7D1UV2WAWGzR+8Y5lVFtpMLPwNbC67T83DWSph4A==} + '@typescript-eslint/utils@8.10.0': + resolution: {integrity: sha512-Oq4uZ7JFr9d1ZunE/QKy5egcDRXT/FrS2z/nlxzPua2VHFtmMvFNDvpq1m/hq0ra+T52aUezfcjGRIB7vNJF9w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/visitor-keys@8.6.0': - resolution: {integrity: sha512-wapVFfZg9H0qOYh4grNVQiMklJGluQrOUiOhYRrQWhx7BY/+I1IYb8BczWNbbUpO+pqy0rDciv3lQH5E1bCLrg==} + '@typescript-eslint/visitor-keys@8.10.0': + resolution: {integrity: sha512-k8nekgqwr7FadWk548Lfph6V3r9OVqjzAIVskE7orMZR23cGJjAOVazsZSJW+ElyjfTM4wx/1g88Mi70DDtG9A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vscode/vsce-sign-alpine-arm64@2.0.2': @@ -327,8 +481,8 @@ packages: '@vscode/vsce-sign@2.0.4': resolution: {integrity: sha512-0uL32egStKYfy60IqnynAChMTbL0oqpqk0Ew0YHiIb+fayuGZWADuIPHWUcY1GCnAA+VgchOPDMxnc2R3XGWEA==} - '@vscode/vsce@3.1.0': - resolution: {integrity: sha512-fwdfp1Ol+bZtlSGkpcd/nztfo6+SVsTOMWjZ/+a88lVtUn7gXNbSu7dbniecl5mz4vINl+oaVDVtVdGbJDApmw==} + '@vscode/vsce@3.2.0': + resolution: {integrity: sha512-c/AId5Lp50HTszCBDfXfD/Go2djm6qO/WfedP2Y3BpRP+V+ttr8T0mTvZ8WEyTiBp2EfrYnzYUCx0ocB9mHy4Q==} engines: {node: '>= 20'} hasBin: true @@ -337,8 +491,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + acorn@8.13.0: + resolution: {integrity: sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==} engines: {node: '>=0.4.0'} hasBin: true @@ -553,6 +707,11 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + esbuild@0.24.0: + resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} + engines: {node: '>=18'} + hasBin: true + escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -561,20 +720,20 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-scope@8.0.2: - resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} + eslint-scope@8.1.0: + resolution: {integrity: sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.0.0: - resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + eslint-visitor-keys@4.1.0: + resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.10.0: - resolution: {integrity: sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw==} + eslint@9.13.0: + resolution: {integrity: sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -583,8 +742,8 @@ packages: jiti: optional: true - espree@10.1.0: - resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} + espree@10.2.0: + resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esquery@1.6.0: @@ -653,8 +812,8 @@ packages: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} engines: {node: '>= 6'} fs-constants@1.0.0: @@ -687,8 +846,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.9.0: - resolution: {integrity: sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==} + globals@15.11.0: + resolution: {integrity: sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==} engines: {node: '>=18'} gopd@1.0.1: @@ -781,10 +940,6 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -792,8 +947,8 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jackspeak@4.0.1: - resolution: {integrity: sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==} + jackspeak@4.0.2: + resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==} engines: {node: 20 || >=22} js-yaml@4.1.0: @@ -946,8 +1101,8 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - node-abi@3.67.0: - resolution: {integrity: sha512-bLn/fU/ALVBE9wj+p4Y21ZJWYFjUXLXPi/IewyLZkx3ApxKDNBWCKdReeKOtD8dWpOdDCeMyLh6ZewzcLsG2Nw==} + node-abi@3.71.0: + resolution: {integrity: sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==} engines: {node: '>=10'} node-addon-api@4.3.0: @@ -979,8 +1134,8 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - package-json-from-dist@1.0.0: - resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} @@ -989,14 +1144,14 @@ packages: parse-semver@1.1.1: resolution: {integrity: sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==} - parse5-htmlparser2-tree-adapter@7.0.0: - resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + parse5-htmlparser2-tree-adapter@7.1.0: + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} parse5-parser-stream@7.1.2: resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} - parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + parse5@7.2.0: + resolution: {integrity: sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==} path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} @@ -1179,8 +1334,8 @@ packages: peerDependencies: typescript: '>=4.2.0' - tslib@2.7.0: - resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + tslib@2.8.0: + resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==} tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -1196,8 +1351,8 @@ packages: typed-rest-client@1.8.11: resolution: {integrity: sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==} - typescript@5.6.2: - resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} engines: {node: '>=14.17'} hasBin: true @@ -1210,8 +1365,8 @@ packages: undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - undici@6.19.8: - resolution: {integrity: sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==} + undici@6.20.1: + resolution: {integrity: sha512-AjQF1QsmqfJys+LXfGTNum+qw4S88CojRInG/6t31W/1fk6G59s92bnAvGz5Cmur+kQv2SURXEvvudLmbrE8QA==} engines: {node: '>=18.17'} uri-js@4.4.1: @@ -1278,92 +1433,160 @@ packages: snapshots: - '@azure/abort-controller@1.1.0': - dependencies: - tslib: 2.7.0 - '@azure/abort-controller@2.1.2': dependencies: - tslib: 2.7.0 + tslib: 2.8.0 - '@azure/core-auth@1.8.0': + '@azure/core-auth@1.9.0': dependencies: '@azure/abort-controller': 2.1.2 - '@azure/core-util': 1.10.0 - tslib: 2.7.0 + '@azure/core-util': 1.11.0 + tslib: 2.8.0 '@azure/core-client@1.9.2': dependencies: '@azure/abort-controller': 2.1.2 - '@azure/core-auth': 1.8.0 + '@azure/core-auth': 1.9.0 '@azure/core-rest-pipeline': 1.17.0 - '@azure/core-tracing': 1.1.2 - '@azure/core-util': 1.10.0 + '@azure/core-tracing': 1.2.0 + '@azure/core-util': 1.11.0 '@azure/logger': 1.1.4 - tslib: 2.7.0 + tslib: 2.8.0 transitivePeerDependencies: - supports-color '@azure/core-rest-pipeline@1.17.0': dependencies: '@azure/abort-controller': 2.1.2 - '@azure/core-auth': 1.8.0 - '@azure/core-tracing': 1.1.2 - '@azure/core-util': 1.10.0 + '@azure/core-auth': 1.9.0 + '@azure/core-tracing': 1.2.0 + '@azure/core-util': 1.11.0 '@azure/logger': 1.1.4 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.5 - tslib: 2.7.0 + tslib: 2.8.0 transitivePeerDependencies: - supports-color - '@azure/core-tracing@1.1.2': + '@azure/core-tracing@1.2.0': dependencies: - tslib: 2.7.0 + tslib: 2.8.0 - '@azure/core-util@1.10.0': + '@azure/core-util@1.11.0': dependencies: '@azure/abort-controller': 2.1.2 - tslib: 2.7.0 + tslib: 2.8.0 - '@azure/identity@4.4.1': + '@azure/identity@4.5.0': dependencies: - '@azure/abort-controller': 1.1.0 - '@azure/core-auth': 1.8.0 + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.9.0 '@azure/core-client': 1.9.2 '@azure/core-rest-pipeline': 1.17.0 - '@azure/core-tracing': 1.1.2 - '@azure/core-util': 1.10.0 + '@azure/core-tracing': 1.2.0 + '@azure/core-util': 1.11.0 '@azure/logger': 1.1.4 - '@azure/msal-browser': 3.23.0 - '@azure/msal-node': 2.13.1 + '@azure/msal-browser': 3.26.1 + '@azure/msal-node': 2.15.0 events: 3.3.0 jws: 4.0.0 open: 8.4.2 stoppable: 1.1.0 - tslib: 2.7.0 + tslib: 2.8.0 transitivePeerDependencies: - supports-color '@azure/logger@1.1.4': dependencies: - tslib: 2.7.0 + tslib: 2.8.0 - '@azure/msal-browser@3.23.0': + '@azure/msal-browser@3.26.1': dependencies: - '@azure/msal-common': 14.14.2 + '@azure/msal-common': 14.15.0 - '@azure/msal-common@14.14.2': {} + '@azure/msal-common@14.15.0': {} - '@azure/msal-node@2.13.1': + '@azure/msal-node@2.15.0': dependencies: - '@azure/msal-common': 14.14.2 + '@azure/msal-common': 14.15.0 jsonwebtoken: 9.0.2 uuid: 8.3.2 - '@eslint-community/eslint-utils@4.4.0(eslint@9.10.0)': + '@esbuild/aix-ppc64@0.24.0': + optional: true + + '@esbuild/android-arm64@0.24.0': + optional: true + + '@esbuild/android-arm@0.24.0': + optional: true + + '@esbuild/android-x64@0.24.0': + optional: true + + '@esbuild/darwin-arm64@0.24.0': + optional: true + + '@esbuild/darwin-x64@0.24.0': + optional: true + + '@esbuild/freebsd-arm64@0.24.0': + optional: true + + '@esbuild/freebsd-x64@0.24.0': + optional: true + + '@esbuild/linux-arm64@0.24.0': + optional: true + + '@esbuild/linux-arm@0.24.0': + optional: true + + '@esbuild/linux-ia32@0.24.0': + optional: true + + '@esbuild/linux-loong64@0.24.0': + optional: true + + '@esbuild/linux-mips64el@0.24.0': + optional: true + + '@esbuild/linux-ppc64@0.24.0': + optional: true + + '@esbuild/linux-riscv64@0.24.0': + optional: true + + '@esbuild/linux-s390x@0.24.0': + optional: true + + '@esbuild/linux-x64@0.24.0': + optional: true + + '@esbuild/netbsd-x64@0.24.0': + optional: true + + '@esbuild/openbsd-arm64@0.24.0': + optional: true + + '@esbuild/openbsd-x64@0.24.0': + optional: true + + '@esbuild/sunos-x64@0.24.0': + optional: true + + '@esbuild/win32-arm64@0.24.0': + optional: true + + '@esbuild/win32-ia32@0.24.0': + optional: true + + '@esbuild/win32-x64@0.24.0': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@9.13.0)': dependencies: - eslint: 9.10.0 + eslint: 9.13.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.11.1': {} @@ -1376,11 +1599,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@eslint/core@0.7.0': {} + '@eslint/eslintrc@3.1.0': dependencies: ajv: 6.12.6 debug: 4.3.7 - espree: 10.1.0 + espree: 10.2.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.0 @@ -1390,29 +1615,36 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.10.0': {} + '@eslint/js@9.13.0': {} '@eslint/object-schema@2.1.4': {} - '@eslint/plugin-kit@0.1.0': + '@eslint/plugin-kit@0.2.1': dependencies: levn: 0.4.1 + '@humanfs/core@0.19.0': {} + + '@humanfs/node@0.16.5': + dependencies: + '@humanfs/core': 0.19.0 + '@humanwhocodes/retry': 0.3.1 + '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/retry@0.3.0': {} + '@humanwhocodes/retry@0.3.1': {} - '@hypernym/eslint-config@3.5.0(eslint@9.10.0)(typescript@5.6.2)': + '@hypernym/eslint-config@3.5.1(eslint@9.13.0)(typescript@5.6.3)': dependencies: - '@eslint/js': 9.10.0 + '@eslint/js': 9.13.0 '@types/eslint': 9.6.1 '@types/eslint__js': 8.42.3 - '@typescript-eslint/eslint-plugin': 8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)(typescript@5.6.2) - '@typescript-eslint/parser': 8.6.0(eslint@9.10.0)(typescript@5.6.2) - eslint: 9.10.0 - globals: 15.9.0 + '@typescript-eslint/eslint-plugin': 8.10.0(@typescript-eslint/parser@8.10.0(eslint@9.13.0)(typescript@5.6.3))(eslint@9.13.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.10.0(eslint@9.13.0)(typescript@5.6.3) + eslint: 9.13.0 + globals: 15.11.0 optionalDependencies: - typescript: 5.6.2 + typescript: 5.6.3 transitivePeerDependencies: - supports-color @@ -1420,16 +1652,16 @@ snapshots: dependencies: prettier: 3.3.3 - '@hypernym/tsconfig@2.4.0(@types/node@22.5.5)(typescript@5.6.2)': + '@hypernym/tsconfig@2.4.0(@types/node@22.7.7)(typescript@5.6.3)': dependencies: - typescript: 5.6.2 + typescript: 5.6.3 optionalDependencies: - '@types/node': 22.5.5 + '@types/node': 22.7.7 - '@hypernym/utils@3.3.0(@types/node@22.5.5)(typescript@5.6.2)': + '@hypernym/utils@3.4.0(@types/node@22.7.7)(typescript@5.6.3)': optionalDependencies: - '@types/node': 22.5.5 - typescript: 5.6.2 + '@types/node': 22.7.7 + typescript: 5.6.3 '@isaacs/cliui@8.0.2': dependencies: @@ -1452,9 +1684,6 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@pkgjs/parseargs@0.11.0': - optional: true - '@types/eslint@9.6.1': dependencies: '@types/estree': 1.0.6 @@ -1468,89 +1697,91 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@22.5.5': + '@types/node@22.7.7': dependencies: undici-types: 6.19.8 - '@typescript-eslint/eslint-plugin@8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)(typescript@5.6.2)': + '@types/vscode@1.94.0': {} + + '@typescript-eslint/eslint-plugin@8.10.0(@typescript-eslint/parser@8.10.0(eslint@9.13.0)(typescript@5.6.3))(eslint@9.13.0)(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.11.1 - '@typescript-eslint/parser': 8.6.0(eslint@9.10.0)(typescript@5.6.2) - '@typescript-eslint/scope-manager': 8.6.0 - '@typescript-eslint/type-utils': 8.6.0(eslint@9.10.0)(typescript@5.6.2) - '@typescript-eslint/utils': 8.6.0(eslint@9.10.0)(typescript@5.6.2) - '@typescript-eslint/visitor-keys': 8.6.0 - eslint: 9.10.0 + '@typescript-eslint/parser': 8.10.0(eslint@9.13.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.10.0 + '@typescript-eslint/type-utils': 8.10.0(eslint@9.13.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.10.0(eslint@9.13.0)(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.10.0 + eslint: 9.13.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.6.2) + ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: - typescript: 5.6.2 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.6.0(eslint@9.10.0)(typescript@5.6.2)': + '@typescript-eslint/parser@8.10.0(eslint@9.13.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/scope-manager': 8.6.0 - '@typescript-eslint/types': 8.6.0 - '@typescript-eslint/typescript-estree': 8.6.0(typescript@5.6.2) - '@typescript-eslint/visitor-keys': 8.6.0 + '@typescript-eslint/scope-manager': 8.10.0 + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/typescript-estree': 8.10.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.10.0 debug: 4.3.7 - eslint: 9.10.0 + eslint: 9.13.0 optionalDependencies: - typescript: 5.6.2 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.6.0': + '@typescript-eslint/scope-manager@8.10.0': dependencies: - '@typescript-eslint/types': 8.6.0 - '@typescript-eslint/visitor-keys': 8.6.0 + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/visitor-keys': 8.10.0 - '@typescript-eslint/type-utils@8.6.0(eslint@9.10.0)(typescript@5.6.2)': + '@typescript-eslint/type-utils@8.10.0(eslint@9.13.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.6.0(typescript@5.6.2) - '@typescript-eslint/utils': 8.6.0(eslint@9.10.0)(typescript@5.6.2) + '@typescript-eslint/typescript-estree': 8.10.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.10.0(eslint@9.13.0)(typescript@5.6.3) debug: 4.3.7 - ts-api-utils: 1.3.0(typescript@5.6.2) + ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: - typescript: 5.6.2 + typescript: 5.6.3 transitivePeerDependencies: - eslint - supports-color - '@typescript-eslint/types@8.6.0': {} + '@typescript-eslint/types@8.10.0': {} - '@typescript-eslint/typescript-estree@8.6.0(typescript@5.6.2)': + '@typescript-eslint/typescript-estree@8.10.0(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 8.6.0 - '@typescript-eslint/visitor-keys': 8.6.0 + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/visitor-keys': 8.10.0 debug: 4.3.7 fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.6.2) + ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: - typescript: 5.6.2 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.6.0(eslint@9.10.0)(typescript@5.6.2)': + '@typescript-eslint/utils@8.10.0(eslint@9.13.0)(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0) - '@typescript-eslint/scope-manager': 8.6.0 - '@typescript-eslint/types': 8.6.0 - '@typescript-eslint/typescript-estree': 8.6.0(typescript@5.6.2) - eslint: 9.10.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0) + '@typescript-eslint/scope-manager': 8.10.0 + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/typescript-estree': 8.10.0(typescript@5.6.3) + eslint: 9.13.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@8.6.0': + '@typescript-eslint/visitor-keys@8.10.0': dependencies: - '@typescript-eslint/types': 8.6.0 + '@typescript-eslint/types': 8.10.0 eslint-visitor-keys: 3.4.3 '@vscode/vsce-sign-alpine-arm64@2.0.2': @@ -1592,16 +1823,16 @@ snapshots: '@vscode/vsce-sign-win32-arm64': 2.0.2 '@vscode/vsce-sign-win32-x64': 2.0.2 - '@vscode/vsce@3.1.0': + '@vscode/vsce@3.2.0': dependencies: - '@azure/identity': 4.4.1 + '@azure/identity': 4.5.0 '@vscode/vsce-sign': 2.0.4 azure-devops-node-api: 12.5.0 chalk: 2.4.2 cheerio: 1.0.0 cockatiel: 3.2.1 commander: 6.2.1 - form-data: 4.0.0 + form-data: 4.0.1 glob: 11.0.0 hosted-git-info: 4.1.0 jsonc-parser: 3.3.1 @@ -1623,11 +1854,11 @@ snapshots: transitivePeerDependencies: - supports-color - acorn-jsx@5.3.2(acorn@8.12.1): + acorn-jsx@5.3.2(acorn@8.13.0): dependencies: - acorn: 8.12.1 + acorn: 8.13.0 - acorn@8.12.1: {} + acorn@8.13.0: {} agent-base@7.1.1: dependencies: @@ -1740,10 +1971,10 @@ snapshots: domutils: 3.1.0 encoding-sniffer: 0.2.0 htmlparser2: 9.1.0 - parse5: 7.1.2 - parse5-htmlparser2-tree-adapter: 7.0.0 + parse5: 7.2.0 + parse5-htmlparser2-tree-adapter: 7.1.0 parse5-parser-stream: 7.1.2 - undici: 6.19.8 + undici: 6.20.1 whatwg-mimetype: 4.0.0 chownr@1.1.4: @@ -1860,38 +2091,68 @@ snapshots: es-errors@1.3.0: {} + esbuild@0.24.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.0 + '@esbuild/android-arm': 0.24.0 + '@esbuild/android-arm64': 0.24.0 + '@esbuild/android-x64': 0.24.0 + '@esbuild/darwin-arm64': 0.24.0 + '@esbuild/darwin-x64': 0.24.0 + '@esbuild/freebsd-arm64': 0.24.0 + '@esbuild/freebsd-x64': 0.24.0 + '@esbuild/linux-arm': 0.24.0 + '@esbuild/linux-arm64': 0.24.0 + '@esbuild/linux-ia32': 0.24.0 + '@esbuild/linux-loong64': 0.24.0 + '@esbuild/linux-mips64el': 0.24.0 + '@esbuild/linux-ppc64': 0.24.0 + '@esbuild/linux-riscv64': 0.24.0 + '@esbuild/linux-s390x': 0.24.0 + '@esbuild/linux-x64': 0.24.0 + '@esbuild/netbsd-x64': 0.24.0 + '@esbuild/openbsd-arm64': 0.24.0 + '@esbuild/openbsd-x64': 0.24.0 + '@esbuild/sunos-x64': 0.24.0 + '@esbuild/win32-arm64': 0.24.0 + '@esbuild/win32-ia32': 0.24.0 + '@esbuild/win32-x64': 0.24.0 + escape-string-regexp@1.0.5: {} escape-string-regexp@4.0.0: {} - eslint-scope@8.0.2: + eslint-scope@8.1.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.0.0: {} + eslint-visitor-keys@4.1.0: {} - eslint@9.10.0: + eslint@9.13.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0) '@eslint-community/regexpp': 4.11.1 '@eslint/config-array': 0.18.0 + '@eslint/core': 0.7.0 '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.10.0 - '@eslint/plugin-kit': 0.1.0 + '@eslint/js': 9.13.0 + '@eslint/plugin-kit': 0.2.1 + '@humanfs/node': 0.16.5 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.3.0 - '@nodelib/fs.walk': 1.2.8 + '@humanwhocodes/retry': 0.3.1 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 debug: 4.3.7 escape-string-regexp: 4.0.0 - eslint-scope: 8.0.2 - eslint-visitor-keys: 4.0.0 - espree: 10.1.0 + eslint-scope: 8.1.0 + eslint-visitor-keys: 4.1.0 + espree: 10.2.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -1901,22 +2162,20 @@ snapshots: ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 json-stable-stringify-without-jsonify: 1.0.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 - strip-ansi: 6.0.1 text-table: 0.2.0 transitivePeerDependencies: - supports-color - espree@10.1.0: + espree@10.2.0: dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) - eslint-visitor-keys: 4.0.0 + acorn: 8.13.0 + acorn-jsx: 5.3.2(acorn@8.13.0) + eslint-visitor-keys: 4.1.0 esquery@1.6.0: dependencies: @@ -1982,7 +2241,7 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 - form-data@4.0.0: + form-data@4.0.1: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -2015,15 +2274,15 @@ snapshots: glob@11.0.0: dependencies: foreground-child: 3.3.0 - jackspeak: 4.0.1 + jackspeak: 4.0.2 minimatch: 10.0.1 minipass: 7.1.2 - package-json-from-dist: 1.0.0 + package-json-from-dist: 1.0.1 path-scurry: 2.0.0 globals@14.0.0: {} - globals@15.9.0: {} + globals@15.11.0: {} gopd@1.0.1: dependencies: @@ -2106,19 +2365,15 @@ snapshots: is-number@7.0.0: {} - is-path-inside@3.0.3: {} - is-wsl@2.2.0: dependencies: is-docker: 2.2.1 isexe@2.0.0: {} - jackspeak@4.0.1: + jackspeak@4.0.2: dependencies: '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 js-yaml@4.1.0: dependencies: @@ -2272,7 +2527,7 @@ snapshots: natural-compare@1.4.0: {} - node-abi@3.67.0: + node-abi@3.71.0: dependencies: semver: 7.6.3 optional: true @@ -2314,7 +2569,7 @@ snapshots: dependencies: p-limit: 3.1.0 - package-json-from-dist@1.0.0: {} + package-json-from-dist@1.0.1: {} parent-module@1.0.1: dependencies: @@ -2324,16 +2579,16 @@ snapshots: dependencies: semver: 5.7.2 - parse5-htmlparser2-tree-adapter@7.0.0: + parse5-htmlparser2-tree-adapter@7.1.0: dependencies: domhandler: 5.0.3 - parse5: 7.1.2 + parse5: 7.2.0 parse5-parser-stream@7.1.2: dependencies: - parse5: 7.1.2 + parse5: 7.2.0 - parse5@7.1.2: + parse5@7.2.0: dependencies: entities: 4.5.0 @@ -2358,7 +2613,7 @@ snapshots: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 1.0.2 - node-abi: 3.67.0 + node-abi: 3.71.0 pump: 3.0.2 rc: 1.2.8 simple-get: 4.0.1 @@ -2522,11 +2777,11 @@ snapshots: dependencies: is-number: 7.0.0 - ts-api-utils@1.3.0(typescript@5.6.2): + ts-api-utils@1.3.0(typescript@5.6.3): dependencies: - typescript: 5.6.2 + typescript: 5.6.3 - tslib@2.7.0: {} + tslib@2.8.0: {} tunnel-agent@0.6.0: dependencies: @@ -2545,7 +2800,7 @@ snapshots: tunnel: 0.0.6 underscore: 1.13.7 - typescript@5.6.2: {} + typescript@5.6.3: {} uc.micro@2.1.0: {} @@ -2553,7 +2808,7 @@ snapshots: undici-types@6.19.8: {} - undici@6.19.8: {} + undici@6.20.1: {} uri-js@4.4.1: dependencies: diff --git a/scripts/build-bundle.ts b/scripts/build-bundle.ts new file mode 100644 index 0000000..b3f98d8 --- /dev/null +++ b/scripts/build-bundle.ts @@ -0,0 +1,20 @@ +import { build } from 'esbuild' +import { config } from './esbuild.config' +import type { BuildOptions } from 'esbuild' + +const isProduction = process.argv.includes('--production') + +const options: BuildOptions = { + ...config, + entryPoints: ['./src/extension/index.ts'], + minify: isProduction, +} + +// VSCode API Documentation +// @link https://code.visualstudio.com/api/working-with-extensions/bundling-extension + +async function buildBundle(): Promise { + await build(options) +} + +buildBundle() diff --git a/scripts/build-static.ts b/scripts/build-static.ts new file mode 100644 index 0000000..ab71e24 --- /dev/null +++ b/scripts/build-static.ts @@ -0,0 +1,8 @@ +import { copy } from '@hypernym/utils/fs' +import { paths } from '@/utils' + +async function buildStaticDir(): Promise { + await copy(paths.dir.static, paths.dir.dist) +} + +buildStaticDir() diff --git a/scripts/build-theme.ts b/scripts/build-theme.ts new file mode 100644 index 0000000..c1b1aae --- /dev/null +++ b/scripts/build-theme.ts @@ -0,0 +1,13 @@ +import { write } from '@hypernym/utils/fs' +import { paths } from '@/utils' +import { createIconTheme } from '@/theme' +import { defaultConfig } from '@/extension/config' + +async function buildTheme(): Promise { + const config = defaultConfig() + const theme = createIconTheme(config) + const json = JSON.stringify(theme, null, 2) + await write(paths.file.theme, json) +} + +buildTheme() diff --git a/scripts/build-watch.ts b/scripts/build-watch.ts new file mode 100644 index 0000000..b560311 --- /dev/null +++ b/scripts/build-watch.ts @@ -0,0 +1,21 @@ +import { context } from 'esbuild' +import { config } from './esbuild.config' +import type { BuildOptions } from 'esbuild' + +const options: BuildOptions = { + ...config, + entryPoints: ['./src/extension/index.ts'], + logLevel: 'info', +} + +export async function buildWatch(): Promise { + try { + const ctx = await context(options) + await ctx.watch() + } catch (err) { + console.error(err) + process.exit(1) + } +} + +buildWatch() diff --git a/scripts/esbuild.config.ts b/scripts/esbuild.config.ts new file mode 100644 index 0000000..716f33b --- /dev/null +++ b/scripts/esbuild.config.ts @@ -0,0 +1,11 @@ +import type { BuildOptions } from 'esbuild' + +export const config: BuildOptions = { + outExtension: { '.js': '.cjs' }, + outdir: './dist', + outbase: './src', + platform: 'node', + format: 'cjs', + external: ['vscode'], + bundle: true, +} diff --git a/scripts/replace.ts b/scripts/replace.ts deleted file mode 100644 index cf83f01..0000000 --- a/scripts/replace.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { read, write } from '@hypernym/utils/fs' -import fg from 'fast-glob' -import { paths } from '@/utils' - -async function fileHandler(file: string, color: string): Promise { - const input = await read(file) - const transform = input.replace(/fill=".*?"/, `fill="${color}"`) - - return await write(file, transform) -} - -export async function replaceFill( - theme: 'dark' | 'light', - color: string, -): Promise { - try { - const svgFiles = await fg([`${paths.dirPublic}/icons/*_${theme}.svg`]) - - for (const file of svgFiles) await fileHandler(file, color) - } catch (e) { - console.error(e) - process.exit(1) - } -} - -// replaceFill('dark', '#ffffff86') diff --git a/src/extension.ts b/src/extension.ts deleted file mode 100644 index 27c4c6f..0000000 --- a/src/extension.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { write } from '@hypernym/utils/fs' -import { theme } from './theme/index.js' -import { paths } from './utils/index.js' - -async function generateExtension() { - return await write(paths.extensionFile, theme) -} - -generateExtension() diff --git a/src/extension/commands/index.ts b/src/extension/commands/index.ts new file mode 100644 index 0000000..5bb336c --- /dev/null +++ b/src/extension/commands/index.ts @@ -0,0 +1,33 @@ +import { commands } from 'vscode' +import { extensionName } from '@/extension/meta' +import { toggleExplorerArrows } from './toggle-explorer-arrows' +import { setFolderColor } from './set-folder-color' +import { setFolderOpacity } from './set-folder-opacity' +import { setFolderSize } from './set-folder-size' +import { setIconColor } from './set-icon-color' +import { setIconOpacity } from './set-icon-opacity' +import { setIconSize } from './set-icon-size' +import type { Disposable } from 'vscode' + +type ExtensionCommands = { + [commmand: string]: () => Promise +} + +const extensionCommands: ExtensionCommands = { + toggleExplorerArrows, + setFolderColor, + setFolderOpacity, + setFolderSize, + setIconColor, + setIconOpacity, + setIconSize, +} + +export function registeredCommands(): Disposable[] { + return Object.keys(extensionCommands).map((commandName) => { + const cmd = `${extensionName}.${commandName}` + const callCommand = () => extensionCommands[commandName]() + + return commands.registerCommand(cmd, callCommand) + }) +} diff --git a/src/extension/commands/set-color.ts b/src/extension/commands/set-color.ts new file mode 100644 index 0000000..418a42e --- /dev/null +++ b/src/extension/commands/set-color.ts @@ -0,0 +1,19 @@ +import { window } from 'vscode' +import { setThemeConfig } from '@/extension/config/theme-config' +import { isValidDefaultInput, validateColorInput } from './utils' +import type { InputBoxOptions } from 'vscode' + +export async function setColor(section: string): Promise { + const input: InputBoxOptions = { + placeHolder: 'Enter a valid HEX color, e.g. #fff, #ffffff, #ffffff66', + ignoreFocusOut: true, + validateInput: validateColorInput, + } + + const value = await window.showInputBox(input) + + if (!value) return + + const val = isValidDefaultInput(value) ? undefined : value + return setThemeConfig(section, val, true) +} diff --git a/src/extension/commands/set-folder-color.ts b/src/extension/commands/set-folder-color.ts new file mode 100644 index 0000000..de241da --- /dev/null +++ b/src/extension/commands/set-folder-color.ts @@ -0,0 +1,5 @@ +import { setColor } from './set-color' + +export async function setFolderColor(): Promise { + return await setColor('folders.color') +} diff --git a/src/extension/commands/set-folder-opacity.ts b/src/extension/commands/set-folder-opacity.ts new file mode 100644 index 0000000..3e810e2 --- /dev/null +++ b/src/extension/commands/set-folder-opacity.ts @@ -0,0 +1,5 @@ +import { setOpacity } from './set-opacity' + +export async function setFolderOpacity(): Promise { + return await setOpacity('folders.opacity') +} diff --git a/src/extension/commands/set-folder-size.ts b/src/extension/commands/set-folder-size.ts new file mode 100644 index 0000000..84966be --- /dev/null +++ b/src/extension/commands/set-folder-size.ts @@ -0,0 +1,5 @@ +import { setSize } from './set-size' + +export async function setFolderSize(): Promise { + return await setSize('folders.size') +} diff --git a/src/extension/commands/set-icon-color.ts b/src/extension/commands/set-icon-color.ts new file mode 100644 index 0000000..e31d114 --- /dev/null +++ b/src/extension/commands/set-icon-color.ts @@ -0,0 +1,5 @@ +import { setColor } from './set-color' + +export async function setIconColor(): Promise { + return await setColor('icons.color') +} diff --git a/src/extension/commands/set-icon-opacity.ts b/src/extension/commands/set-icon-opacity.ts new file mode 100644 index 0000000..53969a1 --- /dev/null +++ b/src/extension/commands/set-icon-opacity.ts @@ -0,0 +1,5 @@ +import { setOpacity } from './set-opacity' + +export async function setIconOpacity(): Promise { + return await setOpacity('icons.opacity') +} diff --git a/src/extension/commands/set-icon-size.ts b/src/extension/commands/set-icon-size.ts new file mode 100644 index 0000000..fe8b40b --- /dev/null +++ b/src/extension/commands/set-icon-size.ts @@ -0,0 +1,5 @@ +import { setSize } from './set-size' + +export async function setIconSize(): Promise { + return await setSize('icons.size') +} diff --git a/src/extension/commands/set-opacity.ts b/src/extension/commands/set-opacity.ts new file mode 100644 index 0000000..d012705 --- /dev/null +++ b/src/extension/commands/set-opacity.ts @@ -0,0 +1,19 @@ +import { window } from 'vscode' +import { setThemeConfig } from '@/extension/config/theme-config' +import { isValidDefaultInput, validateOpacityInput } from './utils' +import type { InputBoxOptions } from 'vscode' + +export async function setOpacity(section: string): Promise { + const input: InputBoxOptions = { + placeHolder: 'Enter a percentage size, e.g. 60%', + ignoreFocusOut: true, + validateInput: validateOpacityInput, + } + + const value = await window.showInputBox(input) + + if (!value) return + + const val = isValidDefaultInput(value) ? undefined : value + return setThemeConfig(section, val, true) +} diff --git a/src/extension/commands/set-size.ts b/src/extension/commands/set-size.ts new file mode 100644 index 0000000..d8a3b75 --- /dev/null +++ b/src/extension/commands/set-size.ts @@ -0,0 +1,19 @@ +import { window } from 'vscode' +import { setThemeConfig } from '@/extension/config/theme-config' +import { isValidDefaultInput, validateSizeInput } from './utils' +import type { InputBoxOptions } from 'vscode' + +export async function setSize(section: string): Promise { + const input: InputBoxOptions = { + placeHolder: 'Enter a percentage size, e.g. 130%', + ignoreFocusOut: true, + validateInput: validateSizeInput, + } + + const value = await window.showInputBox(input) + + if (!value) return + + const val = isValidDefaultInput(value) ? undefined : value + return setThemeConfig(section, val, true) +} diff --git a/src/extension/commands/toggle-explorer-arrows.ts b/src/extension/commands/toggle-explorer-arrows.ts new file mode 100644 index 0000000..dca31c3 --- /dev/null +++ b/src/extension/commands/toggle-explorer-arrows.ts @@ -0,0 +1,35 @@ +import { window } from 'vscode' +import { setThemeConfig } from '@/extension/config/theme-config' +import type { QuickPickItem } from 'vscode' + +export async function toggleExplorerArrows(): Promise { + const disable: QuickPickItem = { + description: 'Disable Arrows (Default)', + detail: 'Hide folder arrows in Explorer', + label: '$(close)', + } + const enable: QuickPickItem = { + description: 'Enable Arrows', + detail: 'Show folder arrows in Explorer', + label: '$(check)', + } + + const value = await window.showQuickPick([disable, enable], { + placeHolder: 'Toggle folder arrows in Explorer', + canPickMany: false, + ignoreFocusOut: false, + matchOnDescription: true, + }) + + if (!value?.description) return + + if (value.description === enable.description) { + return setThemeConfig('hidesExplorerArrows', false, true) + } + + if (value.description === disable.description) { + return setThemeConfig('hidesExplorerArrows', true, true) + } + + return +} diff --git a/src/extension/commands/utils.ts b/src/extension/commands/utils.ts new file mode 100644 index 0000000..1901ba5 --- /dev/null +++ b/src/extension/commands/utils.ts @@ -0,0 +1,41 @@ +export function isValidDefaultInput(input: string): boolean { + const pattern = new RegExp(/default/, 'i') + return input.length > 0 && pattern.test(input) +} + +function isValidHEXColor(color: string): boolean { + const pattern = new RegExp( + /^#([A-Fa-f0-9]{3}|[A-Fa-f0-9]{6})(?:([0-9]{2})?)$/, + ) + return color.length > 0 && pattern.test(color) +} + +export function validateColorInput(input: string): string | undefined { + if (isValidDefaultInput(input)) return undefined + else if (!isValidHEXColor(input)) return 'Invalid HEX color.' + return undefined +} + +function isValidPercentSize(percent: string): boolean { + const pattern = new RegExp(/^([0-9]{1}|[0-9]{2}|[0-9]{3})%$/) + return percent.length > 0 && pattern.test(percent) +} + +export function validateSizeInput(input: string): string | undefined { + if (isValidDefaultInput(input)) return undefined + else if (!isValidPercentSize(input)) return 'Invalid percentage size.' + return undefined +} + +function isValidPercentOpacity(percent: string): boolean { + const pattern = new RegExp(/^([0-9][0-9]?|^100)%$/) + return percent.length > 0 && pattern.test(percent) +} + +export function validateOpacityInput(input: string): string | undefined { + if (isValidDefaultInput(input)) return undefined + else if (!isValidPercentOpacity(input)) { + return 'Invalid percentage size. Accepts values from 0-100%.' + } + return undefined +} diff --git a/src/extension/config/default-config.ts b/src/extension/config/default-config.ts new file mode 100644 index 0000000..f0c06f5 --- /dev/null +++ b/src/extension/config/default-config.ts @@ -0,0 +1,7 @@ +import type { ExtensionConfig } from '@/types' + +export const defaultConfig = (): ExtensionConfig => ({ + hidesExplorerArrows: true, + folders: {}, + icons: {}, +}) diff --git a/src/extension/config/detect-config-change.ts b/src/extension/config/detect-config-change.ts new file mode 100644 index 0000000..b54c3a4 --- /dev/null +++ b/src/extension/config/detect-config-change.ts @@ -0,0 +1,28 @@ +import { resolve } from 'node:path' +import { isDeepStrictEqual } from 'node:util' +import { writeFile } from 'node:fs/promises' +import { createIconTheme } from '@/theme' +import { extensionName, extensionThemeFile } from '@/extension/meta' +import { getGlobalConfig, syncGlobalConfig } from './global-config' +import { getWorkspaceConfig } from './workspace-config' +import type { ExtensionContext, ConfigurationChangeEvent } from 'vscode' + +export async function detectConfigChange( + event: ConfigurationChangeEvent | undefined, + context: ExtensionContext, +): Promise { + if (event?.affectsConfiguration(extensionName) === false) return + + const globalConfig = getGlobalConfig(context) + const workspaceConfig = getWorkspaceConfig() + + if (isDeepStrictEqual(globalConfig, workspaceConfig)) return + + const iconTheme = createIconTheme(workspaceConfig) + const themeContent = JSON.stringify(iconTheme, null, 2) + const themePath = resolve(__dirname, '..', extensionThemeFile) + + await writeFile(themePath, themeContent, 'utf-8') + + syncGlobalConfig(workspaceConfig, context) +} diff --git a/src/extension/config/global-config.ts b/src/extension/config/global-config.ts new file mode 100644 index 0000000..95d8f87 --- /dev/null +++ b/src/extension/config/global-config.ts @@ -0,0 +1,27 @@ +import { defaultConfig } from './default-config' +import type { ExtensionContext } from 'vscode' +import type { ExtensionConfig } from '@/types' + +export function getGlobalConfig( + context: ExtensionContext, +): ExtensionConfig | undefined { + const extVersion = context.extension.packageJSON.version + + const globalState = context.globalState.get<{ + version: string + config: ExtensionConfig + }>('config') + + if (extVersion === globalState?.version) return globalState?.config + else return defaultConfig() +} + +export function syncGlobalConfig( + config: ExtensionConfig, + context: ExtensionContext, +): void { + context.globalState.update('config', { + version: context.extension.packageJSON.version, + config, + }) +} diff --git a/src/extension/config/index.ts b/src/extension/config/index.ts new file mode 100644 index 0000000..ba2588f --- /dev/null +++ b/src/extension/config/index.ts @@ -0,0 +1 @@ +export * from './default-config' diff --git a/src/extension/config/theme-config.ts b/src/extension/config/theme-config.ts new file mode 100644 index 0000000..183de9f --- /dev/null +++ b/src/extension/config/theme-config.ts @@ -0,0 +1,11 @@ +import { workspace } from 'vscode' +import { extensionName } from '@/extension/meta' + +export function setThemeConfig( + section: string, + value: unknown, + target = false, +): void { + const config = workspace.getConfiguration(extensionName) + config.update(section, value, target) +} diff --git a/src/extension/config/workspace-config.ts b/src/extension/config/workspace-config.ts new file mode 100644 index 0000000..7e41fd3 --- /dev/null +++ b/src/extension/config/workspace-config.ts @@ -0,0 +1,44 @@ +import { isNull, isStringEmpty } from '@hypernym/utils' +import { extensions, workspace } from 'vscode' +import { extensionName, extensionId } from '@/extension/meta' +import type { ExtensionConfig } from '@/types' + +function getConfigProperties(): { [config: string]: unknown } { + return extensions.getExtension(extensionId)?.packageJSON?.contributes + ?.configuration?.properties +} + +function getPropertyNames(): string[] { + const names: Set = new Set() + const keys = Object.keys(getConfigProperties()) + + for (const key of keys) { + const splitKey = key.split('.') + const k = splitKey[1] + names.add(k) + } + + return Array.from(names) +} + +function parseConfig(config: any): ExtensionConfig { + return JSON.parse( + JSON.stringify(config, (k, v) => { + if (isNull(v) || isStringEmpty(v)) return undefined + else return v + }), + ) +} + +export function getWorkspaceConfig(): ExtensionConfig { + const config: { [key: string]: any } = {} + + const workspaceConfig = workspace.getConfiguration(extensionName) + const props = getPropertyNames() + + for (const prop of props) { + config[prop] = workspaceConfig[prop] + } + + return parseConfig(config) +} diff --git a/src/extension/index.ts b/src/extension/index.ts new file mode 100644 index 0000000..d256e0c --- /dev/null +++ b/src/extension/index.ts @@ -0,0 +1,32 @@ +import { workspace, window } from 'vscode' +import { registeredCommands } from './commands' +import { detectConfigChange } from './config/detect-config-change' +import { showMessage } from './messages' +import type { ExtensionContext } from 'vscode' + +export async function activate(context: ExtensionContext): Promise { + try { + context.subscriptions.push(...registeredCommands()) + + await detectConfigChange(undefined, context) + + context.subscriptions.push( + workspace.onDidChangeConfiguration( + async (event) => await detectConfigChange(event, context), + ), + ) + + const successMessage = showMessage('Activation succeeded!') + window.showInformationMessage(successMessage) + } catch { + const errorMessage = showMessage( + 'Activation failed! Something went wrong, please try again.', + ) + window.showErrorMessage(errorMessage) + } +} + +export function deactivate(): void { + const successMessage = showMessage('Deactivation succeeded!') + window.showInformationMessage(successMessage) +} diff --git a/src/extension/messages/index.ts b/src/extension/messages/index.ts new file mode 100644 index 0000000..2b416cd --- /dev/null +++ b/src/extension/messages/index.ts @@ -0,0 +1,5 @@ +import { extensionTitle, extensionVersion } from '@/extension/meta' + +export function showMessage(message: string): string { + return `${extensionTitle} (${extensionVersion}): ${message}` +} diff --git a/src/extension/meta/index.ts b/src/extension/meta/index.ts new file mode 100644 index 0000000..28548ee --- /dev/null +++ b/src/extension/meta/index.ts @@ -0,0 +1,8 @@ +import { version } from '../../../package.json' + +export const extensionVersion = version +export const extensionPublisher = 'hypernym-studio' +export const extensionName = 'hypernym-icons' +export const extensionId = `${extensionPublisher}.${extensionName}` +export const extensionTitle = 'Hypernym Icons' +export const extensionThemeFile = `${extensionName}.json` diff --git a/src/theme/default-names.ts b/src/theme/default-names.ts deleted file mode 100644 index 2319bf0..0000000 --- a/src/theme/default-names.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const defaultNames = { - file: 'file', - folder: 'folder', - folderExpanded: 'folder-open', -} diff --git a/src/theme/file-extensions.ts b/src/theme/file-extensions.ts index e35d314..eaa8697 100644 --- a/src/theme/file-extensions.ts +++ b/src/theme/file-extensions.ts @@ -1,30 +1,79 @@ -export const fileExtensions = { - html: 'html', - vue: 'html', - svelte: 'html', - astro: 'html', - jsx: 'html', - tsx: 'html', - css: 'style', - postcss: 'style', - scss: 'style', - sass: 'style', - less: 'style', - stylus: 'style', - json: 'json', - jpg: 'image', - jpeg: 'image', - png: 'image', - gif: 'image', - webp: 'image', - tiff: 'image', - ico: 'image', - svg: 'image', - otf: 'font', - ttf: 'font', - woff: 'font', - woff2: 'font', - sh: 'terminal', - bash: 'terminal', - zsh: 'terminal', -} +import { icons } from './icons' +import { configPatterns } from './patterns' +import { createIconMap } from './icon-map' + +export const fileExtensions = createIconMap([ + ...configPatterns, + { + icon: icons.document.id, + extensions: [ + 'md', + 'markdown', + 'txt', + 'text', + 'rtf', + 'rst', + 'rtx', + 'info', + 'note', + 'doc', + 'docx', + 'odt', + 'pages', + 'pdf', + ], + }, + { + icon: icons.font.id, + extensions: ['otf', 'ttf', 'woff', 'woff2', 'eot', 'font'], + }, + { + icon: icons.image.id, + extensions: [ + 'jpg', + 'jpeg', + 'png', + 'gif', + 'webp', + 'tif', + 'tiff', + 'ico', + 'icon', + 'svg', + 'eps', + 'psd', + 'avif', + 'dng', + 'exr', + 'img', + 'pic', + 'raw', + ], + }, + { + icon: icons.video.id, + extensions: [ + 'mp4', + 'mpeg', + 'mpg', + 'qt', + 'mov', + 'wmv', + 'avi', + 'flv', + 'webm', + 'mkv', + 'gifv', + 'ogv', + 'ogg', + ], + }, + { + icon: icons.audio.id, + extensions: ['mp3', 'wav', 'm4a', 'flac', 'wma', 'aiff', 'aac'], + }, + { + icon: icons['3d'].id, + extensions: ['blend', 'obj', 'fbx', 'dxf', 'mesh', 'gltf', 'glb', 'stl'], + }, +]) diff --git a/src/theme/file-names.ts b/src/theme/file-names.ts index 81e3902..9548688 100644 --- a/src/theme/file-names.ts +++ b/src/theme/file-names.ts @@ -1,146 +1,90 @@ -export const fileNames = { - 'eslint.config.js': 'config', - 'eslint.config.cjs': 'config', - 'eslint.config.mjs': 'config', - 'eslint.config.ts': 'config', - 'prettier.config.js': 'config', - 'prettier.config.cjs': 'config', - 'prettier.config.mjs': 'config', - 'prettier.config.ts': 'config', - 'stylelint.config.js': 'config', - 'stylelint.config.cjs': 'config', - 'stylelint.config.mjs': 'config', - 'stylelint.config.ts': 'config', - 'vite.config.js': 'config', - 'vite.config.cjs': 'config', - 'vite.config.mjs': 'config', - 'vite.config.ts': 'config', - 'postcss.config.js': 'config', - 'postcss.config.cjs': 'config', - 'postcss.config.mjs': 'config', - 'postcss.config.ts': 'config', - 'vitest.config.js': 'config', - 'vitest.config.cjs': 'config', - 'vitest.config.mjs': 'config', - 'vitest.config.ts': 'config', - 'rollup.config.js': 'config', - 'rollup.config.cjs': 'config', - 'rollup.config.mjs': 'config', - 'rollup.config.ts': 'config', - 'bundler.config.js': 'config', - 'bundler.config.cjs': 'config', - 'bundler.config.mjs': 'config', - 'bundler.config.ts': 'config', - 'hypernym.config.js': 'config', - 'hypernym.config.cjs': 'config', - 'hypernym.config.mjs': 'config', - 'hypernym.config.ts': 'config', - 'hyper.config.js': 'config', - 'hyper.config.cjs': 'config', - 'hyper.config.mjs': 'config', - 'hyper.config.ts': 'config', - 'webpack.config.js': 'config', - 'webpack.config.cjs': 'config', - 'webpack.config.mjs': 'config', - 'webpack.config.ts': 'config', - 'rspack.config.js': 'config', - 'rspack.config.cjs': 'config', - 'rspack.config.mjs': 'config', - 'rspack.config.ts': 'config', - 'rsbuild.config.js': 'config', - 'rsbuild.config.cjs': 'config', - 'rsbuild.config.mjs': 'config', - 'rsbuild.config.ts': 'config', - 'rolldown.config.js': 'config', - 'rolldown.config.cjs': 'config', - 'rolldown.config.mjs': 'config', - 'rolldown.config.ts': 'config', - 'webpack.mix.js': 'config', - 'webpack.mix.cjs': 'config', - 'webpack.mix.mjs': 'config', - 'webpack.mix.ts': 'config', - 'next.config.js': 'config', - 'next.config.cjs': 'config', - 'next.config.mjs': 'config', - 'next.config.ts': 'config', - 'turbo.json': 'config', - 'nuxt.config.js': 'config', - 'nuxt.config.cjs': 'config', - 'nuxt.config.mjs': 'config', - 'nuxt.config.ts': 'config', - 'nitro.config.js': 'config', - 'nitro.config.cjs': 'config', - 'nitro.config.mjs': 'config', - 'nitro.config.ts': 'config', - 'vue.config.js': 'config', - 'vue.config.cjs': 'config', - 'vue.config.mjs': 'config', - 'vue.config.ts': 'config', - 'svelte.config.js': 'config', - 'svelte.config.cjs': 'config', - 'svelte.config.mjs': 'config', - 'svelte.config.ts': 'config', - 'tailwind.config.js': 'config', - 'tailwind.config.cjs': 'config', - 'tailwind.config.mjs': 'config', - 'tailwind.config.ts': 'config', - 'astro.config.js': 'config', - 'astro.config.cjs': 'config', - 'astro.config.mjs': 'config', - 'astro.config.ts': 'config', - 'babel.config.js': 'config', - 'babel.config.cjs': 'config', - 'babel.config.mjs': 'config', - 'babel.config.ts': 'config', - 'babel.config.json': 'config', - 'renovate.json': 'config', - '.renovaterc.json': 'hidden', - '.eslintrc.js': 'hidden', - '.eslintrc.cjs': 'hidden', - '.prettierrc.js': 'hidden', - '.prettierrc.cjs': 'hidden', - '.stylelintrc.js': 'hidden', - '.stylelintrc.cjs': 'hidden', - '.pnpmfile.js': 'hidden', - '.pnpmfile.cjs': 'hidden', - '.hypernym': 'hidden', - '.hypernymrc': 'hidden', - '.hypernymconfig': 'hidden', - '.hyper': 'hidden', - '.hyperrc': 'hidden', - '.hyperconfig': 'hidden', - '.eslint': 'hidden', - '.eslintrc': 'hidden', - '.eslintignore': 'hidden', - '.prettier': 'hidden', - '.prettierrc': 'hidden', - '.prettierignore': 'hidden', - '.stylelint': 'hidden', - '.stylelintrc': 'hidden', - '.stylelintignore': 'hidden', - '.editorconfig': 'hidden', - '.gitignore': 'hidden', - '.gitkeep': 'hidden', - '.vscodeignore': 'hidden', - '.gitattributes': 'hidden', - '.npmrc': 'hidden', - '.vuerc': 'hidden', - '.nuxtrc': 'hidden', - '.nextrc': 'hidden', - '.swcrc': 'hidden', - '.renovaterc': 'hidden', - '.babelrc': 'hidden', - '.parcelrc': 'hidden', - '.env': 'hidden', - '.env.test': 'hidden', - '.env.example': 'hidden', - '.env.development': 'hidden', - '.env.production': 'hidden', - codeowners: 'verified', - license: 'copyright', - 'license.txt': 'copyright', - 'license.md': 'copyright', - 'license.rst': 'copyright', - 'readme.md': 'info', - 'readme.txt': 'info', -} +import { icons } from './icons' +import { configPatterns } from './patterns' +import { createIconMap } from './icon-map' + +export const fileNames = createIconMap([ + ...configPatterns, + { + icon: icons.document.id, + names: ['license', 'licence', 'copyright'], + }, + { + icon: icons.hidden.id, + names: [ + '.git', + '.gitignore', + '.gitattributes', + '.gitmodules', + '.gitmessage', + '.gitconfig', + '.gitkeep', + '.gitinclude', + '.gitpreserve', + '.keep', + ], + }, + { + icon: icons.hidden.id, + names: [ + '.env', + '.env.test', + '.env.example', + '.env.template', + '.env.local', + '.env.dev', + '.env.development', + '.env.alpha', + '.env.beta', + '.env.prod', + '.env.production', + '.env.preview', + ], + }, + { + icon: icons.hidden.id, + names: ['.editorconfig', '.vscodeignore'], + }, + { + icon: icons.hidden.id, + names: [ + '.npmrc', + '.vuerc', + '.nuxtrc', + '.nextrc', + '.swcrc', + '.babelrc', + '.parcelrc', + ], + }, + { + icon: icons.hidden.id, + names: ['.renovaterc', '.renovaterc.json'], + }, + { + icon: icons.hidden.id, + pattern: '.eslintrc.{js,mjs,cjs}', + names: ['.eslint', '.eslintrc', '.eslintignore'], + }, + { + icon: icons.hidden.id, + pattern: '.prettierrc.{js,mjs,cjs}', + names: ['.prettier', '.prettierrc', '.prettierignore'], + }, + { + icon: icons.hidden.id, + pattern: '.stylelintrc.{js,mjs,cjs}', + names: ['.stylelint', '.stylelintrc', '.stylelintignore'], + }, + { + icon: icons.hidden.id, + pattern: '.pnpmfile.{js,mjs,cjs}', + }, + { + icon: icons.hidden.id, + names: ['.hypernym', '.hypernymrc', '.hypernymconfig'], + }, + { + icon: icons.hidden.id, + names: ['.hyper', '.hyperrc', '.hyperconfig'], + }, +]) diff --git a/src/theme/fonts.ts b/src/theme/fonts.ts new file mode 100644 index 0000000..fb67ce1 --- /dev/null +++ b/src/theme/fonts.ts @@ -0,0 +1,18 @@ +import type { FontDefinition } from '@/types' + +export const fontId = 'hypernym-icons' + +export const fonts: FontDefinition[] = [ + { + id: fontId, + src: [ + { + path: `./${fontId}.woff`, + format: 'woff', + }, + ], + weight: 'normal', + style: 'normal', + size: '120%', + }, +] diff --git a/src/theme/icon-definitions.ts b/src/theme/icon-definitions.ts new file mode 100644 index 0000000..8468597 --- /dev/null +++ b/src/theme/icon-definitions.ts @@ -0,0 +1,41 @@ +import { icons } from './icons' +import { fontId } from './fonts' +import type { ExtensionConfig, IconDefinitions } from '@/types' + +export function createIconDefinitions( + config: ExtensionConfig, +): IconDefinitions { + const iconDefinitions: IconDefinitions = {} + + for (const [key, value] of Object.entries(icons)) { + const k = value.id + const isFolder = key.includes('folder') + + iconDefinitions[k] = { + fontId, + fontCharacter: value.char, + } + + if (isFolder) { + if (config.folders?.color || config.folders.opacity) { + iconDefinitions[k]['fontColor'] = + `color-mix(in srgb, ${config.folders.color || 'currentColor'} ${config.folders.opacity || '100%'}, transparent)` + } + + if (config.folders?.size) { + iconDefinitions[k]['fontSize'] = config.folders.size + } + } else { + if (config.icons?.color || config.icons.opacity) { + iconDefinitions[k]['fontColor'] = + `color-mix(in srgb, ${config.icons.color || 'currentColor'} ${config.icons.opacity || '100%'}, transparent)` + } + + if (config.icons?.size) { + iconDefinitions[k]['fontSize'] = config.icons.size + } + } + } + + return iconDefinitions +} diff --git a/src/theme/icon-map.ts b/src/theme/icon-map.ts new file mode 100644 index 0000000..ab5c327 --- /dev/null +++ b/src/theme/icon-map.ts @@ -0,0 +1,36 @@ +export interface IconMap { + icon: string + pattern?: string + extensions?: string[] + names?: string[] +} + +export function createIconMap(maps: IconMap[]): Record { + const iconMap: Record = {} + + for (const map of maps) { + if (map.extensions) { + for (const ext of map.extensions) iconMap[ext] = map.icon + } + + if (map.names) { + for (const name of map.names) iconMap[name] = map.icon + } + + if (map.pattern) { + const { pattern } = map + const patternSplit = pattern.split('.') + const patternExt = patternSplit.pop() + const ext = patternExt?.match(/\{([^)]+)\}/) + + if (ext) { + const name = patternSplit.join('.') + const splitExt = ext[1].split(',') + + for (const e of splitExt) iconMap[`${name}.${e}`] = map.icon + } else iconMap[pattern] = map.icon + } + } + + return iconMap +} diff --git a/src/theme/icons.ts b/src/theme/icons.ts new file mode 100644 index 0000000..bfcc563 --- /dev/null +++ b/src/theme/icons.ts @@ -0,0 +1,46 @@ +export const icons = { + file: { + id: '_file', + char: '\\e001', + }, + folder: { + id: '_folder', + char: '\\e002', + }, + folderOpen: { + id: '_folder-open', + char: '\\e003', + }, + config: { + id: '_config', + char: '\\e004', + }, + document: { + id: '_document', + char: '\\e005', + }, + font: { + id: '_font', + char: '\\e006', + }, + image: { + id: '_image', + char: '\\e007', + }, + video: { + id: '_video', + char: '\\e008', + }, + audio: { + id: '_audio', + char: '\\e009', + }, + '3d': { + id: '_3d', + char: '\\e010', + }, + hidden: { + id: '_hidden', + char: '\\e011', + }, +} diff --git a/src/theme/index.ts b/src/theme/index.ts index 64d23ad..9d6fbbd 100644 --- a/src/theme/index.ts +++ b/src/theme/index.ts @@ -1,26 +1,29 @@ -import { defaultNames } from './default-names' +import { icons } from './icons' +import { fonts } from './fonts' +import { createIconDefinitions } from './icon-definitions' import { fileExtensions } from './file-extensions' import { fileNames } from './file-names' -import { transformData, paths } from '@/utils' -import type { ThemeData } from '@/types' +import type { IconTheme, ExtensionConfig } from '@/types' -const { default: iconDefinitions }: ThemeData = await import( - paths.definitionsSchema -) +// VSCode API Documentation +// @link https://code.visualstudio.com/api/extension-guides/file-icon-theme -export const theme = JSON.stringify( - { - hidesExplorerArrows: true, +export function createIconTheme(config: ExtensionConfig): IconTheme { + const { hidesExplorerArrows } = config + + const iconDefinitions = createIconDefinitions(config) + + const customIconTheme: IconTheme = { + hidesExplorerArrows, + showLanguageModeIcons: false, iconDefinitions, - ...transformData(defaultNames, 'dark'), - fileExtensions: transformData(fileExtensions, 'dark'), - fileNames: transformData(fileNames, 'dark'), - light: { - ...transformData(defaultNames, 'light'), - fileExtensions: transformData(fileExtensions, 'light'), - fileNames: transformData(fileNames, 'light'), - }, - }, - null, - 2, -) + fonts, + file: icons.file.id, + folder: icons.folder.id, + folderExpanded: icons.folderOpen.id, + fileExtensions, + fileNames, + } + + return customIconTheme +} diff --git a/src/theme/patterns.ts b/src/theme/patterns.ts new file mode 100644 index 0000000..bafdede --- /dev/null +++ b/src/theme/patterns.ts @@ -0,0 +1,31 @@ +import { icons } from './icons' +import type { IconMap } from './icon-map' + +const configExts = 'js,mjs,cjs,ts,mts,cts,json,yml,yaml,toml' + +export const configPatterns: IconMap[] = [ + { + icon: icons.config.id, + pattern: `conf.{${configExts}}`, + }, + { + icon: icons.config.id, + pattern: `cnfg.{${configExts}}`, + }, + { + icon: icons.config.id, + pattern: `config.{${configExts}}`, + }, + { + icon: icons.config.id, + pattern: `configuration.{${configExts}}`, + }, + { + icon: icons.config.id, + pattern: `settings.{${configExts}}`, + }, + { + icon: icons.config.id, + pattern: `options.{${configExts}}`, + }, +] diff --git a/src/types/config.ts b/src/types/config.ts new file mode 100644 index 0000000..1bb08b1 --- /dev/null +++ b/src/types/config.ts @@ -0,0 +1,66 @@ +export interface ExtensionConfig { + /** + * Specifies the visibility of the explorer arrows. + * + * @default true + */ + hidesExplorerArrows: boolean + /** + * Folders options. + */ + folders: { + /** + * Specifies a custom color for folder icons. + * + * Accepts valid HEX color format. + * + * @default undefined + */ + color?: string + /** + * Specifies a custom opacity for folder icons. + * + * Accepts a percentage size format. + * + * @default undefined + */ + opacity?: string + /** + * Specifies a custom size for folder icons. + * + * Accepts a percentage size format. + * + * @default undefined + */ + size?: string + } + /** + * Icons options. + */ + icons: { + /** + * Specifies a custom color for all icons. + * + * Accepts valid HEX color format. + * + * @default undefined + */ + color?: string + /** + * Specifies a custom opacity for all icons. + * + * Accepts a percentage size format. + * + * @default undefined + */ + opacity?: string + /** + * Specifies a custom size for all icons. + * + * Accepts a percentage size format. + * + * @default undefined + */ + size?: string + } +} diff --git a/src/types/definitions.ts b/src/types/definitions.ts new file mode 100644 index 0000000..b5a8174 --- /dev/null +++ b/src/types/definitions.ts @@ -0,0 +1,21 @@ +export interface IconDefinition { + fontCharacter: string + fontId: string + fontColor?: string + fontSize?: string +} + +export interface IconDefinitions { + [key: string]: IconDefinition +} + +export interface FontDefinition { + id: string + src: { + path: string + format: string + }[] + weight?: string + style?: string + size?: string +} diff --git a/src/types/index.ts b/src/types/index.ts index fc6c2f6..d3287f5 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1 +1,3 @@ +export * from './definitions' export * from './theme' +export * from './config' diff --git a/src/types/theme.ts b/src/types/theme.ts index 3dd34e3..68d002b 100644 --- a/src/types/theme.ts +++ b/src/types/theme.ts @@ -1,7 +1,13 @@ -export interface ThemeData { - [key: string]: string -} +import type { FontDefinition, IconDefinitions } from './definitions' -export interface ThemeDefinitions { - [key: string]: ThemeData +export interface IconTheme { + hidesExplorerArrows: boolean + showLanguageModeIcons: boolean + iconDefinitions: IconDefinitions + fonts: FontDefinition[] + file: string + folder: string + folderExpanded: string + fileExtensions: Record + fileNames: Record } diff --git a/src/utils/build-start.ts b/src/utils/build-start.ts deleted file mode 100644 index 067e6a2..0000000 --- a/src/utils/build-start.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { parse } from 'node:path' -import { exists, write, copy, mkdir, remove } from '@hypernym/utils/fs' -import fg from 'fast-glob' -import { paths } from './paths' -import type { ThemeDefinitions } from '@/types' - -const { dirHypernym, dirDist, dirPublic, definitionsSchema } = paths - -async function createDirectories(): Promise { - if (!(await exists(dirHypernym))) await mkdir(dirHypernym) - if (!(await exists(dirDist))) await mkdir(dirDist) - else { - const files = await fg([`${dirDist}/**`], { onlyFiles: false, deep: 1 }) - for (const file of files) { - await remove(file, { recursive: true, force: true }) - } - } - return await copy(dirPublic, dirDist) -} - -async function createIconDefinitions(): Promise { - const definitionsData: ThemeDefinitions = {} - const icons = await fg([`${dirPublic}/icons/*.svg`]) - - for (const icon of icons) { - const iconName = parse(icon).name - - definitionsData[`_${iconName}`] = { - iconPath: `./icons/${iconName}.svg`, - } - } - - return await write( - definitionsSchema, - `export default ${JSON.stringify(definitionsData, null, 2)}`, - ) -} - -async function run(): Promise { - try { - await createDirectories() - await createIconDefinitions() - } catch (e) { - console.error(e) - process.exit(1) - } -} - -run() diff --git a/src/utils/index.ts b/src/utils/index.ts index e68af06..676f1e5 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,2 +1 @@ export * from './paths' -export * from './transform-data' diff --git a/src/utils/paths.ts b/src/utils/paths.ts index 3516b7b..90fee6d 100644 --- a/src/utils/paths.ts +++ b/src/utils/paths.ts @@ -1,19 +1,18 @@ -import { fileURLToPath } from 'node:url' +import { cwd } from 'node:process' +import { resolve } from 'node:path' +import { extensionThemeFile } from '@/extension/meta' -const dirRoot = fileURLToPath(new URL('../../', import.meta.url)) -const dirHypernym = `${dirRoot}.hypernym` -const dirDist = `${dirRoot}dist` -const dirSrc = `${dirRoot}src` -const dirPublic = `${dirSrc}/public` -const definitionsSchema = `${dirHypernym}/definitions.js` -const extensionFile = `${dirDist}/extension.json` +const dirRoot = cwd() export const paths = { - dirRoot, - dirHypernym, - dirDist, - dirSrc, - dirPublic, - definitionsSchema, - extensionFile, + dir: { + root: dirRoot, + dist: resolve(dirRoot, 'dist'), + static: resolve(dirRoot, 'static'), + icons: resolve(dirRoot, 'icons'), + src: resolve(dirRoot, 'src'), + }, + file: { + theme: resolve(dirRoot, 'dist', extensionThemeFile), + }, } diff --git a/src/utils/transform-data.ts b/src/utils/transform-data.ts deleted file mode 100644 index 1ac811f..0000000 --- a/src/utils/transform-data.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { ThemeData } from '@/types' - -export function transformData(data: ThemeData, theme: string): ThemeData { - const transformedData: ThemeData = {} - - for (const [key, value] of Object.entries(data)) - transformedData[key] = `_${value}_${theme}` - - return transformedData -} diff --git a/static/hypernym-icons.woff b/static/hypernym-icons.woff new file mode 100644 index 0000000..574164b Binary files /dev/null and b/static/hypernym-icons.woff differ diff --git a/static/icon.png b/static/icon.png new file mode 100644 index 0000000..608ca79 Binary files /dev/null and b/static/icon.png differ