From 0aba21aecd26f53500998f97501ea005479373b6 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Wed, 2 Oct 2024 20:04:33 +0200 Subject: [PATCH 01/38] feat: add new config system --- README.md | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 17b708b..250f113 100644 --- a/README.md +++ b/README.md @@ -8,11 +8,11 @@

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

@@ -22,15 +22,11 @@
-## Extension - -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. - ## 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 From 223159d8997df9f9d63122aa1099834f7047c9f0 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Wed, 2 Oct 2024 20:56:33 +0200 Subject: [PATCH 02/38] chore: update package config and dependencies --- package.json | 73 +++++-- pnpm-lock.yaml | 576 +++++++++++++++++++++++++++++++++++-------------- 2 files changed, 472 insertions(+), 177 deletions(-) diff --git a/package.json b/package.json index 4499b95..d7b327f 100644 --- a/package.json +++ b/package.json @@ -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,65 @@ "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` \n\n **Example:** `true`, `false`" + }, + "hypernym-icons.folders.color": { + "order": 2, + "type": "string", + "default": null, + "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.icons.color": { + "order": 3, + "type": "string", + "default": null, + "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.icons.fontSize": { + "order": 4, + "type": "string", + "default": null, + "markdownDescription": "Specifies a custom font size for all icons. Accepts a percentage size format. \n\n **Default:** `125%` \n\n **Example:** `100%`, `120%`, `130%`" + } + } + } }, "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.0", "engines": { - "vscode": ">=1.69.0", + "vscode": "^1.93.0", "node": ">=20.0.0", "pnpm": ">=9.0.0" }, @@ -86,12 +124,13 @@ "@hypernym/eslint-config": "^3.5.0", "@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.4", + "@types/vscode": "^1.93.0", + "@vscode/vsce": "^3.1.1", + "esbuild": "^0.24.0", + "eslint": "^9.11.1", "prettier": "^3.3.3", - "typescript": "^5.6.2" + "typescript": "^5.5.4" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ed3759c..fd8645e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,34 +10,37 @@ importers: devDependencies: '@hypernym/eslint-config': specifier: ^3.5.0 - version: 3.5.0(eslint@9.10.0)(typescript@5.6.2) + version: 3.5.0(eslint@9.11.1)(typescript@5.5.4) '@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.4)(typescript@5.5.4) '@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.4)(typescript@5.5.4) '@types/node': - specifier: ^22.5.5 - version: 22.5.5 + specifier: ^22.7.4 + version: 22.7.4 + '@types/vscode': + specifier: ^1.93.0 + version: 1.93.0 '@vscode/vsce': - specifier: ^3.1.0 - version: 3.1.0 + specifier: ^3.1.1 + version: 3.1.1 + 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.11.1 + version: 9.11.1 prettier: specifier: ^3.3.3 version: 3.3.3 typescript: - specifier: ^5.6.2 - version: 5.6.2 + specifier: ^5.5.4 + version: 5.5.4 packages: @@ -77,18 +80,162 @@ packages: 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.24.0': + resolution: {integrity: sha512-JGNV9hTYAa7lsum9IMIibn2kKczAojNihGo1hi7pG0kNrcKej530Fl6jxwM05A44/6I079CSn6WxYxbVhKUmWg==} 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.14.0': + resolution: {integrity: sha512-rrfzIpG3Q1rHjVYZmHAEDidWAZZ2cgkxlIcMQ8dHebRISaZ2KCV33Q8Vs+uaV6lxweROabNxKFlR2lIKagZqYg==} 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,20 +250,24 @@ packages: resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@0.6.0': + resolution: {integrity: sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==} + 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.11.1': + resolution: {integrity: sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA==} 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.0': + resolution: {integrity: sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@humanwhocodes/module-importer@1.0.1': @@ -175,8 +326,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 +354,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 +366,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.4': + resolution: {integrity: sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==} + + '@types/vscode@1.93.0': + resolution: {integrity: sha512-kUK6jAHSR5zY8ps42xuW89NLcBpw1kOabah7yv38J8MyiYuOHxLQBi0e7zeXbQgVefDy/mZZetqEFC+Fl5eIEQ==} - '@typescript-eslint/eslint-plugin@8.6.0': - resolution: {integrity: sha512-UOaz/wFowmoh2G6Mr9gw60B1mm0MzUtm6Ic8G2yM1Le6gyj5Loi/N+O5mocugRGY+8OeeKmkMmbxNqUCq3B4Sg==} + '@typescript-eslint/eslint-plugin@8.8.0': + resolution: {integrity: sha512-wORFWjU30B2WJ/aXBfOm1LX9v9nyt9D3jsSOxC3cCaTQGCW5k4jNpmjFv3U7p/7s4yvdjHzwtv2Sd2dOyhjS0A==} 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 +383,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.6.0': - resolution: {integrity: sha512-eQcbCuA2Vmw45iGfcyG4y6rS7BhWfz9MQuk409WD47qMM+bKCGQWXxvoOs1DUp+T7UBMTtRTVT+kXr7Sh4O9Ow==} + '@typescript-eslint/parser@8.8.0': + resolution: {integrity: sha512-uEFUsgR+tl8GmzmLjRqz+VrDv4eoaMqMXW7ruXfgThaAShO9JTciKpEsB+TvnfFfbg5IpujgMXVV36gOJRLtZg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -243,12 +393,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.8.0': + resolution: {integrity: sha512-EL8eaGC6gx3jDd8GwEFEV091210U97J0jeEHrAYvIYosmEGet4wJ+g0SYmLu+oRiAwbSA5AVrt6DxLHfdd+bUg==} 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.8.0': + resolution: {integrity: sha512-IKwJSS7bCqyCeG4NVGxnOP6lLT9Okc3Zj8hLO96bpMkJab+10HIfJbMouLrlpyOr3yrQ1cA413YPFiGd1mW9/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -256,12 +406,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@8.6.0': - resolution: {integrity: sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw==} + '@typescript-eslint/types@8.8.0': + resolution: {integrity: sha512-QJwc50hRCgBd/k12sTykOJbESe1RrzmX6COk8Y525C9l7oweZ+1lw9JiU56im7Amm8swlz00DRIlxMYLizr2Vw==} 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.8.0': + resolution: {integrity: sha512-ZaMJwc/0ckLz5DaAZ+pNLmHv8AMVGtfWxZe/x2JVEkD5LnmhWiQMMcYT7IY7gkdJuzJ9P14fRy28lUrlDSWYdw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -269,14 +419,14 @@ packages: typescript: optional: true - '@typescript-eslint/utils@8.6.0': - resolution: {integrity: sha512-eNp9cWnYf36NaOVjkEUznf6fEgVy1TWpE0o52e4wtojjBx7D1UV2WAWGzR+8Y5lVFtpMLPwNbC67T83DWSph4A==} + '@typescript-eslint/utils@8.8.0': + resolution: {integrity: sha512-QE2MgfOTem00qrlPgyByaCHay9yb1+9BjnMFnSFkUKQfu7adBXDTnCAivURnuPPAG/qiB+kzKkZKmKfaMT0zVg==} 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.8.0': + resolution: {integrity: sha512-8mq51Lx6Hpmd7HnA2fcHQo3YgfX1qbccxQOgZcb4tvasu//zXRaA1j5ZRFeCw/VRAdFi4mRM9DnZw0Nu0Q2d1g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vscode/vsce-sign-alpine-arm64@2.0.2': @@ -327,8 +477,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.1.1': + resolution: {integrity: sha512-N62Ca9ElRPLUUzf7l9CeEBlLrYzFPRQq7huKk4pVW+LjIOSXfFIPudixn5QvZcz+yXDOh15IopI3K2o3y9666Q==} engines: {node: '>= 20'} hasBin: true @@ -553,6 +703,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 +716,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.11.1: + resolution: {integrity: sha512-MobhYKIoAO1s1e4VUrgx1l1Sk2JBR/Gqjjgw8+mfgoLE2xwsHur4gdfTxyTgShrhvdVFTaJSgMiQBl1jv/AWxg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -583,8 +738,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: @@ -687,8 +842,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.9.0: - resolution: {integrity: sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==} + globals@15.10.0: + resolution: {integrity: sha512-tqFIbz83w4Y5TCbtgjZjApohbuh7K9BxGYFm7ifwDR240tvdb7P9x+/9VvUKlmkPoiknoJtanI8UOrqxS3a7lQ==} engines: {node: '>=18'} gopd@1.0.1: @@ -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.68.0: + resolution: {integrity: sha512-7vbj10trelExNjFSBm5kTvZXXa7pZyKWx9RCKIyqe6I9Ev3IzGpQoqBP3a+cOdxY+pWj6VkP28n/2wWysBHD/A==} 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==} @@ -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.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} engines: {node: '>=14.17'} hasBin: true @@ -1335,8 +1490,8 @@ snapshots: '@azure/core-tracing': 1.1.2 '@azure/core-util': 1.10.0 '@azure/logger': 1.1.4 - '@azure/msal-browser': 3.23.0 - '@azure/msal-node': 2.13.1 + '@azure/msal-browser': 3.24.0 + '@azure/msal-node': 2.14.0 events: 3.3.0 jws: 4.0.0 open: 8.4.2 @@ -1349,21 +1504,93 @@ snapshots: dependencies: tslib: 2.7.0 - '@azure/msal-browser@3.23.0': + '@azure/msal-browser@3.24.0': 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.14.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.11.1)': dependencies: - eslint: 9.10.0 + eslint: 9.11.1 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.11.1': {} @@ -1376,11 +1603,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@eslint/core@0.6.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,11 +1619,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.10.0': {} + '@eslint/js@9.11.1': {} '@eslint/object-schema@2.1.4': {} - '@eslint/plugin-kit@0.1.0': + '@eslint/plugin-kit@0.2.0': dependencies: levn: 0.4.1 @@ -1402,17 +1631,17 @@ snapshots: '@humanwhocodes/retry@0.3.0': {} - '@hypernym/eslint-config@3.5.0(eslint@9.10.0)(typescript@5.6.2)': + '@hypernym/eslint-config@3.5.0(eslint@9.11.1)(typescript@5.5.4)': dependencies: - '@eslint/js': 9.10.0 + '@eslint/js': 9.11.1 '@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.8.0(@typescript-eslint/parser@8.8.0(eslint@9.11.1)(typescript@5.5.4))(eslint@9.11.1)(typescript@5.5.4) + '@typescript-eslint/parser': 8.8.0(eslint@9.11.1)(typescript@5.5.4) + eslint: 9.11.1 + globals: 15.10.0 optionalDependencies: - typescript: 5.6.2 + typescript: 5.5.4 transitivePeerDependencies: - supports-color @@ -1420,16 +1649,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.4)(typescript@5.5.4)': dependencies: - typescript: 5.6.2 + typescript: 5.5.4 optionalDependencies: - '@types/node': 22.5.5 + '@types/node': 22.7.4 - '@hypernym/utils@3.3.0(@types/node@22.5.5)(typescript@5.6.2)': + '@hypernym/utils@3.4.0(@types/node@22.7.4)(typescript@5.5.4)': optionalDependencies: - '@types/node': 22.5.5 - typescript: 5.6.2 + '@types/node': 22.7.4 + typescript: 5.5.4 '@isaacs/cliui@8.0.2': dependencies: @@ -1452,9 +1681,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 +1694,91 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@22.5.5': + '@types/node@22.7.4': 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.93.0': {} + + '@typescript-eslint/eslint-plugin@8.8.0(@typescript-eslint/parser@8.8.0(eslint@9.11.1)(typescript@5.5.4))(eslint@9.11.1)(typescript@5.5.4)': 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.8.0(eslint@9.11.1)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 8.8.0 + '@typescript-eslint/type-utils': 8.8.0(eslint@9.11.1)(typescript@5.5.4) + '@typescript-eslint/utils': 8.8.0(eslint@9.11.1)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.8.0 + eslint: 9.11.1 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.5.4) optionalDependencies: - typescript: 5.6.2 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.6.0(eslint@9.10.0)(typescript@5.6.2)': + '@typescript-eslint/parser@8.8.0(eslint@9.11.1)(typescript@5.5.4)': 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.8.0 + '@typescript-eslint/types': 8.8.0 + '@typescript-eslint/typescript-estree': 8.8.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.8.0 debug: 4.3.7 - eslint: 9.10.0 + eslint: 9.11.1 optionalDependencies: - typescript: 5.6.2 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.6.0': + '@typescript-eslint/scope-manager@8.8.0': dependencies: - '@typescript-eslint/types': 8.6.0 - '@typescript-eslint/visitor-keys': 8.6.0 + '@typescript-eslint/types': 8.8.0 + '@typescript-eslint/visitor-keys': 8.8.0 - '@typescript-eslint/type-utils@8.6.0(eslint@9.10.0)(typescript@5.6.2)': + '@typescript-eslint/type-utils@8.8.0(eslint@9.11.1)(typescript@5.5.4)': 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.8.0(typescript@5.5.4) + '@typescript-eslint/utils': 8.8.0(eslint@9.11.1)(typescript@5.5.4) debug: 4.3.7 - ts-api-utils: 1.3.0(typescript@5.6.2) + ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: - typescript: 5.6.2 + typescript: 5.5.4 transitivePeerDependencies: - eslint - supports-color - '@typescript-eslint/types@8.6.0': {} + '@typescript-eslint/types@8.8.0': {} - '@typescript-eslint/typescript-estree@8.6.0(typescript@5.6.2)': + '@typescript-eslint/typescript-estree@8.8.0(typescript@5.5.4)': dependencies: - '@typescript-eslint/types': 8.6.0 - '@typescript-eslint/visitor-keys': 8.6.0 + '@typescript-eslint/types': 8.8.0 + '@typescript-eslint/visitor-keys': 8.8.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.5.4) optionalDependencies: - typescript: 5.6.2 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.6.0(eslint@9.10.0)(typescript@5.6.2)': + '@typescript-eslint/utils@8.8.0(eslint@9.11.1)(typescript@5.5.4)': 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.11.1) + '@typescript-eslint/scope-manager': 8.8.0 + '@typescript-eslint/types': 8.8.0 + '@typescript-eslint/typescript-estree': 8.8.0(typescript@5.5.4) + eslint: 9.11.1 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@8.6.0': + '@typescript-eslint/visitor-keys@8.8.0': dependencies: - '@typescript-eslint/types': 8.6.0 + '@typescript-eslint/types': 8.8.0 eslint-visitor-keys: 3.4.3 '@vscode/vsce-sign-alpine-arm64@2.0.2': @@ -1592,7 +1820,7 @@ 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.1.1': dependencies: '@azure/identity': 4.4.1 '@vscode/vsce-sign': 2.0.4 @@ -1860,38 +2088,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.11.1: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1) '@eslint-community/regexpp': 4.11.1 '@eslint/config-array': 0.18.0 + '@eslint/core': 0.6.0 '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.10.0 - '@eslint/plugin-kit': 0.1.0 + '@eslint/js': 9.11.1 + '@eslint/plugin-kit': 0.2.0 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.3.0 '@nodelib/fs.walk': 1.2.8 + '@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 @@ -1912,11 +2170,11 @@ snapshots: 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 + eslint-visitor-keys: 4.1.0 esquery@1.6.0: dependencies: @@ -2015,15 +2273,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.10.0: {} gopd@1.0.1: dependencies: @@ -2114,11 +2372,9 @@ snapshots: 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 +2528,7 @@ snapshots: natural-compare@1.4.0: {} - node-abi@3.67.0: + node-abi@3.68.0: dependencies: semver: 7.6.3 optional: true @@ -2314,7 +2570,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: @@ -2358,7 +2614,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.68.0 pump: 3.0.2 rc: 1.2.8 simple-get: 4.0.1 @@ -2522,9 +2778,9 @@ 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.5.4): dependencies: - typescript: 5.6.2 + typescript: 5.5.4 tslib@2.7.0: {} @@ -2545,7 +2801,7 @@ snapshots: tunnel: 0.0.6 underscore: 1.13.7 - typescript@5.6.2: {} + typescript@5.5.4: {} uc.micro@2.1.0: {} From 6adeeea368136c5a799394dc858b3e036fc595a4 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Thu, 3 Oct 2024 12:52:11 +0200 Subject: [PATCH 03/38] refactor: add static dir --- static/hypernym-icons.woff | Bin 0 -> 3832 bytes static/icon.png | Bin 0 -> 27791 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 static/hypernym-icons.woff create mode 100644 static/icon.png diff --git a/static/hypernym-icons.woff b/static/hypernym-icons.woff new file mode 100644 index 0000000000000000000000000000000000000000..574164b08be2339197e3c0cf9efc3b7a5ec53872 GIT binary patch literal 3832 zcmbVOZA@F&89wj5_BA%wUl(Iz?0~Vc4JHsU{@5Cd$()3Q5AhX}jdV)g;6Ofr2uK2& zHl>;}rE8;XRr+K5L8Yn9rckxgmPnJjYG{qLsq3FM%2ZWtgy6@dt=qq<{ZU``oO`bc ztkV?r*yo)0^W68m?>X;#t_&SM%!r{mzGRi!{DzKmcy}8b+m~dFDnNafcc;4)JUvsm z2--C8XLw&9UVnG0u)t~efpb~jT~im9&w%zmW4435PyFRG&vdac$(ZZ{Kf`--`j4Ma zg9zFY;ElXnUKJlq&nzy1b^$o2AL+($VeT}Sy9+SJd)04U|DGu<;k)uDz(ZR1v2(M9 znIdRk;oBecKKRoVG;ZNXj@JMB#MvdXUxo)@CyM}vYYx$|74wH1-`QpH+fg< zVQk$au5GQc9uXZp&8LP;NSn2<01AS~;UGpX6=Wt&Lx!gWz{Eo9)^*QTX=_W<3$4?- zOT%buGbGlR3_Xph4a5ktPQDr}V6Z@7EcylO_Y;QBWaeowGwD=Je9^C5@+*q}lHz|1spDU# z`Gp?Eul92>y2mx{aqyo1@1y~0{|*|se8cb_Y`qIx8(24+fVE!9;vkqAkEOERx4(J&GuLadKyq0MH+al5TXWz2ce6Lh;0K8E@IlC1<);y z3Zh641<`C0ttRzhy1ze7tLc7$#{7zUT#FD(My?7!5G6r)NF+@!E)PMtmV~+C?rvQn4>W17Ss~eKTt%NP3 zbY#rzbC@bjio>F&pMU<0@Sv`))T+Q{hx>yM>`pmedlMH$IZd^uom_d zV^usPNpH0gp)3y>-==oaI?0%Is(BX{S;Zw9;~`MrQ2cv^aSoR5=rJkJz|_w;zbq?+ zIL!Mi`h@%V(66{_Yu$=}tqg3Ru@%_rW$lQ<_MOY&PNlM$WIcI37I?}@4xSI{N%vDG zwGX!~6&F`FEKX~M(<00F@5{11V&AaaOPhR_EEZ`OlYX@+p@H}AecTp1L~++bvb-rd ztyZVBiwoOyKl1!liHzEcyue6HSKN)^Sd{0o?eh-jlE>?#3{2#Cj60Fi{F)$0)UMwW z+8+(n#$vUBs4z6ys~+f`ob08w-pNvr*+iM9$@p?IqUIVqg!8{QIVvg~X7z!IXf2Wy z&g*K?iz?$vf;Otmrc}_01U3JJ#u_`I%i8{Gw%H{0E+r#|{l9_zcAU2?!x4lFx#>^q z`-tn|*Uy6ao2Ik0&{B?ZN3f|W7-(t=(3>vj$+5BP*T=?AI$b;Aahvr}{@}u5{@@|2 z&1yT8&o3_K^ML7{-|_RphezB)+*AKr9vz$XqD_vCF7JfT%XqB78;bz&YV|#OnI>leQu^a!oJUxgh{+2yA_vW}eW$VpE zZ*_HV;-*#Rcy8~_J@E6wZuEa@;OOqi-F<8beu!lCBHDsmgOVmWK`8^;DcDbza@n;Y zCq2cpQI0xy!bZ->c3L80%L~dCzSkK=@G43`s9FW!R)Rv+%bdKEO9HuT$a9BF8n7m# zE-9;3cj!D4jJx)AsDl4idFFWn48?!j9TckFZy6J(tgdeF?-lKA$B|2otEi_ro>(PM zJ&H50yV^z&qf~4kiAYE4FS&(u1~I8aozxSDKMewbk!9t?O% zc(q4@h4hz1oIgD9uIP}oM}v-w$KnJSFNcflX-n$P@t4Q7CX_}*4*6MdLkOD^~a)1-QBhR?%b7V ztVT#-xmE6faV&1PXK%=IX_I&h)vsK;_MXcl5-Bw`NxMB+Q=_0(SGnH1c5S6TM8Xe6 zlh5moM!nTFCh^vp;?+>S)mk6AT0C z=5KqvJG2HJ?fuIW8JhU1wvq-LgQ9bEjH_|{n{;gj8}qO_w#ZcKqglF59}DfmkAz3! zcg0Uk1E!bEVMy`4C~Vp=scfmHZVV3greP?bvspkhsCZ}DX*LIJ;dpU=;q2UOsH3f&9oIw_z~rnD>tJoH z{mGYla>>!+)TIlBc{Yjlt(J}e literal 0 HcmV?d00001 diff --git a/static/icon.png b/static/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..608ca7901f492846a39a84615c511e1a9ba46e80 GIT binary patch literal 27791 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 Date: Thu, 3 Oct 2024 13:20:09 +0200 Subject: [PATCH 04/38] docs: update readme --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 250f113..3bc3df3 100644 --- a/README.md +++ b/README.md @@ -26,10 +26,12 @@ ### Marketplace -Install [Hypernym Icons](<(https://marketplace.visualstudio.com/items?itemName=hypernym-studio.hypernym-icons)>) extension from the official VSCode Marketplace. +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). - Run the `Extensions: Install from VSIX` command. From ce645bd5661d0a7ffcea49aaffb19d6bcdb8dbd1 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Thu, 3 Oct 2024 16:54:26 +0200 Subject: [PATCH 05/38] chore: update config descriptions --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index d7b327f..99031cc 100644 --- a/package.json +++ b/package.json @@ -65,25 +65,25 @@ "order": 1, "type": "boolean", "default": true, - "markdownDescription": "Specifies the visibility of the explorer arrows. \n\n **Default:** `true` \n\n **Example:** `true`, `false`" + "markdownDescription": "Specifies the visibility of the explorer arrows. \n\n Default: `true`" }, "hypernym-icons.folders.color": { "order": 2, "type": "string", "default": null, - "markdownDescription": "Specifies a custom color for folder icons. Accepts valid HEX color format. \n\n **Default:** `undefined` \n\n **Example:** `#fff`, `#ffffff`, `#ffffff33`" + "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.icons.color": { "order": 3, "type": "string", "default": null, - "markdownDescription": "Specifies a custom color for folder icons. Accepts valid HEX color format. \n\n **Default:** `undefined` \n\n **Example:** `#fff`, `#ffffff`, `#ffffff33`" + "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.icons.fontSize": { "order": 4, "type": "string", "default": null, - "markdownDescription": "Specifies a custom font size for all icons. Accepts a percentage size format. \n\n **Default:** `125%` \n\n **Example:** `100%`, `120%`, `130%`" + "markdownDescription": "Specifies a custom font size for all icons. Accepts a percentage size format. \n\n Default `125%` \n\n Example: `130%`" } } } From d912258a9055873083136718e2f59d2f6273d4a5 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Thu, 3 Oct 2024 17:52:18 +0200 Subject: [PATCH 06/38] chore: add build scripts --- scripts/build-bundle.ts | 17 +++++++++++++++++ scripts/build-static.ts | 8 ++++++++ scripts/build-theme.ts | 11 +++++++++++ scripts/build-watch.ts | 21 +++++++++++++++++++++ scripts/esbuild.config.ts | 11 +++++++++++ scripts/replace.ts | 26 -------------------------- 6 files changed, 68 insertions(+), 26 deletions(-) create mode 100644 scripts/build-bundle.ts create mode 100644 scripts/build-static.ts create mode 100644 scripts/build-theme.ts create mode 100644 scripts/build-watch.ts create mode 100644 scripts/esbuild.config.ts delete mode 100644 scripts/replace.ts diff --git a/scripts/build-bundle.ts b/scripts/build-bundle.ts new file mode 100644 index 0000000..8f343f2 --- /dev/null +++ b/scripts/build-bundle.ts @@ -0,0 +1,17 @@ +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, +} + +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..55adfd9 --- /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.dirStatic, paths.dirDist) +} + +buildStaticDir() diff --git a/scripts/build-theme.ts b/scripts/build-theme.ts new file mode 100644 index 0000000..57d4060 --- /dev/null +++ b/scripts/build-theme.ts @@ -0,0 +1,11 @@ +import { write } from '@hypernym/utils/fs' +import { paths } from '@/utils' +import { createIconTheme } from '@/theme' + +async function buildTheme(): Promise { + const theme = createIconTheme() + const json = JSON.stringify(theme, null, 2) + await write(paths.themeFile, 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') From 018491e9232bf3ecbace72d6b9aeee41879648f6 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Fri, 4 Oct 2024 20:09:43 +0200 Subject: [PATCH 07/38] chore: update config props --- package.json | 24 +++++++++++++++--------- pnpm-lock.yaml | 10 +++++----- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 99031cc..fa810b6 100644 --- a/package.json +++ b/package.json @@ -70,20 +70,26 @@ "hypernym-icons.folders.color": { "order": 2, "type": "string", - "default": null, + "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.icons.color": { + "hypernym-icons.folders.size": { "order": 3, "type": "string", - "default": null, - "markdownDescription": "Specifies a custom color for folder icons. Accepts valid HEX color format. \n\n Default: `undefined` \n\n Example: `#fff`, `#ffffff`, `#ffffff33`" + "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.fontSize": { + "hypernym-icons.icons.color": { "order": 4, "type": "string", - "default": null, - "markdownDescription": "Specifies a custom font size for all icons. Accepts a percentage size format. \n\n Default `125%` \n\n Example: `130%`" + "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.size": { + "order": 5, + "type": "string", + "default": "", + "markdownDescription": "Specifies a custom size for all icons. Accepts a percentage size format. \n\n Default: `undefined` \n\n Example: `130%`" } } } @@ -104,7 +110,7 @@ "sideEffects": false, "packageManager": "pnpm@9.12.0", "engines": { - "vscode": "^1.93.0", + "vscode": "^1.94.0", "node": ">=20.0.0", "pnpm": ">=9.0.0" }, @@ -126,7 +132,7 @@ "@hypernym/tsconfig": "^2.4.0", "@hypernym/utils": "^3.4.0", "@types/node": "^22.7.4", - "@types/vscode": "^1.93.0", + "@types/vscode": "^1.94.0", "@vscode/vsce": "^3.1.1", "esbuild": "^0.24.0", "eslint": "^9.11.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fd8645e..bfeecf6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,8 +24,8 @@ importers: specifier: ^22.7.4 version: 22.7.4 '@types/vscode': - specifier: ^1.93.0 - version: 1.93.0 + specifier: ^1.94.0 + version: 1.94.0 '@vscode/vsce': specifier: ^3.1.1 version: 3.1.1 @@ -369,8 +369,8 @@ packages: '@types/node@22.7.4': resolution: {integrity: sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==} - '@types/vscode@1.93.0': - resolution: {integrity: sha512-kUK6jAHSR5zY8ps42xuW89NLcBpw1kOabah7yv38J8MyiYuOHxLQBi0e7zeXbQgVefDy/mZZetqEFC+Fl5eIEQ==} + '@types/vscode@1.94.0': + resolution: {integrity: sha512-UyQOIUT0pb14XSqJskYnRwD2aG0QrPVefIfrW1djR+/J4KeFQ0i1+hjZoaAmeNf3Z2jleK+R2hv+EboG/m8ruw==} '@typescript-eslint/eslint-plugin@8.8.0': resolution: {integrity: sha512-wORFWjU30B2WJ/aXBfOm1LX9v9nyt9D3jsSOxC3cCaTQGCW5k4jNpmjFv3U7p/7s4yvdjHzwtv2Sd2dOyhjS0A==} @@ -1698,7 +1698,7 @@ snapshots: dependencies: undici-types: 6.19.8 - '@types/vscode@1.93.0': {} + '@types/vscode@1.94.0': {} '@typescript-eslint/eslint-plugin@8.8.0(@typescript-eslint/parser@8.8.0(eslint@9.11.1)(typescript@5.5.4))(eslint@9.11.1)(typescript@5.5.4)': dependencies: From 9d7751e438c18b9b1317f475d10b01df97ca4f39 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Fri, 4 Oct 2024 20:10:33 +0200 Subject: [PATCH 08/38] chore: update build scripts --- scripts/build-bundle.ts | 3 +++ scripts/build-static.ts | 2 +- scripts/build-theme.ts | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/scripts/build-bundle.ts b/scripts/build-bundle.ts index 8f343f2..b3f98d8 100644 --- a/scripts/build-bundle.ts +++ b/scripts/build-bundle.ts @@ -10,6 +10,9 @@ const options: BuildOptions = { minify: isProduction, } +// VSCode API Documentation +// @link https://code.visualstudio.com/api/working-with-extensions/bundling-extension + async function buildBundle(): Promise { await build(options) } diff --git a/scripts/build-static.ts b/scripts/build-static.ts index 55adfd9..ab71e24 100644 --- a/scripts/build-static.ts +++ b/scripts/build-static.ts @@ -2,7 +2,7 @@ import { copy } from '@hypernym/utils/fs' import { paths } from '@/utils' async function buildStaticDir(): Promise { - await copy(paths.dirStatic, paths.dirDist) + await copy(paths.dir.static, paths.dir.dist) } buildStaticDir() diff --git a/scripts/build-theme.ts b/scripts/build-theme.ts index 57d4060..7ee58e8 100644 --- a/scripts/build-theme.ts +++ b/scripts/build-theme.ts @@ -5,7 +5,7 @@ import { createIconTheme } from '@/theme' async function buildTheme(): Promise { const theme = createIconTheme() const json = JSON.stringify(theme, null, 2) - await write(paths.themeFile, json) + await write(paths.file.theme, json) } buildTheme() From 4914cbeeda05914edcdf34c655f46df85fee4818 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Fri, 4 Oct 2024 20:11:51 +0200 Subject: [PATCH 09/38] refactor: update utils --- src/utils/build-start.ts | 49 ------------------------------------- src/utils/index.ts | 2 +- src/utils/meta.ts | 5 ++++ src/utils/paths.ts | 29 +++++++++++----------- src/utils/transform-data.ts | 10 -------- 5 files changed, 20 insertions(+), 75 deletions(-) delete mode 100644 src/utils/build-start.ts create mode 100644 src/utils/meta.ts delete mode 100644 src/utils/transform-data.ts 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..94630fa 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,2 +1,2 @@ +export * from './meta' export * from './paths' -export * from './transform-data' diff --git a/src/utils/meta.ts b/src/utils/meta.ts new file mode 100644 index 0000000..175a116 --- /dev/null +++ b/src/utils/meta.ts @@ -0,0 +1,5 @@ +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/utils/paths.ts b/src/utils/paths.ts index 3516b7b..87ba5c1 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 './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 -} From 986bb73dee36b501d15c162843ede799490bc4d1 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Fri, 4 Oct 2024 20:15:16 +0200 Subject: [PATCH 10/38] types: improve extension and theme types --- src/types/config.ts | 50 ++++++++++++++++++++++++++++++++++++++++ src/types/definitions.ts | 21 +++++++++++++++++ src/types/index.ts | 2 ++ src/types/theme.ts | 16 +++++++++---- 4 files changed, 84 insertions(+), 5 deletions(-) create mode 100644 src/types/config.ts create mode 100644 src/types/definitions.ts diff --git a/src/types/config.ts b/src/types/config.ts new file mode 100644 index 0000000..dcc35fd --- /dev/null +++ b/src/types/config.ts @@ -0,0 +1,50 @@ +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 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 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 } From 7ad1080a04b107a94b4abe64abde379c8264de44 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Fri, 4 Oct 2024 23:14:11 +0200 Subject: [PATCH 11/38] chore: update pnpm-lock.yaml --- pnpm-lock.yaml | 119 ++++++++++++++++++++++++++----------------------- 1 file changed, 63 insertions(+), 56 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bfeecf6..a5b5480 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: devDependencies: '@hypernym/eslint-config': specifier: ^3.5.0 - version: 3.5.0(eslint@9.11.1)(typescript@5.5.4) + version: 3.5.0(eslint@9.12.0)(typescript@5.5.4) '@hypernym/prettier-config': specifier: ^3.2.0 version: 3.2.0(prettier@3.3.3) @@ -34,7 +34,7 @@ importers: version: 0.24.0 eslint: specifier: ^9.11.1 - version: 9.11.1 + version: 9.12.0 prettier: specifier: ^3.3.3 version: 3.3.3 @@ -64,8 +64,8 @@ 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': @@ -80,16 +80,16 @@ packages: resolution: {integrity: sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ==} engines: {node: '>=18.0.0'} - '@azure/msal-browser@3.24.0': - resolution: {integrity: sha512-JGNV9hTYAa7lsum9IMIibn2kKczAojNihGo1hi7pG0kNrcKej530Fl6jxwM05A44/6I079CSn6WxYxbVhKUmWg==} + '@azure/msal-browser@3.25.0': + resolution: {integrity: sha512-a0Y7pmSy8SC1s9bvwr+REvyAA1nQcITlZvkElM2gNUPYFTTNUTEdcpg73TmawNucyMdZ9xb/GFcuhrLOqYAzwg==} engines: {node: '>=0.8.0'} '@azure/msal-common@14.15.0': resolution: {integrity: sha512-ImAQHxmpMneJ/4S8BRFhjt1MZ3bppmpRPYYNyzeQPeFN288YKbb8TmmISQEbtfkQ1BPASvYZU5doIZOPBAqENQ==} engines: {node: '>=0.8.0'} - '@azure/msal-node@2.14.0': - resolution: {integrity: sha512-rrfzIpG3Q1rHjVYZmHAEDidWAZZ2cgkxlIcMQ8dHebRISaZ2KCV33Q8Vs+uaV6lxweROabNxKFlR2lIKagZqYg==} + '@azure/msal-node@2.15.0': + resolution: {integrity: sha512-gVPW8YLz92ZeCibQH2QUw96odJoiM3k/ZPH3f2HxptozmH6+OnyyvKXo/Egg39HAM230akarQKHf0W74UHlh0Q==} engines: {node: '>=16'} '@esbuild/aix-ppc64@0.24.0': @@ -258,8 +258,8 @@ packages: resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.11.1': - resolution: {integrity: sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA==} + '@eslint/js@9.12.0': + resolution: {integrity: sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.4': @@ -270,12 +270,20 @@ packages: resolution: {integrity: sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==} 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': @@ -728,8 +736,8 @@ packages: resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.11.1: - resolution: {integrity: sha512-MobhYKIoAO1s1e4VUrgx1l1Sk2JBR/Gqjjgw8+mfgoLE2xwsHur4gdfTxyTgShrhvdVFTaJSgMiQBl1jv/AWxg==} + eslint@9.12.0: + resolution: {integrity: sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -936,10 +944,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'} @@ -1452,7 +1456,7 @@ snapshots: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.8.0 '@azure/core-rest-pipeline': 1.17.0 - '@azure/core-tracing': 1.1.2 + '@azure/core-tracing': 1.2.0 '@azure/core-util': 1.10.0 '@azure/logger': 1.1.4 tslib: 2.7.0 @@ -1463,7 +1467,7 @@ snapshots: dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.8.0 - '@azure/core-tracing': 1.1.2 + '@azure/core-tracing': 1.2.0 '@azure/core-util': 1.10.0 '@azure/logger': 1.1.4 http-proxy-agent: 7.0.2 @@ -1472,7 +1476,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@azure/core-tracing@1.1.2': + '@azure/core-tracing@1.2.0': dependencies: tslib: 2.7.0 @@ -1487,11 +1491,11 @@ snapshots: '@azure/core-auth': 1.8.0 '@azure/core-client': 1.9.2 '@azure/core-rest-pipeline': 1.17.0 - '@azure/core-tracing': 1.1.2 + '@azure/core-tracing': 1.2.0 '@azure/core-util': 1.10.0 '@azure/logger': 1.1.4 - '@azure/msal-browser': 3.24.0 - '@azure/msal-node': 2.14.0 + '@azure/msal-browser': 3.25.0 + '@azure/msal-node': 2.15.0 events: 3.3.0 jws: 4.0.0 open: 8.4.2 @@ -1504,13 +1508,13 @@ snapshots: dependencies: tslib: 2.7.0 - '@azure/msal-browser@3.24.0': + '@azure/msal-browser@3.25.0': dependencies: '@azure/msal-common': 14.15.0 '@azure/msal-common@14.15.0': {} - '@azure/msal-node@2.14.0': + '@azure/msal-node@2.15.0': dependencies: '@azure/msal-common': 14.15.0 jsonwebtoken: 9.0.2 @@ -1588,9 +1592,9 @@ snapshots: '@esbuild/win32-x64@0.24.0': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@9.11.1)': + '@eslint-community/eslint-utils@4.4.0(eslint@9.12.0)': dependencies: - eslint: 9.11.1 + eslint: 9.12.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.11.1': {} @@ -1619,7 +1623,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.11.1': {} + '@eslint/js@9.12.0': {} '@eslint/object-schema@2.1.4': {} @@ -1627,18 +1631,25 @@ snapshots: 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.11.1)(typescript@5.5.4)': + '@hypernym/eslint-config@3.5.0(eslint@9.12.0)(typescript@5.5.4)': dependencies: - '@eslint/js': 9.11.1 + '@eslint/js': 9.12.0 '@types/eslint': 9.6.1 '@types/eslint__js': 8.42.3 - '@typescript-eslint/eslint-plugin': 8.8.0(@typescript-eslint/parser@8.8.0(eslint@9.11.1)(typescript@5.5.4))(eslint@9.11.1)(typescript@5.5.4) - '@typescript-eslint/parser': 8.8.0(eslint@9.11.1)(typescript@5.5.4) - eslint: 9.11.1 + '@typescript-eslint/eslint-plugin': 8.8.0(@typescript-eslint/parser@8.8.0(eslint@9.12.0)(typescript@5.5.4))(eslint@9.12.0)(typescript@5.5.4) + '@typescript-eslint/parser': 8.8.0(eslint@9.12.0)(typescript@5.5.4) + eslint: 9.12.0 globals: 15.10.0 optionalDependencies: typescript: 5.5.4 @@ -1700,15 +1711,15 @@ snapshots: '@types/vscode@1.94.0': {} - '@typescript-eslint/eslint-plugin@8.8.0(@typescript-eslint/parser@8.8.0(eslint@9.11.1)(typescript@5.5.4))(eslint@9.11.1)(typescript@5.5.4)': + '@typescript-eslint/eslint-plugin@8.8.0(@typescript-eslint/parser@8.8.0(eslint@9.12.0)(typescript@5.5.4))(eslint@9.12.0)(typescript@5.5.4)': dependencies: '@eslint-community/regexpp': 4.11.1 - '@typescript-eslint/parser': 8.8.0(eslint@9.11.1)(typescript@5.5.4) + '@typescript-eslint/parser': 8.8.0(eslint@9.12.0)(typescript@5.5.4) '@typescript-eslint/scope-manager': 8.8.0 - '@typescript-eslint/type-utils': 8.8.0(eslint@9.11.1)(typescript@5.5.4) - '@typescript-eslint/utils': 8.8.0(eslint@9.11.1)(typescript@5.5.4) + '@typescript-eslint/type-utils': 8.8.0(eslint@9.12.0)(typescript@5.5.4) + '@typescript-eslint/utils': 8.8.0(eslint@9.12.0)(typescript@5.5.4) '@typescript-eslint/visitor-keys': 8.8.0 - eslint: 9.11.1 + eslint: 9.12.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -1718,14 +1729,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.8.0(eslint@9.11.1)(typescript@5.5.4)': + '@typescript-eslint/parser@8.8.0(eslint@9.12.0)(typescript@5.5.4)': dependencies: '@typescript-eslint/scope-manager': 8.8.0 '@typescript-eslint/types': 8.8.0 '@typescript-eslint/typescript-estree': 8.8.0(typescript@5.5.4) '@typescript-eslint/visitor-keys': 8.8.0 debug: 4.3.7 - eslint: 9.11.1 + eslint: 9.12.0 optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: @@ -1736,10 +1747,10 @@ snapshots: '@typescript-eslint/types': 8.8.0 '@typescript-eslint/visitor-keys': 8.8.0 - '@typescript-eslint/type-utils@8.8.0(eslint@9.11.1)(typescript@5.5.4)': + '@typescript-eslint/type-utils@8.8.0(eslint@9.12.0)(typescript@5.5.4)': dependencies: '@typescript-eslint/typescript-estree': 8.8.0(typescript@5.5.4) - '@typescript-eslint/utils': 8.8.0(eslint@9.11.1)(typescript@5.5.4) + '@typescript-eslint/utils': 8.8.0(eslint@9.12.0)(typescript@5.5.4) debug: 4.3.7 ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: @@ -1765,13 +1776,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.8.0(eslint@9.11.1)(typescript@5.5.4)': + '@typescript-eslint/utils@8.8.0(eslint@9.12.0)(typescript@5.5.4)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0) '@typescript-eslint/scope-manager': 8.8.0 '@typescript-eslint/types': 8.8.0 '@typescript-eslint/typescript-estree': 8.8.0(typescript@5.5.4) - eslint: 9.11.1 + eslint: 9.12.0 transitivePeerDependencies: - supports-color - typescript @@ -2128,18 +2139,18 @@ snapshots: eslint-visitor-keys@4.1.0: {} - eslint@9.11.1: + eslint@9.12.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0) '@eslint-community/regexpp': 4.11.1 '@eslint/config-array': 0.18.0 '@eslint/core': 0.6.0 '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.11.1 + '@eslint/js': 9.12.0 '@eslint/plugin-kit': 0.2.0 + '@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 @@ -2159,13 +2170,11 @@ 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 @@ -2364,8 +2373,6 @@ snapshots: is-number@7.0.0: {} - is-path-inside@3.0.3: {} - is-wsl@2.2.0: dependencies: is-docker: 2.2.1 From 2e2af9a8f4b46377ab19461eaec6d7e49fdab487 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Fri, 4 Oct 2024 23:14:54 +0200 Subject: [PATCH 12/38] chore: update theme build scripts --- scripts/build-theme.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/build-theme.ts b/scripts/build-theme.ts index 7ee58e8..9f06522 100644 --- a/scripts/build-theme.ts +++ b/scripts/build-theme.ts @@ -1,9 +1,11 @@ import { write } from '@hypernym/utils/fs' import { paths } from '@/utils' import { createIconTheme } from '@/theme' +import { defaultConfig } from '@/extension/default-config' async function buildTheme(): Promise { - const theme = createIconTheme() + const config = defaultConfig() + const theme = createIconTheme(config) const json = JSON.stringify(theme, null, 2) await write(paths.file.theme, json) } From 84af408b84e19cf650a531afaf26da9c42b416b9 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Fri, 4 Oct 2024 23:15:25 +0200 Subject: [PATCH 13/38] types: update config types --- src/types/config.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/types/config.ts b/src/types/config.ts index dcc35fd..af558ab 100644 --- a/src/types/config.ts +++ b/src/types/config.ts @@ -4,11 +4,11 @@ export interface ExtensionConfig { * * @default true */ - hidesExplorerArrows?: boolean + hidesExplorerArrows: boolean /** * Folders options. */ - folders?: { + folders: { /** * Specifies a custom color for folder icons. * @@ -29,7 +29,7 @@ export interface ExtensionConfig { /** * Icons options. */ - icons?: { + icons: { /** * Specifies a custom color for all icons. * From c27c2e998d96abea808e3e0ba418cb5c35a1d2d4 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Fri, 4 Oct 2024 23:16:47 +0200 Subject: [PATCH 14/38] refactor: improve theme creation --- src/theme/default-names.ts | 5 - src/theme/file-extensions.ts | 59 +++-- src/theme/file-names.ts | 463 +++++++++++++++++++++++----------- src/theme/fonts.ts | 18 ++ src/theme/icon-definitions.ts | 36 +++ src/theme/icon-map.ts | 21 ++ src/theme/icons.ts | 58 +++++ src/theme/index.ts | 45 ++-- 8 files changed, 503 insertions(+), 202 deletions(-) delete mode 100644 src/theme/default-names.ts create mode 100644 src/theme/fonts.ts create mode 100644 src/theme/icon-definitions.ts create mode 100644 src/theme/icon-map.ts create mode 100644 src/theme/icons.ts 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..21ca4a2 100644 --- a/src/theme/file-extensions.ts +++ b/src/theme/file-extensions.ts @@ -1,30 +1,29 @@ -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 { createIconMap } from './icon-map' + +export const fileExtensions = createIconMap([ + { + icon: icons.html.id, + extensions: ['html', 'vue', 'svelte', 'astro', 'jsx', 'tsx'], + }, + { + icon: icons.style.id, + extensions: ['css', 'postcss', 'scss', 'sass', 'less', 'stylus'], + }, + { + icon: icons.image.id, + extensions: ['jpg', 'jpeg', 'png', 'gif', 'webp', 'tiff', 'ico', 'svg'], + }, + { + icon: icons.json.id, + extensions: ['json'], + }, + { + icon: icons.font.id, + extensions: ['otf', 'ttf', 'woff', 'woff2'], + }, + { + icon: icons.terminal.id, + extensions: ['sh', 'bash', 'zsh'], + }, +]) diff --git a/src/theme/file-names.ts b/src/theme/file-names.ts index 81e3902..f7c797f 100644 --- a/src/theme/file-names.ts +++ b/src/theme/file-names.ts @@ -1,146 +1,317 @@ -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 { createIconMap } from './icon-map' + +export const fileNames = createIconMap([ + { + icon: icons.config.id, + names: [ + 'eslint.config.js', + 'eslint.config.mjs', + 'eslint.config.ts', + 'eslint.config.cjs', + ], + }, + { + icon: icons.config.id, + names: [ + 'prettier.config.js', + 'prettier.config.mjs', + 'prettier.config.ts', + 'prettier.config.cjs', + ], + }, + { + icon: icons.config.id, + names: [ + 'stylelint.config.js', + 'stylelint.config.mjs', + 'stylelint.config.ts', + 'stylelint.config.cjs', + ], + }, + { + icon: icons.config.id, + names: [ + 'vite.config.js', + 'vite.config.mjs', + 'vite.config.ts', + 'vite.config.cjs', + ], + }, + { + icon: icons.config.id, + names: [ + 'vitest.config.js', + 'vitest.config.mjs', + 'vitest.config.ts', + 'vitest.config.cjs', + ], + }, + { + icon: icons.config.id, + names: [ + 'postcss.config.js', + 'postcss.config.mjs', + 'postcss.config.ts', + 'postcss.config.cjs', + ], + }, + { + icon: icons.config.id, + names: [ + 'rollup.config.js', + 'rollup.config.mjs', + 'rollup.config.ts', + 'rollup.config.cjs', + ], + }, + { + icon: icons.config.id, + names: [ + 'bundler.config.js', + 'bundler.config.mjs', + 'bundler.config.ts', + 'bundler.config.cjs', + ], + }, + { + icon: icons.config.id, + names: [ + 'hypernym.config.js', + 'hypernym.config.mjs', + 'hypernym.config.ts', + 'hypernym.config.cjs', + ], + }, + { + icon: icons.config.id, + names: [ + 'hyper.config.js', + 'hyper.config.mjs', + 'hyper.config.ts', + 'hyper.config.cjs', + ], + }, + { + icon: icons.config.id, + names: [ + 'webpack.config.js', + 'webpack.config.mjs', + 'webpack.config.ts', + 'webpack.config.cjs', + ], + }, + { + icon: icons.config.id, + names: [ + 'webpack.mix.js', + 'webpack.mix.mjs', + 'webpack.mix.ts', + 'webpack.mix.cjs', + ], + }, + { + icon: icons.config.id, + names: [ + 'rspack.config.js', + 'rspack.config.mjs', + 'rspack.config.ts', + 'rspack.config.cjs', + ], + }, + { + icon: icons.config.id, + names: [ + 'rsbuild.config.js', + 'rsbuild.config.mjs', + 'rsbuild.config.ts', + 'rsbuild.config.cjs', + ], + }, + { + icon: icons.config.id, + names: [ + 'rolldown.config.js', + 'rolldown.config.mjs', + 'rolldown.config.ts', + 'rolldown.config.cjs', + ], + }, + { + icon: icons.config.id, + names: [ + 'next.config.js', + 'next.config.mjs', + 'next.config.ts', + 'next.config.cjs', + 'turbo.json', + ], + }, + { + icon: icons.config.id, + names: [ + 'nuxt.config.js', + 'nuxt.config.mjs', + 'nuxt.config.ts', + 'nuxt.config.cjs', + ], + }, + { + icon: icons.config.id, + names: [ + 'nitro.config.js', + 'nitro.config.mjs', + 'nitro.config.ts', + 'nitro.config.cjs', + ], + }, + { + icon: icons.config.id, + names: [ + 'vue.config.js', + 'vue.config.mjs', + 'vue.config.ts', + 'vue.config.cjs', + ], + }, + { + icon: icons.config.id, + names: [ + 'svelte.config.js', + 'svelte.config.mjs', + 'svelte.config.ts', + 'svelte.config.cjs', + ], + }, + { + icon: icons.config.id, + names: [ + 'tailwind.config.js', + 'tailwind.config.mjs', + 'tailwind.config.ts', + 'tailwind.config.cjs', + ], + }, + { + icon: icons.config.id, + names: [ + 'astro.config.js', + 'astro.config.mjs', + 'astro.config.ts', + 'astro.config.cjs', + ], + }, + { + icon: icons.config.id, + names: [ + 'babel.config.js', + 'babel.config.mjs', + 'babel.config.ts', + 'babel.config.cjs', + 'babel.config.json', + ], + }, + { + icon: icons.config.id, + names: ['renovate.json'], + }, + { + icon: icons.hidden.id, + names: ['.renovaterc', '.renovaterc.json'], + }, + { + icon: icons.hidden.id, + names: [ + '.eslint', + '.eslintrc', + '.eslintignore', + '.eslintrc.js', + '.eslintrc.cjs', + ], + }, + { + icon: icons.hidden.id, + names: [ + '.prettier', + '.prettierrc', + '.prettierignore', + '.prettierrc.js', + '.prettierrc.cjs', + ], + }, + { + icon: icons.hidden.id, + names: [ + '.stylelint', + '.stylelintrc', + '.stylelintignore', + '.stylelintrc.js', + '.stylelintrc.cjs', + ], + }, + { + icon: icons.hidden.id, + names: ['.pnpmfile.js', '.pnpmfile.cjs'], + }, + { + icon: icons.hidden.id, + names: ['.hypernym', '.hypernymrc', '.hypernymconfig'], + }, + { + icon: icons.hidden.id, + names: ['.hyper', '.hyperrc', '.hyperconfig'], + }, + { + icon: icons.hidden.id, + names: [ + '.editorconfig', + '.gitignore', + '.gitkeep', + '.vscodeignore', + '.gitattributes', + ], + }, + { + icon: icons.hidden.id, + names: [ + '.npmrc', + '.vuerc', + '.nuxtrc', + '.nextrc', + '.swcrc', + '.babelrc', + '.parcelrc', + ], + }, + { + icon: icons.hidden.id, + names: [ + '.env', + '.env.test', + '.env.example', + '.env.development', + '.env.production', + ], + }, + { + icon: icons.verified.id, + names: ['codeowners'], + }, + { + icon: icons.info.id, + names: ['readme.md', 'readme.txt'], + }, + { + icon: icons.copyright.id, + names: [ + 'license', + 'license.txt', + 'license.md', + 'license.rst', + 'licence', + 'licence.txt', + 'licence.md', + 'licence.rst', + ], + }, +]) diff --git a/src/theme/fonts.ts b/src/theme/fonts.ts new file mode 100644 index 0000000..9abf81e --- /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: '125%', + }, +] diff --git a/src/theme/icon-definitions.ts b/src/theme/icon-definitions.ts new file mode 100644 index 0000000..ab27d1a --- /dev/null +++ b/src/theme/icon-definitions.ts @@ -0,0 +1,36 @@ +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 + + iconDefinitions[k] = { + fontId, + fontCharacter: value.char, + } + + if (config.icons?.color) { + iconDefinitions[k]['fontColor'] = config.icons.color + } + + if (config.icons?.size) { + iconDefinitions[k]['fontSize'] = config.icons.size + } + + if (config.folders?.color && key.includes('folder')) { + iconDefinitions[k]['fontColor'] = config.folders.color + } + + if (config.folders?.size && key.includes('folder')) { + iconDefinitions[k]['fontSize'] = config.folders.size + } + } + + return iconDefinitions +} diff --git a/src/theme/icon-map.ts b/src/theme/icon-map.ts new file mode 100644 index 0000000..d475413 --- /dev/null +++ b/src/theme/icon-map.ts @@ -0,0 +1,21 @@ +interface IconMap { + icon: 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 + } + } + + return iconMap +} diff --git a/src/theme/icons.ts b/src/theme/icons.ts new file mode 100644 index 0000000..8703491 --- /dev/null +++ b/src/theme/icons.ts @@ -0,0 +1,58 @@ +export const icons = { + config: { + id: '_config', + char: '\\e001', + }, + copyright: { + id: '_copyright', + char: '\\e002', + }, + file: { + id: '_file', + char: '\\e003', + }, + folder: { + id: '_folder', + char: '\\e004', + }, + folderOpen: { + id: '_folder-open', + char: '\\e005', + }, + font: { + id: '_font', + char: '\\e006', + }, + hidden: { + id: '_hidden', + char: '\\e007', + }, + html: { + id: '_html', + char: '\\e008', + }, + image: { + id: '_image', + char: '\\e009', + }, + info: { + id: '_info', + char: '\\e010', + }, + json: { + id: '_json', + char: '\\e011', + }, + style: { + id: '_style', + char: '\\e012', + }, + terminal: { + id: '_terminal', + char: '\\e013', + }, + verified: { + id: '_verified', + char: '\\e014', + }, +} 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 +} From df2792424ad8576a187f9ebfd2bb335ba33c119c Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Fri, 4 Oct 2024 23:19:51 +0200 Subject: [PATCH 15/38] feat: add new config system --- src/extension/default-config.ts | 7 ++ src/extension/detect-config-change.ts | 93 +++++++++++++++++++++++++++ src/extension/index.ts | 33 ++++++++++ src/extension/logger.ts | 6 ++ 4 files changed, 139 insertions(+) create mode 100644 src/extension/default-config.ts create mode 100644 src/extension/detect-config-change.ts create mode 100644 src/extension/index.ts create mode 100644 src/extension/logger.ts diff --git a/src/extension/default-config.ts b/src/extension/default-config.ts new file mode 100644 index 0000000..f0c06f5 --- /dev/null +++ b/src/extension/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/detect-config-change.ts b/src/extension/detect-config-change.ts new file mode 100644 index 0000000..aea4a98 --- /dev/null +++ b/src/extension/detect-config-change.ts @@ -0,0 +1,93 @@ +import { isNull, isStringEmpty } from '@hypernym/utils' +import { writeFile } from 'node:fs/promises' +import { resolve } from 'node:path' +import { isDeepStrictEqual } from 'node:util' +import { extensions, workspace } from 'vscode' +import { defaultConfig } from './default-config' +import { createIconTheme } from '@/theme' +import { extensionName, extensionId, extensionThemeFile } from '@/utils' +import type { ExtensionContext, ConfigurationChangeEvent } from 'vscode' +import type { ExtensionConfig } from '@/types' + +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() +} + +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 + }), + ) +} + +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) +} + +function syncGlobalConfig( + config: ExtensionConfig, + context: ExtensionContext, +): void { + context.globalState.update('config', { + version: context.extension.packageJSON.version, + config, + }) +} + +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/index.ts b/src/extension/index.ts new file mode 100644 index 0000000..583eb84 --- /dev/null +++ b/src/extension/index.ts @@ -0,0 +1,33 @@ +import { workspace, window } from 'vscode' +import { detectConfigChange } from './detect-config-change' +import { logger } from './logger' +import type { ExtensionContext } from 'vscode' + +export async function activate(context: ExtensionContext): Promise { + const version = context.extension.packageJSON.version + + try { + await detectConfigChange(undefined, context) + + context.subscriptions.push( + workspace.onDidChangeConfiguration( + async (event) => await detectConfigChange(event, context), + ), + ) + + const successMessage = logger.info(`(${version}): Activation succeeded!`) + window.showInformationMessage(successMessage) + } catch { + const errorMessage = logger.error( + `(${version}): Activation failed! Something went wrong, please try again.`, + ) + window.showErrorMessage(errorMessage) + } +} + +export function deactivate(context: ExtensionContext): void { + const version = context.extension.packageJSON.version + + const successMessage = logger.info(`(${version}): Deactivation succeeded!`) + window.showInformationMessage(successMessage) +} diff --git a/src/extension/logger.ts b/src/extension/logger.ts new file mode 100644 index 0000000..da0e5ac --- /dev/null +++ b/src/extension/logger.ts @@ -0,0 +1,6 @@ +import { extensionTitle } from '@/utils' + +export const logger = { + info: (message: string) => `${extensionTitle} ${message}`, + error: (message: string) => `${extensionTitle} ${message}`, +} From 44e73d560f6ae26e07e56e4020b98817984f3585 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Fri, 4 Oct 2024 23:21:37 +0200 Subject: [PATCH 16/38] refactor: change extension main entry --- src/extension.ts | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 src/extension.ts 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() From 7dbaaa4a3e72a3b800d7cb5ff3ecdd46bcf0dda3 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Fri, 4 Oct 2024 23:47:49 +0200 Subject: [PATCH 17/38] chore: bump version to 1.5.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fa810b6..24d0ef9 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", From 034553ad463bc0de8dc09964d9210c7798e0d461 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Sat, 5 Oct 2024 16:30:45 +0200 Subject: [PATCH 18/38] chore: update build theme script --- scripts/build-theme.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build-theme.ts b/scripts/build-theme.ts index 9f06522..c1b1aae 100644 --- a/scripts/build-theme.ts +++ b/scripts/build-theme.ts @@ -1,7 +1,7 @@ import { write } from '@hypernym/utils/fs' import { paths } from '@/utils' import { createIconTheme } from '@/theme' -import { defaultConfig } from '@/extension/default-config' +import { defaultConfig } from '@/extension/config' async function buildTheme(): Promise { const config = defaultConfig() From 185d89ab2e934fc4d56292c9354ef358e0e91a11 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Sat, 5 Oct 2024 16:31:44 +0200 Subject: [PATCH 19/38] refactor: update utils --- src/utils/index.ts | 1 - src/utils/meta.ts | 5 ----- src/utils/paths.ts | 2 +- 3 files changed, 1 insertion(+), 7 deletions(-) delete mode 100644 src/utils/meta.ts diff --git a/src/utils/index.ts b/src/utils/index.ts index 94630fa..676f1e5 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,2 +1 @@ -export * from './meta' export * from './paths' diff --git a/src/utils/meta.ts b/src/utils/meta.ts deleted file mode 100644 index 175a116..0000000 --- a/src/utils/meta.ts +++ /dev/null @@ -1,5 +0,0 @@ -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/utils/paths.ts b/src/utils/paths.ts index 87ba5c1..90fee6d 100644 --- a/src/utils/paths.ts +++ b/src/utils/paths.ts @@ -1,6 +1,6 @@ import { cwd } from 'node:process' import { resolve } from 'node:path' -import { extensionThemeFile } from './meta' +import { extensionThemeFile } from '@/extension/meta' const dirRoot = cwd() From a2ab0467701f6bc3c7cdf16fcd4547a3e274c319 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Mon, 7 Oct 2024 13:48:06 +0200 Subject: [PATCH 20/38] chore: add commands --- package.json | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 24d0ef9..cd859cd 100644 --- a/package.json +++ b/package.json @@ -92,7 +92,34 @@ "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.setFolderSize", + "title": "Set Folder Size" + }, + { + "category": "Hypernym Icons", + "command": "hypernym-icons.setIconColor", + "title": "Set Icon Color" + }, + { + "category": "Hypernym Icons", + "command": "hypernym-icons.setIconSize", + "title": "Set Icon Size" + } + ] }, "scripts": { "build:static": "bun run ./scripts/build-static.ts", From f8cd68c0912a1a3d8d664f8203d4094881187d02 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Mon, 7 Oct 2024 13:48:53 +0200 Subject: [PATCH 21/38] refactor: update extension main entry --- src/extension/index.ts | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/extension/index.ts b/src/extension/index.ts index 583eb84..d256e0c 100644 --- a/src/extension/index.ts +++ b/src/extension/index.ts @@ -1,12 +1,13 @@ import { workspace, window } from 'vscode' -import { detectConfigChange } from './detect-config-change' -import { logger } from './logger' +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 { - const version = context.extension.packageJSON.version - try { + context.subscriptions.push(...registeredCommands()) + await detectConfigChange(undefined, context) context.subscriptions.push( @@ -15,19 +16,17 @@ export async function activate(context: ExtensionContext): Promise { ), ) - const successMessage = logger.info(`(${version}): Activation succeeded!`) + const successMessage = showMessage('Activation succeeded!') window.showInformationMessage(successMessage) } catch { - const errorMessage = logger.error( - `(${version}): Activation failed! Something went wrong, please try again.`, + const errorMessage = showMessage( + 'Activation failed! Something went wrong, please try again.', ) window.showErrorMessage(errorMessage) } } -export function deactivate(context: ExtensionContext): void { - const version = context.extension.packageJSON.version - - const successMessage = logger.info(`(${version}): Deactivation succeeded!`) +export function deactivate(): void { + const successMessage = showMessage('Deactivation succeeded!') window.showInformationMessage(successMessage) } From 4db1d7c74443a047cd0743ff7bdef07156730ffd Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Mon, 7 Oct 2024 13:49:40 +0200 Subject: [PATCH 22/38] feat: add extension meta --- src/extension/meta/index.ts | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/extension/meta/index.ts 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` From 1a58556a7445f1ac4b3e1295a78e45d177f13f62 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Mon, 7 Oct 2024 13:51:19 +0200 Subject: [PATCH 23/38] feat: add extension messages notifications --- src/extension/logger.ts | 6 ------ src/extension/messages/index.ts | 5 +++++ 2 files changed, 5 insertions(+), 6 deletions(-) delete mode 100644 src/extension/logger.ts create mode 100644 src/extension/messages/index.ts diff --git a/src/extension/logger.ts b/src/extension/logger.ts deleted file mode 100644 index da0e5ac..0000000 --- a/src/extension/logger.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { extensionTitle } from '@/utils' - -export const logger = { - info: (message: string) => `${extensionTitle} ${message}`, - error: (message: string) => `${extensionTitle} ${message}`, -} 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}` +} From 2e6f661b320adfac79df9beccec7790c4396917c Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Mon, 7 Oct 2024 13:55:27 +0200 Subject: [PATCH 24/38] feat: add extension config system --- src/extension/config/default-config.ts | 7 ++++ src/extension/config/detect-config-change.ts | 28 +++++++++++++ src/extension/config/global-config.ts | 27 ++++++++++++ src/extension/config/index.ts | 1 + src/extension/config/theme-config.ts | 11 +++++ src/extension/config/workspace-config.ts | 44 ++++++++++++++++++++ 6 files changed, 118 insertions(+) create mode 100644 src/extension/config/default-config.ts create mode 100644 src/extension/config/detect-config-change.ts create mode 100644 src/extension/config/global-config.ts create mode 100644 src/extension/config/index.ts create mode 100644 src/extension/config/theme-config.ts create mode 100644 src/extension/config/workspace-config.ts 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) +} From 8b6527d7622d259c4d6db519fb87264a61cd507b Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Mon, 7 Oct 2024 14:00:46 +0200 Subject: [PATCH 25/38] feat: add extension command system --- src/extension/commands/index.ts | 29 ++++++ src/extension/commands/set-color.ts | 32 +++++++ src/extension/commands/set-folder-color.ts | 5 + src/extension/commands/set-folder-size.ts | 5 + src/extension/commands/set-icon-color.ts | 5 + src/extension/commands/set-icon-size.ts | 5 + src/extension/commands/set-size.ts | 30 ++++++ .../commands/toggle-explorer-arrows.ts | 35 +++++++ src/extension/commands/utils.ts | 4 + src/extension/default-config.ts | 7 -- src/extension/detect-config-change.ts | 93 ------------------- 11 files changed, 150 insertions(+), 100 deletions(-) create mode 100644 src/extension/commands/index.ts create mode 100644 src/extension/commands/set-color.ts create mode 100644 src/extension/commands/set-folder-color.ts create mode 100644 src/extension/commands/set-folder-size.ts create mode 100644 src/extension/commands/set-icon-color.ts create mode 100644 src/extension/commands/set-icon-size.ts create mode 100644 src/extension/commands/set-size.ts create mode 100644 src/extension/commands/toggle-explorer-arrows.ts create mode 100644 src/extension/commands/utils.ts delete mode 100644 src/extension/default-config.ts delete mode 100644 src/extension/detect-config-change.ts diff --git a/src/extension/commands/index.ts b/src/extension/commands/index.ts new file mode 100644 index 0000000..01e5ce3 --- /dev/null +++ b/src/extension/commands/index.ts @@ -0,0 +1,29 @@ +import { commands } from 'vscode' +import { extensionName } from '@/extension/meta' +import { toggleExplorerArrows } from './toggle-explorer-arrows' +import { setFolderColor } from './set-folder-color' +import { setFolderSize } from './set-folder-size' +import { setIconColor } from './set-icon-color' +import { setIconSize } from './set-icon-size' +import type { Disposable } from 'vscode' + +type ExtensionCommands = { + [commmand: string]: () => Promise +} + +const extensionCommands: ExtensionCommands = { + toggleExplorerArrows, + setFolderColor, + setFolderSize, + setIconColor, + 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..0b6a13a --- /dev/null +++ b/src/extension/commands/set-color.ts @@ -0,0 +1,32 @@ +import { window } from 'vscode' +import { setThemeConfig } from '@/extension/config/theme-config' +import { isValidDefaultInput } from './utils' +import type { InputBoxOptions } from 'vscode' + +export 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 +} + +export async function setColor(section: string): Promise { + const input: InputBoxOptions = { + placeHolder: 'Enter a valid HEX color', + 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-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-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-size.ts b/src/extension/commands/set-size.ts new file mode 100644 index 0000000..c51c1bf --- /dev/null +++ b/src/extension/commands/set-size.ts @@ -0,0 +1,30 @@ +import { window } from 'vscode' +import { setThemeConfig } from '@/extension/config/theme-config' +import { isValidDefaultInput } from './utils' +import type { InputBoxOptions } from 'vscode' + +export 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 validatePercentInput(input: string): string | undefined { + if (isValidDefaultInput(input)) return undefined + else if (!isValidPercentSize(input)) return 'Invalid percentage size' + return undefined +} + +export async function setSize(section: string): Promise { + const input: InputBoxOptions = { + placeHolder: 'Enter a percentage size', + ignoreFocusOut: true, + validateInput: validatePercentInput, + } + + 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..1078e22 --- /dev/null +++ b/src/extension/commands/utils.ts @@ -0,0 +1,4 @@ +export function isValidDefaultInput(input: string): boolean { + const pattern = new RegExp(/default/, 'i') + return input.length > 0 && pattern.test(input) +} diff --git a/src/extension/default-config.ts b/src/extension/default-config.ts deleted file mode 100644 index f0c06f5..0000000 --- a/src/extension/default-config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { ExtensionConfig } from '@/types' - -export const defaultConfig = (): ExtensionConfig => ({ - hidesExplorerArrows: true, - folders: {}, - icons: {}, -}) diff --git a/src/extension/detect-config-change.ts b/src/extension/detect-config-change.ts deleted file mode 100644 index aea4a98..0000000 --- a/src/extension/detect-config-change.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { isNull, isStringEmpty } from '@hypernym/utils' -import { writeFile } from 'node:fs/promises' -import { resolve } from 'node:path' -import { isDeepStrictEqual } from 'node:util' -import { extensions, workspace } from 'vscode' -import { defaultConfig } from './default-config' -import { createIconTheme } from '@/theme' -import { extensionName, extensionId, extensionThemeFile } from '@/utils' -import type { ExtensionContext, ConfigurationChangeEvent } from 'vscode' -import type { ExtensionConfig } from '@/types' - -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() -} - -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 - }), - ) -} - -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) -} - -function syncGlobalConfig( - config: ExtensionConfig, - context: ExtensionContext, -): void { - context.globalState.update('config', { - version: context.extension.packageJSON.version, - config, - }) -} - -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) -} From 3bf82434a2a2e481316fb1a2fe941b8900be6a20 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Wed, 9 Oct 2024 18:53:02 +0200 Subject: [PATCH 26/38] chore: update dependencies --- package.json | 4 ++-- pnpm-lock.yaml | 22 +++++++++++----------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index cd859cd..8cf68aa 100644 --- a/package.json +++ b/package.json @@ -135,7 +135,7 @@ "format": "prettier --write ." }, "sideEffects": false, - "packageManager": "pnpm@9.12.0", + "packageManager": "pnpm@9.12.1", "engines": { "vscode": "^1.94.0", "node": ">=20.0.0", @@ -158,7 +158,7 @@ "@hypernym/prettier-config": "^3.2.0", "@hypernym/tsconfig": "^2.4.0", "@hypernym/utils": "^3.4.0", - "@types/node": "^22.7.4", + "@types/node": "^22.7.5", "@types/vscode": "^1.94.0", "@vscode/vsce": "^3.1.1", "esbuild": "^0.24.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a5b5480..189e084 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,13 +16,13 @@ importers: version: 3.2.0(prettier@3.3.3) '@hypernym/tsconfig': specifier: ^2.4.0 - version: 2.4.0(@types/node@22.7.4)(typescript@5.5.4) + version: 2.4.0(@types/node@22.7.5)(typescript@5.5.4) '@hypernym/utils': specifier: ^3.4.0 - version: 3.4.0(@types/node@22.7.4)(typescript@5.5.4) + version: 3.4.0(@types/node@22.7.5)(typescript@5.5.4) '@types/node': - specifier: ^22.7.4 - version: 22.7.4 + specifier: ^22.7.5 + version: 22.7.5 '@types/vscode': specifier: ^1.94.0 version: 1.94.0 @@ -374,8 +374,8 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@22.7.4': - resolution: {integrity: sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==} + '@types/node@22.7.5': + resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} '@types/vscode@1.94.0': resolution: {integrity: sha512-UyQOIUT0pb14XSqJskYnRwD2aG0QrPVefIfrW1djR+/J4KeFQ0i1+hjZoaAmeNf3Z2jleK+R2hv+EboG/m8ruw==} @@ -1660,15 +1660,15 @@ snapshots: dependencies: prettier: 3.3.3 - '@hypernym/tsconfig@2.4.0(@types/node@22.7.4)(typescript@5.5.4)': + '@hypernym/tsconfig@2.4.0(@types/node@22.7.5)(typescript@5.5.4)': dependencies: typescript: 5.5.4 optionalDependencies: - '@types/node': 22.7.4 + '@types/node': 22.7.5 - '@hypernym/utils@3.4.0(@types/node@22.7.4)(typescript@5.5.4)': + '@hypernym/utils@3.4.0(@types/node@22.7.5)(typescript@5.5.4)': optionalDependencies: - '@types/node': 22.7.4 + '@types/node': 22.7.5 typescript: 5.5.4 '@isaacs/cliui@8.0.2': @@ -1705,7 +1705,7 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@22.7.4': + '@types/node@22.7.5': dependencies: undici-types: 6.19.8 From 3f21e76e24f37f7b946492e4dd405d63437a5c9f Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Wed, 9 Oct 2024 19:37:08 +0200 Subject: [PATCH 27/38] refactor: improve icon-map theme generator --- src/theme/file-names.ts | 207 ++++++++-------------------------------- src/theme/icon-map.ts | 15 +++ 2 files changed, 56 insertions(+), 166 deletions(-) diff --git a/src/theme/file-names.ts b/src/theme/file-names.ts index f7c797f..171bac5 100644 --- a/src/theme/file-names.ts +++ b/src/theme/file-names.ts @@ -4,212 +4,100 @@ import { createIconMap } from './icon-map' export const fileNames = createIconMap([ { icon: icons.config.id, - names: [ - 'eslint.config.js', - 'eslint.config.mjs', - 'eslint.config.ts', - 'eslint.config.cjs', - ], + pattern: 'eslint.config.{js,mjs,cjs,ts,mts,cts}', }, { icon: icons.config.id, - names: [ - 'prettier.config.js', - 'prettier.config.mjs', - 'prettier.config.ts', - 'prettier.config.cjs', - ], + pattern: 'prettier.config.{js,mjs,cjs,ts,mts,cts}', }, { icon: icons.config.id, - names: [ - 'stylelint.config.js', - 'stylelint.config.mjs', - 'stylelint.config.ts', - 'stylelint.config.cjs', - ], + pattern: 'stylelint.config.{js,mjs,cjs,ts,mts,cts}', }, { icon: icons.config.id, - names: [ - 'vite.config.js', - 'vite.config.mjs', - 'vite.config.ts', - 'vite.config.cjs', - ], + pattern: 'vite.config.{js,mjs,cjs,ts,mts,cts}', }, { icon: icons.config.id, - names: [ - 'vitest.config.js', - 'vitest.config.mjs', - 'vitest.config.ts', - 'vitest.config.cjs', - ], + pattern: 'vitest.config.{js,mjs,cjs,ts,mts,cts}', }, { icon: icons.config.id, - names: [ - 'postcss.config.js', - 'postcss.config.mjs', - 'postcss.config.ts', - 'postcss.config.cjs', - ], + pattern: 'postcss.config.{js,mjs,cjs,ts,mts,cts}', }, { icon: icons.config.id, - names: [ - 'rollup.config.js', - 'rollup.config.mjs', - 'rollup.config.ts', - 'rollup.config.cjs', - ], + pattern: 'rollup.config.{js,mjs,cjs,ts,mts,cts}', }, { icon: icons.config.id, - names: [ - 'bundler.config.js', - 'bundler.config.mjs', - 'bundler.config.ts', - 'bundler.config.cjs', - ], + pattern: 'rolldown.config.{js,mjs,cjs,ts,mts,cts}', }, { icon: icons.config.id, - names: [ - 'hypernym.config.js', - 'hypernym.config.mjs', - 'hypernym.config.ts', - 'hypernym.config.cjs', - ], + pattern: 'bundler.config.{js,mjs,cjs,ts,mts,cts}', }, { icon: icons.config.id, - names: [ - 'hyper.config.js', - 'hyper.config.mjs', - 'hyper.config.ts', - 'hyper.config.cjs', - ], + pattern: 'hypernym.config.{js,mjs,cjs,ts,mts,cts}', }, { icon: icons.config.id, - names: [ - 'webpack.config.js', - 'webpack.config.mjs', - 'webpack.config.ts', - 'webpack.config.cjs', - ], + pattern: 'hyper.config.{js,mjs,cjs,ts,mts,cts}', }, { icon: icons.config.id, - names: [ - 'webpack.mix.js', - 'webpack.mix.mjs', - 'webpack.mix.ts', - 'webpack.mix.cjs', - ], + pattern: 'webpack.config.{js,mjs,cjs,ts,mts,cts}', }, { icon: icons.config.id, - names: [ - 'rspack.config.js', - 'rspack.config.mjs', - 'rspack.config.ts', - 'rspack.config.cjs', - ], + pattern: 'webpack.mix.{js,mjs,cjs,ts,mts,cts}', }, { icon: icons.config.id, - names: [ - 'rsbuild.config.js', - 'rsbuild.config.mjs', - 'rsbuild.config.ts', - 'rsbuild.config.cjs', - ], + pattern: 'rspack.config.{js,mjs,cjs,ts,mts,cts}', }, { icon: icons.config.id, - names: [ - 'rolldown.config.js', - 'rolldown.config.mjs', - 'rolldown.config.ts', - 'rolldown.config.cjs', - ], + pattern: 'rsbuild.config.{js,mjs,cjs,ts,mts,cts}', }, { icon: icons.config.id, - names: [ - 'next.config.js', - 'next.config.mjs', - 'next.config.ts', - 'next.config.cjs', - 'turbo.json', - ], + pattern: 'next.config.{js,mjs,cjs,ts,mts,cts}', + names: ['turbo.json'], }, { icon: icons.config.id, - names: [ - 'nuxt.config.js', - 'nuxt.config.mjs', - 'nuxt.config.ts', - 'nuxt.config.cjs', - ], + pattern: 'nuxt.config.{js,mjs,cjs,ts,mts,cts}', }, { icon: icons.config.id, - names: [ - 'nitro.config.js', - 'nitro.config.mjs', - 'nitro.config.ts', - 'nitro.config.cjs', - ], + pattern: 'nitro.config.{js,mjs,cjs,ts,mts,cts}', }, { icon: icons.config.id, - names: [ - 'vue.config.js', - 'vue.config.mjs', - 'vue.config.ts', - 'vue.config.cjs', - ], + pattern: 'vue.config.{js,mjs,cjs,ts,mts,cts}', }, { icon: icons.config.id, - names: [ - 'svelte.config.js', - 'svelte.config.mjs', - 'svelte.config.ts', - 'svelte.config.cjs', - ], + pattern: 'svelte.config.{js,mjs,cjs,ts,mts,cts}', }, { icon: icons.config.id, - names: [ - 'tailwind.config.js', - 'tailwind.config.mjs', - 'tailwind.config.ts', - 'tailwind.config.cjs', - ], + pattern: 'tailwind.config.{js,mjs,cjs,ts,mts,cts}', }, { icon: icons.config.id, - names: [ - 'astro.config.js', - 'astro.config.mjs', - 'astro.config.ts', - 'astro.config.cjs', - ], + pattern: 'astro.config.{js,mjs,cjs,ts,mts,cts}', }, { icon: icons.config.id, - names: [ - 'babel.config.js', - 'babel.config.mjs', - 'babel.config.ts', - 'babel.config.cjs', - 'babel.config.json', - ], + pattern: 'babel.config.{js,mjs,cjs,ts,mts,cts,json}', + }, + { + icon: icons.config.id, + pattern: 'mdsvex.config.{js,mjs,cjs,ts,mts,cts}', }, { icon: icons.config.id, @@ -231,27 +119,17 @@ export const fileNames = createIconMap([ }, { icon: icons.hidden.id, - names: [ - '.prettier', - '.prettierrc', - '.prettierignore', - '.prettierrc.js', - '.prettierrc.cjs', - ], + pattern: '.prettierrc.{js,cjs}', + names: ['.prettier', '.prettierrc', '.prettierignore'], }, { icon: icons.hidden.id, - names: [ - '.stylelint', - '.stylelintrc', - '.stylelintignore', - '.stylelintrc.js', - '.stylelintrc.cjs', - ], + pattern: '.stylelintrc.{js,cjs}', + names: ['.stylelint', '.stylelintrc', '.stylelintignore'], }, { icon: icons.hidden.id, - names: ['.pnpmfile.js', '.pnpmfile.cjs'], + pattern: '.pnpmfile.{js,cjs}', }, { icon: icons.hidden.id, @@ -299,19 +177,16 @@ export const fileNames = createIconMap([ }, { icon: icons.info.id, - names: ['readme.md', 'readme.txt'], + pattern: 'readme.{md,txt}', }, { icon: icons.copyright.id, - names: [ - 'license', - 'license.txt', - 'license.md', - 'license.rst', - 'licence', - 'licence.txt', - 'licence.md', - 'licence.rst', - ], + pattern: 'license.{txt,md,rst}', + names: ['license'], + }, + { + icon: icons.copyright.id, + pattern: 'licence.{txt,md,rst}', + names: ['licence'], }, ]) diff --git a/src/theme/icon-map.ts b/src/theme/icon-map.ts index d475413..f8c60d4 100644 --- a/src/theme/icon-map.ts +++ b/src/theme/icon-map.ts @@ -1,5 +1,6 @@ interface IconMap { icon: string + pattern?: string extensions?: string[] names?: string[] } @@ -15,6 +16,20 @@ export function createIconMap(maps: IconMap[]): Record { 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 From e5644735e4ff3712e31f3157d24556f5d4172c82 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Thu, 10 Oct 2024 12:09:44 +0200 Subject: [PATCH 28/38] refactor: update theme icon definitions --- src/theme/file-extensions.ts | 55 ++++++++++++++++++++++----------- src/theme/file-names.ts | 59 ++++++++++++++++++++++++------------ src/theme/icons.ts | 56 ++++++++++++---------------------- 3 files changed, 97 insertions(+), 73 deletions(-) diff --git a/src/theme/file-extensions.ts b/src/theme/file-extensions.ts index 21ca4a2..79fc188 100644 --- a/src/theme/file-extensions.ts +++ b/src/theme/file-extensions.ts @@ -3,27 +3,48 @@ import { createIconMap } from './icon-map' export const fileExtensions = createIconMap([ { - icon: icons.html.id, - extensions: ['html', 'vue', 'svelte', 'astro', 'jsx', 'tsx'], - }, - { - icon: icons.style.id, - extensions: ['css', 'postcss', 'scss', 'sass', 'less', 'stylus'], + icon: icons.font.id, + extensions: ['otf', 'ttf', 'woff', 'woff2', 'eot', 'font'], }, { icon: icons.image.id, - extensions: ['jpg', 'jpeg', 'png', 'gif', 'webp', 'tiff', 'ico', 'svg'], - }, - { - icon: icons.json.id, - extensions: ['json'], - }, - { - icon: icons.font.id, - extensions: ['otf', 'ttf', 'woff', 'woff2'], + extensions: [ + 'jpg', + 'jpeg', + 'png', + 'gif', + 'webp', + 'tif', + 'tiff', + 'ico', + 'icon', + 'svg', + 'eps', + 'psd', + 'avif', + 'dng', + 'exr', + 'img', + 'pic', + 'raw', + ], }, { - icon: icons.terminal.id, - extensions: ['sh', 'bash', 'zsh'], + icon: icons.video.id, + extensions: [ + 'mp4', + 'mpeg', + 'mpg', + 'qt', + 'mov', + 'wmv', + 'avi', + 'flv', + 'webm', + 'mkv', + 'gifv', + 'ogv', + 'ogg', + ], }, ]) diff --git a/src/theme/file-names.ts b/src/theme/file-names.ts index 171bac5..35ded59 100644 --- a/src/theme/file-names.ts +++ b/src/theme/file-names.ts @@ -99,16 +99,24 @@ export const fileNames = createIconMap([ icon: icons.config.id, pattern: 'mdsvex.config.{js,mjs,cjs,ts,mts,cts}', }, + { + icon: icons.config.id, + pattern: 'playwright.config.{js,mjs,cjs,ts,mts,cts}', + }, + { + icon: icons.config.id, + pattern: 'playwright-ct.config.{js,mjs,cjs,ts,mts,cts}', + }, { icon: icons.config.id, names: ['renovate.json'], }, { - icon: icons.hidden.id, + icon: icons.dot.id, names: ['.renovaterc', '.renovaterc.json'], }, { - icon: icons.hidden.id, + icon: icons.dot.id, names: [ '.eslint', '.eslintrc', @@ -118,39 +126,46 @@ export const fileNames = createIconMap([ ], }, { - icon: icons.hidden.id, + icon: icons.dot.id, pattern: '.prettierrc.{js,cjs}', names: ['.prettier', '.prettierrc', '.prettierignore'], }, { - icon: icons.hidden.id, + icon: icons.dot.id, pattern: '.stylelintrc.{js,cjs}', names: ['.stylelint', '.stylelintrc', '.stylelintignore'], }, { - icon: icons.hidden.id, + icon: icons.dot.id, pattern: '.pnpmfile.{js,cjs}', }, { - icon: icons.hidden.id, + icon: icons.dot.id, names: ['.hypernym', '.hypernymrc', '.hypernymconfig'], }, { - icon: icons.hidden.id, + icon: icons.dot.id, names: ['.hyper', '.hyperrc', '.hyperconfig'], }, { - icon: icons.hidden.id, + icon: icons.dot.id, names: [ - '.editorconfig', + '.git', '.gitignore', '.gitkeep', - '.vscodeignore', + '.gitpreserve', + '.gitinclude', + '.gitmessage', + '.gitconfig', + '.gitmodules', '.gitattributes', + '.editorconfig', + '.vscodeignore', + '.keep', ], }, { - icon: icons.hidden.id, + icon: icons.dot.id, names: [ '.npmrc', '.vuerc', @@ -162,23 +177,22 @@ export const fileNames = createIconMap([ ], }, { - icon: icons.hidden.id, + icon: icons.dot.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.verified.id, - names: ['codeowners'], - }, - { - icon: icons.info.id, - pattern: 'readme.{md,txt}', - }, { icon: icons.copyright.id, pattern: 'license.{txt,md,rst}', @@ -189,4 +203,9 @@ export const fileNames = createIconMap([ pattern: 'licence.{txt,md,rst}', names: ['licence'], }, + { + icon: icons.copyright.id, + pattern: 'copyright.{txt,md,rst}', + names: ['copyright'], + }, ]) diff --git a/src/theme/icons.ts b/src/theme/icons.ts index 8703491..e25d165 100644 --- a/src/theme/icons.ts +++ b/src/theme/icons.ts @@ -1,58 +1,42 @@ export const icons = { - config: { - id: '_config', - char: '\\e001', - }, - copyright: { - id: '_copyright', - char: '\\e002', - }, file: { id: '_file', - char: '\\e003', + char: '\\e001', }, folder: { id: '_folder', - char: '\\e004', + char: '\\e002', }, folderOpen: { id: '_folder-open', + char: '\\e003', + }, + dot: { + id: '_dot', + char: '\\e004', + }, + config: { + id: '_config', char: '\\e005', }, - font: { - id: '_font', + document: { + id: '_document', char: '\\e006', }, - hidden: { - id: '_hidden', + font: { + id: '_font', char: '\\e007', }, - html: { - id: '_html', - char: '\\e008', - }, image: { id: '_image', + char: '\\e008', + }, + video: { + id: '_video', char: '\\e009', }, - info: { - id: '_info', + copyright: { + id: '_copyright', char: '\\e010', }, - json: { - id: '_json', - char: '\\e011', - }, - style: { - id: '_style', - char: '\\e012', - }, - terminal: { - id: '_terminal', - char: '\\e013', - }, - verified: { - id: '_verified', - char: '\\e014', - }, } From 1bc3bd4790c5dabbee5053c048c7d161cbcd4d82 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Thu, 10 Oct 2024 13:30:28 +0200 Subject: [PATCH 29/38] refactor: remove icons --- icons/10_info.svg | 1 - icons/11_json.svg | 1 - icons/12_style.svg | 1 - icons/13_terminal.svg | 1 - icons/14_verified.svg | 1 - icons/1_config.svg | 1 - icons/2_copyright.svg | 1 - icons/3_file.svg | 1 - icons/4_folder.svg | 1 - icons/5_folder-open.svg | 1 - icons/6_font.svg | 1 - icons/7_hidden.svg | 1 - icons/8_html.svg | 1 - icons/9_image.svg | 1 - 14 files changed, 14 deletions(-) delete mode 100644 icons/10_info.svg delete mode 100644 icons/11_json.svg delete mode 100644 icons/12_style.svg delete mode 100644 icons/13_terminal.svg delete mode 100644 icons/14_verified.svg delete mode 100644 icons/1_config.svg delete mode 100644 icons/2_copyright.svg delete mode 100644 icons/3_file.svg delete mode 100644 icons/4_folder.svg delete mode 100644 icons/5_folder-open.svg delete mode 100644 icons/6_font.svg delete mode 100644 icons/7_hidden.svg delete mode 100644 icons/8_html.svg delete mode 100644 icons/9_image.svg 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 @@ - From 8cec1537d578a32f6d08b92adff69353abd0820b Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Thu, 10 Oct 2024 14:45:57 +0200 Subject: [PATCH 30/38] docs: update readme info --- README.md | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 129 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3bc3df3..669fbfd 100644 --- a/README.md +++ b/README.md @@ -33,12 +33,139 @@ Install [Hypernym Icons](https://marketplace.visualstudio.com/items?itemName=hyp 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. + +### Toggle 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" +} +``` + +### 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" +} +``` + +### 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 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 Size + +- Command: `Hypernym Icons: Set Icon Size` + +Specifies a custom size for all icons. Accepts a percentage size format. + +### Reset Command + +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 From 874fa4a6bbbf6c91cc9d400268b2059b860bee2a Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Sat, 12 Oct 2024 15:58:49 +0200 Subject: [PATCH 31/38] docs: update readme info --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 669fbfd..48b9972 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,13 @@
+## Features + +- Adds minimalistic modern style +- Dynamically infers colors based on state +- Allows additional customization via options +- Provides special commands + ## Installation ### Marketplace @@ -48,7 +55,7 @@ All options are optional and will fall back to defaults if not specified. See the official VSCode settings section for more info. -### Toggle Explorer Arrows +### Explorer Arrows - Type: `boolean` - Default: `true` From 0b5545223acc4e4ab37d113ac9a502753778da38 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Sat, 12 Oct 2024 16:07:48 +0200 Subject: [PATCH 32/38] feat: improve theme exts and add new icons --- src/theme/file-extensions.ts | 53 +++++++++ src/theme/file-names.ts | 206 +---------------------------------- src/theme/icons.ts | 20 ++-- 3 files changed, 65 insertions(+), 214 deletions(-) diff --git a/src/theme/file-extensions.ts b/src/theme/file-extensions.ts index 79fc188..82169c6 100644 --- a/src/theme/file-extensions.ts +++ b/src/theme/file-extensions.ts @@ -1,7 +1,52 @@ import { icons } from './icons' import { createIconMap } from './icon-map' +export const configExts = 'js,mjs,cjs,ts,mts,cts,json,yml,yaml,toml' + export const fileExtensions = createIconMap([ + { + 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}}`, + }, + { + 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'], @@ -47,4 +92,12 @@ export const fileExtensions = createIconMap([ '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 35ded59..22015ba 100644 --- a/src/theme/file-names.ts +++ b/src/theme/file-names.ts @@ -3,209 +3,7 @@ import { createIconMap } from './icon-map' export const fileNames = createIconMap([ { - icon: icons.config.id, - pattern: 'eslint.config.{js,mjs,cjs,ts,mts,cts}', - }, - { - icon: icons.config.id, - pattern: 'prettier.config.{js,mjs,cjs,ts,mts,cts}', - }, - { - icon: icons.config.id, - pattern: 'stylelint.config.{js,mjs,cjs,ts,mts,cts}', - }, - { - icon: icons.config.id, - pattern: 'vite.config.{js,mjs,cjs,ts,mts,cts}', - }, - { - icon: icons.config.id, - pattern: 'vitest.config.{js,mjs,cjs,ts,mts,cts}', - }, - { - icon: icons.config.id, - pattern: 'postcss.config.{js,mjs,cjs,ts,mts,cts}', - }, - { - icon: icons.config.id, - pattern: 'rollup.config.{js,mjs,cjs,ts,mts,cts}', - }, - { - icon: icons.config.id, - pattern: 'rolldown.config.{js,mjs,cjs,ts,mts,cts}', - }, - { - icon: icons.config.id, - pattern: 'bundler.config.{js,mjs,cjs,ts,mts,cts}', - }, - { - icon: icons.config.id, - pattern: 'hypernym.config.{js,mjs,cjs,ts,mts,cts}', - }, - { - icon: icons.config.id, - pattern: 'hyper.config.{js,mjs,cjs,ts,mts,cts}', - }, - { - icon: icons.config.id, - pattern: 'webpack.config.{js,mjs,cjs,ts,mts,cts}', - }, - { - icon: icons.config.id, - pattern: 'webpack.mix.{js,mjs,cjs,ts,mts,cts}', - }, - { - icon: icons.config.id, - pattern: 'rspack.config.{js,mjs,cjs,ts,mts,cts}', - }, - { - icon: icons.config.id, - pattern: 'rsbuild.config.{js,mjs,cjs,ts,mts,cts}', - }, - { - icon: icons.config.id, - pattern: 'next.config.{js,mjs,cjs,ts,mts,cts}', - names: ['turbo.json'], - }, - { - icon: icons.config.id, - pattern: 'nuxt.config.{js,mjs,cjs,ts,mts,cts}', - }, - { - icon: icons.config.id, - pattern: 'nitro.config.{js,mjs,cjs,ts,mts,cts}', - }, - { - icon: icons.config.id, - pattern: 'vue.config.{js,mjs,cjs,ts,mts,cts}', - }, - { - icon: icons.config.id, - pattern: 'svelte.config.{js,mjs,cjs,ts,mts,cts}', - }, - { - icon: icons.config.id, - pattern: 'tailwind.config.{js,mjs,cjs,ts,mts,cts}', - }, - { - icon: icons.config.id, - pattern: 'astro.config.{js,mjs,cjs,ts,mts,cts}', - }, - { - icon: icons.config.id, - pattern: 'babel.config.{js,mjs,cjs,ts,mts,cts,json}', - }, - { - icon: icons.config.id, - pattern: 'mdsvex.config.{js,mjs,cjs,ts,mts,cts}', - }, - { - icon: icons.config.id, - pattern: 'playwright.config.{js,mjs,cjs,ts,mts,cts}', - }, - { - icon: icons.config.id, - pattern: 'playwright-ct.config.{js,mjs,cjs,ts,mts,cts}', - }, - { - icon: icons.config.id, - names: ['renovate.json'], - }, - { - icon: icons.dot.id, - names: ['.renovaterc', '.renovaterc.json'], - }, - { - icon: icons.dot.id, - names: [ - '.eslint', - '.eslintrc', - '.eslintignore', - '.eslintrc.js', - '.eslintrc.cjs', - ], - }, - { - icon: icons.dot.id, - pattern: '.prettierrc.{js,cjs}', - names: ['.prettier', '.prettierrc', '.prettierignore'], - }, - { - icon: icons.dot.id, - pattern: '.stylelintrc.{js,cjs}', - names: ['.stylelint', '.stylelintrc', '.stylelintignore'], - }, - { - icon: icons.dot.id, - pattern: '.pnpmfile.{js,cjs}', - }, - { - icon: icons.dot.id, - names: ['.hypernym', '.hypernymrc', '.hypernymconfig'], - }, - { - icon: icons.dot.id, - names: ['.hyper', '.hyperrc', '.hyperconfig'], - }, - { - icon: icons.dot.id, - names: [ - '.git', - '.gitignore', - '.gitkeep', - '.gitpreserve', - '.gitinclude', - '.gitmessage', - '.gitconfig', - '.gitmodules', - '.gitattributes', - '.editorconfig', - '.vscodeignore', - '.keep', - ], - }, - { - icon: icons.dot.id, - names: [ - '.npmrc', - '.vuerc', - '.nuxtrc', - '.nextrc', - '.swcrc', - '.babelrc', - '.parcelrc', - ], - }, - { - icon: icons.dot.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.copyright.id, - pattern: 'license.{txt,md,rst}', - names: ['license'], - }, - { - icon: icons.copyright.id, - pattern: 'licence.{txt,md,rst}', - names: ['licence'], - }, - { - icon: icons.copyright.id, - pattern: 'copyright.{txt,md,rst}', - names: ['copyright'], + icon: icons.document.id, + names: ['license', 'licence', 'copyright'], }, ]) diff --git a/src/theme/icons.ts b/src/theme/icons.ts index e25d165..5f81a8e 100644 --- a/src/theme/icons.ts +++ b/src/theme/icons.ts @@ -11,32 +11,32 @@ export const icons = { id: '_folder-open', char: '\\e003', }, - dot: { - id: '_dot', - char: '\\e004', - }, config: { id: '_config', - char: '\\e005', + char: '\\e004', }, document: { id: '_document', - char: '\\e006', + char: '\\e005', }, font: { id: '_font', - char: '\\e007', + char: '\\e006', }, image: { id: '_image', - char: '\\e008', + char: '\\e007', }, video: { id: '_video', + char: '\\e008', + }, + audio: { + id: '_audio', char: '\\e009', }, - copyright: { - id: '_copyright', + '3d': { + id: '_3d', char: '\\e010', }, } From 239dbd0c1ea650ebf903e94784aac9d7a7318262 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Tue, 15 Oct 2024 09:36:46 +0200 Subject: [PATCH 33/38] types: update config types --- src/types/config.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/types/config.ts b/src/types/config.ts index af558ab..1bb08b1 100644 --- a/src/types/config.ts +++ b/src/types/config.ts @@ -17,6 +17,14 @@ export interface ExtensionConfig { * @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. * @@ -38,6 +46,14 @@ export interface ExtensionConfig { * @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. * From 835d55a198732aa43787eedddf1ab1892e705df4 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Tue, 15 Oct 2024 09:41:29 +0200 Subject: [PATCH 34/38] refactor: improve theme config patterns --- src/theme/file-extensions.ts | 28 ++-------------------------- src/theme/file-names.ts | 2 ++ src/theme/icon-map.ts | 2 +- src/theme/patterns.ts | 31 +++++++++++++++++++++++++++++++ 4 files changed, 36 insertions(+), 27 deletions(-) create mode 100644 src/theme/patterns.ts diff --git a/src/theme/file-extensions.ts b/src/theme/file-extensions.ts index 82169c6..eaa8697 100644 --- a/src/theme/file-extensions.ts +++ b/src/theme/file-extensions.ts @@ -1,33 +1,9 @@ import { icons } from './icons' +import { configPatterns } from './patterns' import { createIconMap } from './icon-map' -export const configExts = 'js,mjs,cjs,ts,mts,cts,json,yml,yaml,toml' - export const fileExtensions = createIconMap([ - { - 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}}`, - }, + ...configPatterns, { icon: icons.document.id, extensions: [ diff --git a/src/theme/file-names.ts b/src/theme/file-names.ts index 22015ba..c9bd808 100644 --- a/src/theme/file-names.ts +++ b/src/theme/file-names.ts @@ -1,7 +1,9 @@ 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'], diff --git a/src/theme/icon-map.ts b/src/theme/icon-map.ts index f8c60d4..ab5c327 100644 --- a/src/theme/icon-map.ts +++ b/src/theme/icon-map.ts @@ -1,4 +1,4 @@ -interface IconMap { +export interface IconMap { icon: string pattern?: string extensions?: string[] 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}}`, + }, +] From 07efa649d3fb4624f100bfcb4dd24bb9767a8be7 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Tue, 15 Oct 2024 09:54:02 +0200 Subject: [PATCH 35/38] feat: add opacity config and command --- package.json | 28 +++++++++++++-- src/extension/commands/index.ts | 4 +++ src/extension/commands/set-color.ts | 17 ++------- src/extension/commands/set-folder-opacity.ts | 5 +++ src/extension/commands/set-icon-opacity.ts | 5 +++ src/extension/commands/set-opacity.ts | 19 ++++++++++ src/extension/commands/set-size.ts | 17 ++------- src/extension/commands/utils.ts | 37 ++++++++++++++++++++ src/theme/icon-definitions.ts | 33 +++++++++-------- 9 files changed, 119 insertions(+), 46 deletions(-) create mode 100644 src/extension/commands/set-folder-opacity.ts create mode 100644 src/extension/commands/set-icon-opacity.ts create mode 100644 src/extension/commands/set-opacity.ts diff --git a/package.json b/package.json index 8cf68aa..8aacdb4 100644 --- a/package.json +++ b/package.json @@ -73,20 +73,32 @@ "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.size": { + "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": 4, + "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": 5, + "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%`" @@ -104,6 +116,11 @@ "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", @@ -114,6 +131,11 @@ "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", diff --git a/src/extension/commands/index.ts b/src/extension/commands/index.ts index 01e5ce3..5bb336c 100644 --- a/src/extension/commands/index.ts +++ b/src/extension/commands/index.ts @@ -2,8 +2,10 @@ 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' @@ -14,8 +16,10 @@ type ExtensionCommands = { const extensionCommands: ExtensionCommands = { toggleExplorerArrows, setFolderColor, + setFolderOpacity, setFolderSize, setIconColor, + setIconOpacity, setIconSize, } diff --git a/src/extension/commands/set-color.ts b/src/extension/commands/set-color.ts index 0b6a13a..418a42e 100644 --- a/src/extension/commands/set-color.ts +++ b/src/extension/commands/set-color.ts @@ -1,24 +1,11 @@ import { window } from 'vscode' import { setThemeConfig } from '@/extension/config/theme-config' -import { isValidDefaultInput } from './utils' +import { isValidDefaultInput, validateColorInput } from './utils' import type { InputBoxOptions } from 'vscode' -export 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 -} - export async function setColor(section: string): Promise { const input: InputBoxOptions = { - placeHolder: 'Enter a valid HEX color', + placeHolder: 'Enter a valid HEX color, e.g. #fff, #ffffff, #ffffff66', ignoreFocusOut: true, validateInput: validateColorInput, } 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-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-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 index c51c1bf..d8a3b75 100644 --- a/src/extension/commands/set-size.ts +++ b/src/extension/commands/set-size.ts @@ -1,24 +1,13 @@ import { window } from 'vscode' import { setThemeConfig } from '@/extension/config/theme-config' -import { isValidDefaultInput } from './utils' +import { isValidDefaultInput, validateSizeInput } from './utils' import type { InputBoxOptions } from 'vscode' -export 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 validatePercentInput(input: string): string | undefined { - if (isValidDefaultInput(input)) return undefined - else if (!isValidPercentSize(input)) return 'Invalid percentage size' - return undefined -} - export async function setSize(section: string): Promise { const input: InputBoxOptions = { - placeHolder: 'Enter a percentage size', + placeHolder: 'Enter a percentage size, e.g. 130%', ignoreFocusOut: true, - validateInput: validatePercentInput, + validateInput: validateSizeInput, } const value = await window.showInputBox(input) diff --git a/src/extension/commands/utils.ts b/src/extension/commands/utils.ts index 1078e22..1901ba5 100644 --- a/src/extension/commands/utils.ts +++ b/src/extension/commands/utils.ts @@ -2,3 +2,40 @@ 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/theme/icon-definitions.ts b/src/theme/icon-definitions.ts index ab27d1a..8468597 100644 --- a/src/theme/icon-definitions.ts +++ b/src/theme/icon-definitions.ts @@ -9,26 +9,31 @@ export function createIconDefinitions( for (const [key, value] of Object.entries(icons)) { const k = value.id + const isFolder = key.includes('folder') iconDefinitions[k] = { fontId, fontCharacter: value.char, } - if (config.icons?.color) { - iconDefinitions[k]['fontColor'] = config.icons.color - } - - if (config.icons?.size) { - iconDefinitions[k]['fontSize'] = config.icons.size - } - - if (config.folders?.color && key.includes('folder')) { - iconDefinitions[k]['fontColor'] = config.folders.color - } - - if (config.folders?.size && key.includes('folder')) { - iconDefinitions[k]['fontSize'] = config.folders.size + 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 + } } } From f1424ecd9bd5dee39e46aeaeb30ee40f3f49e830 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Tue, 15 Oct 2024 10:41:32 +0200 Subject: [PATCH 36/38] docs: add info for opacity settings --- README.md | 48 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 48b9972..36aacfe 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,22 @@ Specifies a custom color for folder icons. Accepts valid HEX color format. // settings.json { - "hypernym-icons.folders.color": "#fff" + "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% } ``` @@ -111,7 +126,22 @@ Specifies a custom color for all icons. Accepts valid HEX color format. // settings.json { - "hypernym-icons.icons.color": "#fff" + "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% } ``` @@ -152,6 +182,12 @@ Specifies the visibility of the explorer arrows. 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` @@ -164,13 +200,19 @@ Specifies a custom size for folder icons. Accepts a percentage size format. 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 Command +### 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. From 793e7d98e05768125fbad8c3f1126664f9392e95 Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Tue, 15 Oct 2024 14:18:49 +0200 Subject: [PATCH 37/38] refactor: update theme --- src/theme/file-names.ts | 79 +++++++++++++++++++++++++++++++++++++++++ src/theme/fonts.ts | 2 +- src/theme/icons.ts | 4 +++ 3 files changed, 84 insertions(+), 1 deletion(-) diff --git a/src/theme/file-names.ts b/src/theme/file-names.ts index c9bd808..9548688 100644 --- a/src/theme/file-names.ts +++ b/src/theme/file-names.ts @@ -8,4 +8,83 @@ export const fileNames = createIconMap([ 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 index 9abf81e..fb67ce1 100644 --- a/src/theme/fonts.ts +++ b/src/theme/fonts.ts @@ -13,6 +13,6 @@ export const fonts: FontDefinition[] = [ ], weight: 'normal', style: 'normal', - size: '125%', + size: '120%', }, ] diff --git a/src/theme/icons.ts b/src/theme/icons.ts index 5f81a8e..bfcc563 100644 --- a/src/theme/icons.ts +++ b/src/theme/icons.ts @@ -39,4 +39,8 @@ export const icons = { id: '_3d', char: '\\e010', }, + hidden: { + id: '_hidden', + char: '\\e011', + }, } From cdf3cab4235fda77f8731c49e34e4abad8c70b5f Mon Sep 17 00:00:00 2001 From: Ivo Dolenc Date: Sat, 19 Oct 2024 16:21:03 +0200 Subject: [PATCH 38/38] chore: update dependencies --- package.json | 12 +- pnpm-lock.yaml | 358 ++++++++++++++++++++++++------------------------- 2 files changed, 181 insertions(+), 189 deletions(-) diff --git a/package.json b/package.json index 8aacdb4..8611e8d 100644 --- a/package.json +++ b/package.json @@ -157,7 +157,7 @@ "format": "prettier --write ." }, "sideEffects": false, - "packageManager": "pnpm@9.12.1", + "packageManager": "pnpm@9.12.2", "engines": { "vscode": "^1.94.0", "node": ">=20.0.0", @@ -176,16 +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.4.0", - "@types/node": "^22.7.5", + "@types/node": "^22.7.7", "@types/vscode": "^1.94.0", - "@vscode/vsce": "^3.1.1", + "@vscode/vsce": "^3.2.0", "esbuild": "^0.24.0", - "eslint": "^9.11.1", + "eslint": "^9.13.0", "prettier": "^3.3.3", - "typescript": "^5.5.4" + "typescript": "^5.6.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 189e084..6a242fd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,51 +9,47 @@ importers: .: devDependencies: '@hypernym/eslint-config': - specifier: ^3.5.0 - version: 3.5.0(eslint@9.12.0)(typescript@5.5.4) + 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.7.5)(typescript@5.5.4) + version: 2.4.0(@types/node@22.7.7)(typescript@5.6.3) '@hypernym/utils': specifier: ^3.4.0 - version: 3.4.0(@types/node@22.7.5)(typescript@5.5.4) + version: 3.4.0(@types/node@22.7.7)(typescript@5.6.3) '@types/node': - specifier: ^22.7.5 - version: 22.7.5 + specifier: ^22.7.7 + version: 22.7.7 '@types/vscode': specifier: ^1.94.0 version: 1.94.0 '@vscode/vsce': - specifier: ^3.1.1 - version: 3.1.1 + specifier: ^3.2.0 + version: 3.2.0 esbuild: specifier: ^0.24.0 version: 0.24.0 eslint: - specifier: ^9.11.1 - version: 9.12.0 + specifier: ^9.13.0 + version: 9.13.0 prettier: specifier: ^3.3.3 version: 3.3.3 typescript: - specifier: ^5.5.4 - version: 5.5.4 + 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': @@ -68,20 +64,20 @@ packages: 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.25.0': - resolution: {integrity: sha512-a0Y7pmSy8SC1s9bvwr+REvyAA1nQcITlZvkElM2gNUPYFTTNUTEdcpg73TmawNucyMdZ9xb/GFcuhrLOqYAzwg==} + '@azure/msal-browser@3.26.1': + resolution: {integrity: sha512-y78sr9g61aCAH9fcLO1um+oHFXc1/5Ap88RIsUSuzkm0BHzFnN+PXGaQeuM1h5Qf5dTnWNOd6JqkskkMPAhh7Q==} engines: {node: '>=0.8.0'} '@azure/msal-common@14.15.0': @@ -250,24 +246,24 @@ packages: resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.6.0': - resolution: {integrity: sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==} + '@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.12.0': - resolution: {integrity: sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==} + '@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.2.0': - resolution: {integrity: sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==} + '@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': @@ -286,8 +282,8 @@ packages: 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' @@ -374,14 +370,14 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@22.7.5': - resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} + '@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.8.0': - resolution: {integrity: sha512-wORFWjU30B2WJ/aXBfOm1LX9v9nyt9D3jsSOxC3cCaTQGCW5k4jNpmjFv3U7p/7s4yvdjHzwtv2Sd2dOyhjS0A==} + '@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 @@ -391,8 +387,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.8.0': - resolution: {integrity: sha512-uEFUsgR+tl8GmzmLjRqz+VrDv4eoaMqMXW7ruXfgThaAShO9JTciKpEsB+TvnfFfbg5IpujgMXVV36gOJRLtZg==} + '@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 @@ -401,12 +397,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@8.8.0': - resolution: {integrity: sha512-EL8eaGC6gx3jDd8GwEFEV091210U97J0jeEHrAYvIYosmEGet4wJ+g0SYmLu+oRiAwbSA5AVrt6DxLHfdd+bUg==} + '@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.8.0': - resolution: {integrity: sha512-IKwJSS7bCqyCeG4NVGxnOP6lLT9Okc3Zj8hLO96bpMkJab+10HIfJbMouLrlpyOr3yrQ1cA413YPFiGd1mW9/Q==} + '@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: '*' @@ -414,12 +410,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@8.8.0': - resolution: {integrity: sha512-QJwc50hRCgBd/k12sTykOJbESe1RrzmX6COk8Y525C9l7oweZ+1lw9JiU56im7Amm8swlz00DRIlxMYLizr2Vw==} + '@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.8.0': - resolution: {integrity: sha512-ZaMJwc/0ckLz5DaAZ+pNLmHv8AMVGtfWxZe/x2JVEkD5LnmhWiQMMcYT7IY7gkdJuzJ9P14fRy28lUrlDSWYdw==} + '@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: '*' @@ -427,14 +423,14 @@ packages: typescript: optional: true - '@typescript-eslint/utils@8.8.0': - resolution: {integrity: sha512-QE2MgfOTem00qrlPgyByaCHay9yb1+9BjnMFnSFkUKQfu7adBXDTnCAivURnuPPAG/qiB+kzKkZKmKfaMT0zVg==} + '@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.8.0': - resolution: {integrity: sha512-8mq51Lx6Hpmd7HnA2fcHQo3YgfX1qbccxQOgZcb4tvasu//zXRaA1j5ZRFeCw/VRAdFi4mRM9DnZw0Nu0Q2d1g==} + '@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': @@ -485,8 +481,8 @@ packages: '@vscode/vsce-sign@2.0.4': resolution: {integrity: sha512-0uL32egStKYfy60IqnynAChMTbL0oqpqk0Ew0YHiIb+fayuGZWADuIPHWUcY1GCnAA+VgchOPDMxnc2R3XGWEA==} - '@vscode/vsce@3.1.1': - resolution: {integrity: sha512-N62Ca9ElRPLUUzf7l9CeEBlLrYzFPRQq7huKk4pVW+LjIOSXfFIPudixn5QvZcz+yXDOh15IopI3K2o3y9666Q==} + '@vscode/vsce@3.2.0': + resolution: {integrity: sha512-c/AId5Lp50HTszCBDfXfD/Go2djm6qO/WfedP2Y3BpRP+V+ttr8T0mTvZ8WEyTiBp2EfrYnzYUCx0ocB9mHy4Q==} engines: {node: '>= 20'} hasBin: true @@ -495,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 @@ -736,8 +732,8 @@ packages: resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.12.0: - resolution: {integrity: sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==} + 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: @@ -816,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: @@ -850,8 +846,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.10.0: - resolution: {integrity: sha512-tqFIbz83w4Y5TCbtgjZjApohbuh7K9BxGYFm7ifwDR240tvdb7P9x+/9VvUKlmkPoiknoJtanI8UOrqxS3a7lQ==} + globals@15.11.0: + resolution: {integrity: sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==} engines: {node: '>=18'} gopd@1.0.1: @@ -1105,8 +1101,8 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - node-abi@3.68.0: - resolution: {integrity: sha512-7vbj10trelExNjFSBm5kTvZXXa7pZyKWx9RCKIyqe6I9Ev3IzGpQoqBP3a+cOdxY+pWj6VkP28n/2wWysBHD/A==} + node-abi@3.71.0: + resolution: {integrity: sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==} engines: {node: '>=10'} node-addon-api@4.3.0: @@ -1148,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==} @@ -1338,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==} @@ -1355,8 +1351,8 @@ packages: typed-rest-client@1.8.11: resolution: {integrity: sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==} - typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} engines: {node: '>=14.17'} hasBin: true @@ -1369,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: @@ -1437,78 +1433,74 @@ 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.2.0 - '@azure/core-util': 1.10.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-auth': 1.9.0 '@azure/core-tracing': 1.2.0 - '@azure/core-util': 1.10.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.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.2.0 - '@azure/core-util': 1.10.0 + '@azure/core-util': 1.11.0 '@azure/logger': 1.1.4 - '@azure/msal-browser': 3.25.0 + '@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.25.0': + '@azure/msal-browser@3.26.1': dependencies: '@azure/msal-common': 14.15.0 @@ -1592,9 +1584,9 @@ snapshots: '@esbuild/win32-x64@0.24.0': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@9.12.0)': + '@eslint-community/eslint-utils@4.4.0(eslint@9.13.0)': dependencies: - eslint: 9.12.0 + eslint: 9.13.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.11.1': {} @@ -1607,7 +1599,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/core@0.6.0': {} + '@eslint/core@0.7.0': {} '@eslint/eslintrc@3.1.0': dependencies: @@ -1623,11 +1615,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.12.0': {} + '@eslint/js@9.13.0': {} '@eslint/object-schema@2.1.4': {} - '@eslint/plugin-kit@0.2.0': + '@eslint/plugin-kit@0.2.1': dependencies: levn: 0.4.1 @@ -1642,17 +1634,17 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@hypernym/eslint-config@3.5.0(eslint@9.12.0)(typescript@5.5.4)': + '@hypernym/eslint-config@3.5.1(eslint@9.13.0)(typescript@5.6.3)': dependencies: - '@eslint/js': 9.12.0 + '@eslint/js': 9.13.0 '@types/eslint': 9.6.1 '@types/eslint__js': 8.42.3 - '@typescript-eslint/eslint-plugin': 8.8.0(@typescript-eslint/parser@8.8.0(eslint@9.12.0)(typescript@5.5.4))(eslint@9.12.0)(typescript@5.5.4) - '@typescript-eslint/parser': 8.8.0(eslint@9.12.0)(typescript@5.5.4) - eslint: 9.12.0 - globals: 15.10.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.5.4 + typescript: 5.6.3 transitivePeerDependencies: - supports-color @@ -1660,16 +1652,16 @@ snapshots: dependencies: prettier: 3.3.3 - '@hypernym/tsconfig@2.4.0(@types/node@22.7.5)(typescript@5.5.4)': + '@hypernym/tsconfig@2.4.0(@types/node@22.7.7)(typescript@5.6.3)': dependencies: - typescript: 5.5.4 + typescript: 5.6.3 optionalDependencies: - '@types/node': 22.7.5 + '@types/node': 22.7.7 - '@hypernym/utils@3.4.0(@types/node@22.7.5)(typescript@5.5.4)': + '@hypernym/utils@3.4.0(@types/node@22.7.7)(typescript@5.6.3)': optionalDependencies: - '@types/node': 22.7.5 - typescript: 5.5.4 + '@types/node': 22.7.7 + typescript: 5.6.3 '@isaacs/cliui@8.0.2': dependencies: @@ -1705,91 +1697,91 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@22.7.5': + '@types/node@22.7.7': dependencies: undici-types: 6.19.8 '@types/vscode@1.94.0': {} - '@typescript-eslint/eslint-plugin@8.8.0(@typescript-eslint/parser@8.8.0(eslint@9.12.0)(typescript@5.5.4))(eslint@9.12.0)(typescript@5.5.4)': + '@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.8.0(eslint@9.12.0)(typescript@5.5.4) - '@typescript-eslint/scope-manager': 8.8.0 - '@typescript-eslint/type-utils': 8.8.0(eslint@9.12.0)(typescript@5.5.4) - '@typescript-eslint/utils': 8.8.0(eslint@9.12.0)(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 8.8.0 - eslint: 9.12.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.5.4) + ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.8.0(eslint@9.12.0)(typescript@5.5.4)': + '@typescript-eslint/parser@8.10.0(eslint@9.13.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/scope-manager': 8.8.0 - '@typescript-eslint/types': 8.8.0 - '@typescript-eslint/typescript-estree': 8.8.0(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 8.8.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.12.0 + eslint: 9.13.0 optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.8.0': + '@typescript-eslint/scope-manager@8.10.0': dependencies: - '@typescript-eslint/types': 8.8.0 - '@typescript-eslint/visitor-keys': 8.8.0 + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/visitor-keys': 8.10.0 - '@typescript-eslint/type-utils@8.8.0(eslint@9.12.0)(typescript@5.5.4)': + '@typescript-eslint/type-utils@8.10.0(eslint@9.13.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.8.0(typescript@5.5.4) - '@typescript-eslint/utils': 8.8.0(eslint@9.12.0)(typescript@5.5.4) + '@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.5.4) + ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.3 transitivePeerDependencies: - eslint - supports-color - '@typescript-eslint/types@8.8.0': {} + '@typescript-eslint/types@8.10.0': {} - '@typescript-eslint/typescript-estree@8.8.0(typescript@5.5.4)': + '@typescript-eslint/typescript-estree@8.10.0(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 8.8.0 - '@typescript-eslint/visitor-keys': 8.8.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.5.4) + ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: - typescript: 5.5.4 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.8.0(eslint@9.12.0)(typescript@5.5.4)': + '@typescript-eslint/utils@8.10.0(eslint@9.13.0)(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0) - '@typescript-eslint/scope-manager': 8.8.0 - '@typescript-eslint/types': 8.8.0 - '@typescript-eslint/typescript-estree': 8.8.0(typescript@5.5.4) - eslint: 9.12.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.8.0': + '@typescript-eslint/visitor-keys@8.10.0': dependencies: - '@typescript-eslint/types': 8.8.0 + '@typescript-eslint/types': 8.10.0 eslint-visitor-keys: 3.4.3 '@vscode/vsce-sign-alpine-arm64@2.0.2': @@ -1831,16 +1823,16 @@ snapshots: '@vscode/vsce-sign-win32-arm64': 2.0.2 '@vscode/vsce-sign-win32-x64': 2.0.2 - '@vscode/vsce@3.1.1': + '@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 @@ -1862,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: @@ -1979,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: @@ -2139,15 +2131,15 @@ snapshots: eslint-visitor-keys@4.1.0: {} - eslint@9.12.0: + eslint@9.13.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.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.6.0 + '@eslint/core': 0.7.0 '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.12.0 - '@eslint/plugin-kit': 0.2.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.1 @@ -2181,8 +2173,8 @@ snapshots: espree@10.2.0: dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) + acorn: 8.13.0 + acorn-jsx: 5.3.2(acorn@8.13.0) eslint-visitor-keys: 4.1.0 esquery@1.6.0: @@ -2249,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 @@ -2290,7 +2282,7 @@ snapshots: globals@14.0.0: {} - globals@15.10.0: {} + globals@15.11.0: {} gopd@1.0.1: dependencies: @@ -2535,7 +2527,7 @@ snapshots: natural-compare@1.4.0: {} - node-abi@3.68.0: + node-abi@3.71.0: dependencies: semver: 7.6.3 optional: true @@ -2587,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 @@ -2621,7 +2613,7 @@ snapshots: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 1.0.2 - node-abi: 3.68.0 + node-abi: 3.71.0 pump: 3.0.2 rc: 1.2.8 simple-get: 4.0.1 @@ -2785,11 +2777,11 @@ snapshots: dependencies: is-number: 7.0.0 - ts-api-utils@1.3.0(typescript@5.5.4): + ts-api-utils@1.3.0(typescript@5.6.3): dependencies: - typescript: 5.5.4 + typescript: 5.6.3 - tslib@2.7.0: {} + tslib@2.8.0: {} tunnel-agent@0.6.0: dependencies: @@ -2808,7 +2800,7 @@ snapshots: tunnel: 0.0.6 underscore: 1.13.7 - typescript@5.5.4: {} + typescript@5.6.3: {} uc.micro@2.1.0: {} @@ -2816,7 +2808,7 @@ snapshots: undici-types@6.19.8: {} - undici@6.19.8: {} + undici@6.20.1: {} uri-js@4.4.1: dependencies: