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