{ // 插件 id 及名称 "name": "variable-conversion", "displayName": "Variable Conversion", "description": "一个强大的变量名转换插件,支持右键菜单、快捷键、状态栏等多种方式使用,支持小驼峰、大驼峰(帕斯卡)、下划线(蛇形)、中划线(连字符/脊柱式)、空格分隔、点分隔、全小写、全大写等常用命名方式(及组合)转换。 \nA powerful variable naming conversion extension. You can use it through the editer menu, shortcut keys and bottom bar. Support camel, pascal, snake, kebab(spinal), space, dot, lower, upper case, and more.", // 版本号 "version": "2.0.0", // logo "icon": "image/logo.png", "publisher": "coder-xiaomo", "engines": { "vscode": "^1.87.0" }, "categories": [ "Other" ], // 仓库地址 "repository": { "type": "git", "url": "https://github.com/coder-xiaomo/variable-conversion-vscode-extension.git" }, "repositories": [ { "type": "git", "url": "https://git.only4.work/coder-xiaomo/variable-conversion-vscode-extension.git" }, { "type": "git", "url": "https://gitee.com/coder-xiaomo/variable-conversion-vscode-extension.git" } ], "main": "./out/extension.js", "activationEvents": [ // 当编辑器完成启动时激活 "onStartupFinished", // 当用户选中文本时激活 "onTextSelected" ], "contributes": { // docs: https://code.visualstudio.com/docs/getstarted/keybindings#_accepted-keys "keybindings": [ // 绑定快捷键 // ↓ 变量转换快捷键 { "command": "variable-conversion.convertCase", "key": "shift+alt+t", "when": "editorTextFocus" }, // 循环转换 上一个 { "command": "variable-conversion.cyclicConvertCase.previous", "key": "ctrl+alt+[", "args": { "arrowKey": "[" }, "when": "editorTextFocus" }, // 循环转换 下一个 { "command": "variable-conversion.cyclicConvertCase.next", "key": "ctrl+alt+]", "args": { "arrowKey": "]" }, "when": "editorTextFocus" }, // ↓ 路径转换快捷键 { "command": "variable-conversion.convertPath", "key": "shift+alt+/", "when": "editorTextFocus" }, // 循环转换 上一个 { "command": "variable-conversion.cyclicConvertPath.previous", "key": "ctrl+alt+shift+/", "args": { "direction": "<-" }, "when": "editorTextFocus" }, // 循环转换 下一个 { "command": "variable-conversion.cyclicConvertPath.next", "key": "ctrl+alt+/", "args": { "direction": "->" }, "when": "editorTextFocus" } ], "commands": [ /** * 循环转换 可以不添加 */ // { // "command": "variable-conversion.cyclicConvertCase.previous", // "title": "变量转换(上一个)" // }, // { // "command": "variable-conversion.cyclicConvertCase.next", // "title": "变量转换(下一个)" // }, /** * 右键菜单 */ { "command": "variable-conversion.convertCase", "title": "变量转换" }, /** * 右键菜单 - 子菜单 */ // group-1-camel { "command": "variable-conversion.toCamelCase", "title": "小驼峰(驼峰)命名 (Camel Case) [ fooBar ]" }, { "command": "variable-conversion.toPascalCase", "title": "大驼峰(帕斯卡)命名 (Pascal Case) [ FooBar ]" }, // group-2-snake { "command": "variable-conversion.toSnakeCase", "title": "下划线(蛇形)命名 (Snake Case) [ foo_bar ]" }, { "command": "variable-conversion.toSnakeUpperCase", "title": "下划线(蛇形) + 全大写命名 (Snake Upper Case) [ FOO_BAR ]" }, { "command": "variable-conversion.toSnakePascalCase", "title": "下划线(蛇形) + 大驼峰(帕斯卡)命名 (Snake Pascal Case) [ Foo_Bar ]" }, { "command": "variable-conversion.toSnakeCamelCase", "title": "下划线(蛇形) + 小驼峰(驼峰)命名 (Snake Camel Case) [ foo_Bar ]" }, // group-3-kebab { "command": "variable-conversion.toKebabCase", "title": "中划线(连字符/脊柱式)命名 (Kebab/Spinal Case) [ foo-bar ]" }, { "command": "variable-conversion.toKebabUpperCase", "title": "中划线(连字符/脊柱式) + 全大写命名 (Kebab Upper Case) [ FOO-BAR ]" }, { "command": "variable-conversion.toKebabPascalCase", "title": "中划线(连字符/脊柱式) + 大驼峰(帕斯卡)命名 (Kebab Pascal Case) [ Foo-Bar ]" }, { "command": "variable-conversion.toKebabCamelCase", "title": "中划线(连字符/脊柱式) + 小驼峰(驼峰)命名 (Kebab Camel Case) [ foo-Bar ]" }, // group-4-space { "command": "variable-conversion.toSpaceCase", "title": "空格分隔命名 (Space Case) [ foo bar ]" }, { "command": "variable-conversion.toSpaceUpperCase", "title": "空格分隔 + 全大写命名 (Space Upper Case) [ FOO BAR ]" }, { "command": "variable-conversion.toSpacePascalCase", "title": "空格分隔 + 大驼峰(帕斯卡)命名 (Space Pascal Case) [ Foo Bar ]" }, { "command": "variable-conversion.toSpaceCamelCase", "title": "空格分隔 + 小驼峰(驼峰)命名 (Space Camel Case) [ foo Bar ]" }, // group-5-dot { "command": "variable-conversion.toDotCase", "title": "点分隔命名 (Dot Case) [ foo bar ]" }, { "command": "variable-conversion.toDotUpperCase", "title": "点分隔 + 全大写命名 (Dot Upper Case) [ FOO BAR ]" }, { "command": "variable-conversion.toDotPascalCase", "title": "点分隔 + 大驼峰(帕斯卡)命名 (Dot Pascal Case) [ Foo Bar ]" }, { "command": "variable-conversion.toDotCamelCase", "title": "点分隔 + 小驼峰(驼峰)命名 (Dot Camel Case) [ foo Bar ]" }, // group-6-upper-lower { "command": "variable-conversion.toLowerCase", "title": "全小写 (Lower Case) [ foobar ]" }, { "command": "variable-conversion.toUpperCase", "title": "全大写 (Upper Case) [ FOOBAR ]" }, // 隐藏命令 // { // "command": "editor.action.transformToCamelcase", // "title": "[VSCode 自带] 驼峰式大小写 (Camel Case) [ fooBar ]", // "enablement": "false" // }, // { // "command": "editor.action.transformToKebabcase", // "title": "[VSCode 自带] Kebab 命名 (Kebab Case) [ foo-bar ]", // "enablement": "false" // }, // { // "command": "editor.action.transformToTitlecase", // "title": "[VSCode 自带] 词首字母大写 (Title Case) [ Foo Bar ]", // "enablement": "false" // }, // { // "command": "editor.action.transformToLowercase", // "title": "[VSCode 自带] 转换为小写 (Lower Case) [ foo bar ]", // "enablement": "false" // }, // { // "command": "editor.action.transformToUppercase", // "title": "[VSCode 自带] 转换为大写 (Upper Case) [ FOO BAR ]", // "enablement": "false" // }, // { // "command": "editor.action.transformToSnakecase", // "title": "[VSCode 自带] 转换为蛇形命名法 (Snake Case) [ foo_bar ]", // "enablement": "false" // }, /** * 右键菜单 */ { "command": "variable-conversion.convertPath", "title": "路径转换" }, /** * 右键菜单 - 子菜单 */ // group-1-common-style { "command": "variable-conversion.pathFormat.toWindowsStyle", "title": "Windows 风格 [ C:\\Windows\\System32 ]" }, { "command": "variable-conversion.pathFormat.toUnixStyle", "title": "Unix 风格 [ /usr/bin ]" } ], // docs: https://code.visualstudio.com/api/references/contribution-points#contributes.menus "menus": { // 编辑器右键菜单 "editor/context": [ // 变量转换 { // "when": "editorTextFocus", // 2024.12.07 当未选中文字时,隐藏 [变量转换] 右键菜单 "when": "editorTextFocus && _textSelectionLength >= 1", "command": "variable-conversion.convertCase", // "group": "1_modification@9" "group": "navigation@10" }, // 将变量转换为... { "when": "editorTextFocus && _textSelectionLength >= 1", "submenu": "variable-conversion.stringConversionMenu", // docs: https://code.visualstudio.com/api/references/contribution-points#Sorting-of-groups // "group": "1_modification@9" "group": "navigation@11" }, // 路径转换 { // "when": "editorTextFocus", // 2024.12.07 当未选中文字时,隐藏 [变量转换] 右键菜单 "when": "editorTextFocus && _textSelectionLength >= 1", "command": "variable-conversion.convertPath", "group": "navigation@12" }, // 将路径转换为... { "when": "editorTextFocus && _textSelectionLength >= 1", "submenu": "variable-conversion.pathConversionMenu", "group": "navigation@13" } ], "variable-conversion.stringConversionMenu": [ // group-1-camel { "when": "!_isHideSubMenuItem_camel_case", "command": "variable-conversion.toCamelCase", "group": "group-1-camel@1" }, { "when": "!_isHideSubMenuItem_pascal_case", "command": "variable-conversion.toPascalCase", "group": "group-1-camel@2" }, // group-2-snake { "when": "!_isHideSubMenuItem_snake_case", "command": "variable-conversion.toSnakeCase", "group": "group-2-snake@1" }, { "when": "!_isHideSubMenuItem_snake_upper_case", "command": "variable-conversion.toSnakeUpperCase", "group": "group-2-snake@2" }, { "when": "!_isHideSubMenuItem_snake_pascal_case", "command": "variable-conversion.toSnakePascalCase", "group": "group-2-snake@3" }, { "when": "!_isHideSubMenuItem_snake_camel_case", "command": "variable-conversion.toSnakeCamelCase", "group": "group-2-snake@4" }, // group-3-kebab { "when": "!_isHideSubMenuItem_kebab_case", "command": "variable-conversion.toKebabCase", "group": "group-3-kebab@1" }, { "when": "!_isHideSubMenuItem_kebab_upper_case", "command": "variable-conversion.toKebabUpperCase", "group": "group-3-kebab@2" }, { "when": "!_isHideSubMenuItem_kebab_pascal_case", "command": "variable-conversion.toKebabPascalCase", "group": "group-3-kebab@3" }, { "when": "!_isHideSubMenuItem_kebab_camel_case", "command": "variable-conversion.toKebabCamelCase", "group": "group-3-kebab@4" }, // group-4-space { "when": "!_isHideSubMenuItem_space_case", "command": "variable-conversion.toSpaceCase", "group": "group-4-space@1" }, { "when": "!_isHideSubMenuItem_space_upper_case", "command": "variable-conversion.toSpaceUpperCase", "group": "group-4-space@2" }, { "when": "!_isHideSubMenuItem_space_pascal_case", "command": "variable-conversion.toSpacePascalCase", "group": "group-4-space@3" }, { "when": "!_isHideSubMenuItem_space_camel_case", "command": "variable-conversion.toSpaceCamelCase", "group": "group-4-space@4" }, // group-5-dot { "when": "!_isHideSubMenuItem_dot_case", "command": "variable-conversion.toDotCase", "group": "group-5-dot@1" }, { "when": "!_isHideSubMenuItem_dot_upper_case", "command": "variable-conversion.toDotUpperCase", "group": "group-5-dot@2" }, { "when": "!_isHideSubMenuItem_dot_pascal_case", "command": "variable-conversion.toDotPascalCase", "group": "group-5-dot@3" }, { "when": "!_isHideSubMenuItem_dot_camel_case", "command": "variable-conversion.toDotCamelCase", "group": "group-5-dot@4" }, // group-6-upper-lower { "when": "!_isHideSubMenuItem_lower_case", "command": "variable-conversion.toLowerCase", "group": "group-6-upper-lower@1" }, { "when": "!_isHideSubMenuItem_upper_case", "command": "variable-conversion.toUpperCase", "group": "group-6-upper-lower@2" } // 隐藏菜单项 // { // "command": "editor.action.transformToCamelcase", // "group": "group-vscode", // "when": "false" // }, // { // "command": "editor.action.transformToKebabcase", // "group": "group-vscode", // "when": "false" // }, // { // "command": "editor.action.transformToTitlecase", // "group": "group-vscode", // "when": "false" // }, // { // "command": "editor.action.transformToLowercase", // "group": "group-vscode", // "when": "false" // }, // { // "command": "editor.action.transformToUppercase", // "group": "group-vscode", // "when": "false" // }, // { // "command": "editor.action.transformToSnakecase", // "group": "group-vscode", // "when": "false" // } ], "variable-conversion.pathConversionMenu": [ // group-1-common-style { // Windows 风格 "when": "!_isHideSubMenuItem_windows_style", "command": "variable-conversion.pathFormat.toWindowsStyle", "group": "group-1-common-style@1" }, { // Unix 风格 "when": "!_isHideSubMenuItem_unix_style", "command": "variable-conversion.pathFormat.toUnixStyle", "group": "group-1-common-style@2" } ] }, // docs: https://code.visualstudio.com/api/references/contribution-points#contributes.submenus "submenus": [ { "id": "variable-conversion.stringConversionMenu", "label": "将变量转换为..." }, { "id": "variable-conversion.pathConversionMenu", "label": "将路径转换为..." } ], // docs: https://code.visualstudio.com/api/references/contribution-points#contributes.configuration "configuration": { "title": "Variable Conversion 变量转换", "properties": { // 仅测试用 // "variable-conversion.test1": { // "title": "定义转换格式的排序", // "description": "Defines the ordering of the conversion format.\n定义转换格式的排序", // "type": "array", // "default": [ // "camelCase", // "snake_case", // "PascalCase" // ] // }, // "variable-conversion.enableFormat": { // "type": "object", // "default": { // "camelCase": true, // "snake_case": true, // "PascalCase": true // }, // "description": "Define which formats are enabled.\n定义哪些格式是开启的" // }, // // 全小写命名 // lower_case(全小写), snake_case(下划线), kebab_case(连字符), space_case(空格), dot_case(点) // 全大写命名 // upper_case(全大写), snake_upper_case(下划线), kebab_upper_case(连字符), space_upper_case(空格), dot_upper_case(点) // 大驼峰命名 // pascal_case(大驼峰), snake_pascal_case(下划线), kebab_pascal_case(连字符), space_pascal_case(空格), dot_pascal_case(点) // 小驼峰命名 // camel_case(小驼峰), snake_camel_case(下划线), kebab_camel_case(连字符), space_camel_case(空格), dot_camel_case(点) "variable-conversion.disableFormat": { "order": 1, // markdownDescription 最多配置 11 行 "markdownDescription": "定义哪些变量命名方式是禁用的\n\nDefine which variable formats are disabled.\n\n若您感觉以下配置比较麻烦,也可以选择在 `settings.json` 中编辑:\n\nIf you find the following configuration troublesome, you can also edit this configuration item in `settings.json`:\n\n`\"variable-conversion.disableFormat\": [ ... ],`\n\n[在 settings.json 中编辑 (Edit in settings.json)](command:workbench.action.openSettingsJson)\n\n配置后,您可能需要*重启扩展宿主*,或*重启当前窗口*才可使该配置完全生效(二选一即可):\n\nYou may need to *restart extension host* or *reload window* after configuration to take full effect (either):\n\n[重启扩展宿主 (Restart Extension Host)](command:workbench.action.restartExtensionHost), [重启当前窗口 (Reload Window)](command:workbench.action.reloadWindow)", "type": "array", "items": { "type": "string", "enum": [ "camel_case", "pascal_case", "snake_case", "snake_camel_case", "snake_pascal_case", "snake_upper_case", "kebab_case", "kebab_camel_case", "kebab_pascal_case", "kebab_upper_case", "space_case", "space_camel_case", "space_pascal_case", "space_upper_case", "dot_case", "dot_camel_case", "dot_pascal_case", "dot_upper_case", "lower_case", "upper_case" ], "enumDescriptions": [ "小驼峰(驼峰)命名", "大驼峰(帕斯卡)命名", "下划线(蛇形)命名", "下划线(蛇形) + 小驼峰(驼峰)命名", "下划线(蛇形) + 大驼峰(帕斯卡)命名", "下划线(蛇形) + 全大写命名", "中划线(连字符/脊柱式)命名", "中划线(连字符/脊柱式) + 小驼峰(驼峰)命名", "中划线(连字符/脊柱式) + 大驼峰(帕斯卡)命名", "中划线(连字符/脊柱式) + 全大写命名", "空格分隔命名", "空格分隔 + 小驼峰(驼峰)命名", "空格分隔 + 大驼峰(帕斯卡)命名", "空格分隔 + 全大写命名", "点分隔命名", "点分隔 + 小驼峰(驼峰)命名", "点分隔 + 大驼峰(帕斯卡)命名", "点分隔 + 全大写命名", "全小写", "全大写" ] }, "default": [] }, "variable-conversion.circularConversionFormatOrder": { "order": 2, "title": "定义循环转换快捷键的目标格式排序", // "description": "Defines the destination format ordering of the circular conversion shortcut.\n定义循环转换快捷键的目标格式排序", // markdownDescription 最多配置 11 行 // "markdownDescription": "Defines the destination format ordering of the circular conversion shortcut, separated by commas.\n\n 定义循环转换快捷键的目标格式排序,以英文逗号分隔\n\n Target formats that are not in the following configuration list will appear last in the following custom order in the default order.\n\n不在以下配置列表中的目标格式,将按照默认顺序排在以下自定义顺序最后\n\n 🌟Lower Case 全小写命名: `lower_case`(全小写), `snake_case`(下划线), `kebab_case`(连字符), `space_case`(空格), `dot_case`(点)\n\n 🌟Upper Case 全大写命名: `upper_case`(全大写), `snake_upper_case`(下划线), `kebab_upper_case`(连字符), `space_upper_case`(空格), `dot_upper_case`(点)\n\n 🌟Pascal Case 大驼峰命名: `pascal_case`(大驼峰), `snake_pascal_case`(下划线), `kebab_pascal_case`(连字符), `space_pascal_case`(空格), `dot_pascal_case`(点)\n\n 🌟Camel Case 小驼峰命名: `camel_case`(小驼峰), `snake_camel_case`(下划线), `kebab_camel_case`(连字符), `space_camel_case`(空格), `dot_camel_case`(点)\n\n🐳Default value 默认值: `camel_case, snake_case, pascal_case, kebab_case, space_case, dot_case, snake_upper_case, kebab_upper_case, space_upper_case, dot_upper_case, snake_pascal_case, kebab_pascal_case, space_pascal_case, dot_pascal_case, snake_camel_case, kebab_camel_case, space_camel_case, dot_camel_case, lower_case, upper_case`\n\n If you find the following configuration troublesome, you can also edit this configuration item in `settings.json`. 若您感觉以下配置比较麻烦,也可以选择在 `settings.json` 中编辑: `\"variable-conversion.circularConversionFormatOrder\": \"...\",` [Edit in settings.json (在 settings.json 中编辑)](command:workbench.action.openSettingsJson)", "markdownDescription": "定义循环转换快捷键的目标格式排序,以英文逗号分隔。不在以下配置列表中的目标格式,将按照默认顺序排在以下自定义顺序最后\n\n Defines the destination format ordering of the circular conversion shortcut, separated by commas. (Target formats that are not in the following configuration list will appear last in the following custom order in the default order.)\n\n 📌请[在 `settings.json` 中编辑该配置](command:workbench.action.openSettingsJson),**不要使用**设置页面的下拉框进行配置: `\"variable-conversion.circularConversionFormatOrder\": [ ... ],`\n\n 📌Please [edit this configuration in `settings.json`](command:workbench.action.openSettingsJson), **instead of** using the drop-down box on the settings page.\n\n 🐳默认值 Default value: `\"variable-conversion.circularConversionFormatOrder\": [ \"camel_case\", \"snake_case\", \"pascal_case\", \"kebab_case\", \"space_case\", \"dot_case\", \"snake_upper_case\", \"kebab_upper_case\", \"space_upper_case\", \"dot_upper_case\", \"snake_pascal_case\", \"kebab_pascal_case\", \"space_pascal_case\", \"dot_pascal_case\", \"snake_camel_case\", \"kebab_camel_case\", \"space_camel_case\", \"dot_camel_case\", \"lower_case\", \"upper_case\" ],`\n\n 👉Configuration item meaning 配置项说明\n\n 🌟Lower Case 全小写命名: `lower_case`(全小写), `snake_case`(下划线), `kebab_case`(连字符), `space_case`(空格), `dot_case`(点)\n\n 🌟Upper Case 全大写命名: `upper_case`(全大写), `snake_upper_case`(下划线), `kebab_upper_case`(连字符), `space_upper_case`(空格), `dot_upper_case`(点)\n\n 🌟Pascal Case 大驼峰命名: `pascal_case`(大驼峰), `snake_pascal_case`(下划线), `kebab_pascal_case`(连字符), `space_pascal_case`(空格), `dot_pascal_case`(点)\n\n 🌟Camel Case 小驼峰命名: `camel_case`(小驼峰), `snake_camel_case`(下划线), `kebab_camel_case`(连字符), `space_camel_case`(空格), `dot_camel_case`(点)", // "type": "string", // "default": "camel_case, snake_case, pascal_case, kebab_case, space_case, dot_case, snake_upper_case, kebab_upper_case, space_upper_case, dot_upper_case, snake_pascal_case, kebab_pascal_case, space_pascal_case, dot_pascal_case, snake_camel_case, kebab_camel_case, space_camel_case, dot_camel_case, lower_case, upper_case" "type": "array", "items": { "type": "string", "enum": [ "camel_case", "pascal_case", "snake_case", "snake_camel_case", "snake_pascal_case", "snake_upper_case", "kebab_case", "kebab_camel_case", "kebab_pascal_case", "kebab_upper_case", "space_case", "space_camel_case", "space_pascal_case", "space_upper_case", "dot_case", "dot_camel_case", "dot_pascal_case", "dot_upper_case", "lower_case", "upper_case" ], "enumDescriptions": [ "小驼峰(驼峰)命名", "大驼峰(帕斯卡)命名", "下划线(蛇形)命名", "下划线(蛇形) + 小驼峰(驼峰)命名", "下划线(蛇形) + 大驼峰(帕斯卡)命名", "下划线(蛇形) + 全大写命名", "中划线(连字符/脊柱式)命名", "中划线(连字符/脊柱式) + 小驼峰(驼峰)命名", "中划线(连字符/脊柱式) + 大驼峰(帕斯卡)命名", "中划线(连字符/脊柱式) + 全大写命名", "空格分隔命名", "空格分隔 + 小驼峰(驼峰)命名", "空格分隔 + 大驼峰(帕斯卡)命名", "空格分隔 + 全大写命名", "点分隔命名", "点分隔 + 小驼峰(驼峰)命名", "点分隔 + 大驼峰(帕斯卡)命名", "点分隔 + 全大写命名", "全小写", "全大写" ] }, "default": [ "camel_case", "snake_case", "pascal_case", "kebab_case", "space_case", "dot_case", "snake_upper_case", "kebab_upper_case", "space_upper_case", "dot_upper_case", "snake_pascal_case", "kebab_pascal_case", "space_pascal_case", "dot_pascal_case", "snake_camel_case", "kebab_camel_case", "space_camel_case", "dot_camel_case", "lower_case", "upper_case" ] }, // TODO "variable-conversion.disablePathFormat": { "order": 3, // markdownDescription 最多配置 11 行 "markdownDescription": "定义哪些路径风格是禁用的\n\nDefine which path formats are disabled.\n\n若您感觉以下配置比较麻烦,也可以选择在 `settings.json` 中编辑:\n\nIf you find the following configuration troublesome, you can also edit this configuration item in `settings.json`:\n\n`\"variable-conversion.disablePathFormat\": [ ... ],`\n\n[在 settings.json 中编辑 (Edit in settings.json)](command:workbench.action.openSettingsJson)\n\n配置后,您可能需要*重启扩展宿主*,或*重启当前窗口*才可使该配置完全生效(二选一即可):\n\nYou may need to *restart extension host* or *reload window* after configuration to take full effect (either):\n\n[重启扩展宿主 (Restart Extension Host)](command:workbench.action.restartExtensionHost), [重启当前窗口 (Reload Window)](command:workbench.action.reloadWindow)", "type": "array", "items": { "type": "string", "enum": [ "windows_style", "unix_style" ], "enumDescriptions": [ "Windows 风格", "Unix 风格" ] }, "default": [] } } } }, "scripts": { "vscode:prepublish": "npm run compile", "compile": "tsc -p ./", "watch": "tsc -watch -p ./", "pretest": "npm run compile && npm run lint", "lint": "eslint src --ext ts", "test": "vscode-test", "package": "echo \"start `vsce package`\" & vsce package", "publish": "vsce publish" }, "devDependencies": { "@types/mocha": "^10.0.6", "@types/node": "18.x", "@types/vscode": "^1.87.0", "@typescript-eslint/eslint-plugin": "^7.4.0", "@typescript-eslint/parser": "^7.4.0", "@vscode/test-cli": "^0.0.8", "@vscode/test-electron": "^2.3.9", "eslint": "^8.57.0", "typescript": "^5.3.3" } }