diff --git a/packages/backend/package.json b/packages/backend/package.json index 0759f861e..3d84c12d4 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -198,7 +198,8 @@ "strip-ansi": "6.0.0", "sudo-prompt": "9.2.1", "titleize": "2.1.0", - "yeoman-environment": "3.19.3" + "yeoman-environment": "3.19.3", + "vscode-uri": "3.1.0" }, "devDependencies": { "@types/cheerio": "^0.22.31", diff --git a/packages/backend/src/panels/YeomanUIPanel.ts b/packages/backend/src/panels/YeomanUIPanel.ts index 17ea6d494..b952a235a 100644 --- a/packages/backend/src/panels/YeomanUIPanel.ts +++ b/packages/backend/src/panels/YeomanUIPanel.ts @@ -16,6 +16,7 @@ import { NpmCommand } from "../utils/npm"; import { Constants } from "../utils/constants"; import { notifyGeneratorsInstallationProgress } from "../utils/generators-installation-progress"; import messages from "../messages"; +import { getFileSchemeWorkspaceFolders } from "../utils/workspaceFolders"; export class YeomanUIPanel extends AbstractWebviewPanel { public static YEOMAN_UI = "Application Wizard"; @@ -142,7 +143,8 @@ export class YeomanUIPanel extends AbstractWebviewPanel { } uri = vscode.Uri.file(currentPath); } catch (e) { - uri = get(vscode, "workspace.workspaceFolders[0].uri"); + const fileSchemeWorkspaces = getFileSchemeWorkspaceFolders(); + uri = fileSchemeWorkspaces.length > 0 ? fileSchemeWorkspaces[0].uri : undefined; if (isNil(uri)) { uri = vscode.Uri.file(join(homedir())); } diff --git a/packages/backend/src/utils/vscodeProxy.ts b/packages/backend/src/utils/vscodeProxy.ts index d65639811..c0751484d 100644 --- a/packages/backend/src/utils/vscodeProxy.ts +++ b/packages/backend/src/utils/vscodeProxy.ts @@ -1,5 +1,6 @@ import { set } from "lodash"; import { join } from "path"; +import { URI } from "vscode-uri"; export const getVscode = () => { try { @@ -33,10 +34,10 @@ const context = { globalState: globalStateObj, extensionPath: "" }; const Uri = { file: (path?: string) => { - return { fsPath: path }; + return URI.file(path || ""); }, parse: (path?: string) => { - return { fsPath: path }; + return URI.parse(path || ""); }, }; diff --git a/packages/backend/src/utils/workspaceFolders.ts b/packages/backend/src/utils/workspaceFolders.ts new file mode 100644 index 000000000..885295c5c --- /dev/null +++ b/packages/backend/src/utils/workspaceFolders.ts @@ -0,0 +1,32 @@ +import { workspace, WorkspaceFolder } from "vscode"; + +/** + * Returns an array of WorkspaceFolder objects with 'file' URI scheme. + * Useful when you need the full WorkspaceFolder metadata (name, uri, etc.). + * @returns Array of WorkspaceFolder objects with file scheme, or empty array + */ +export function getFileSchemeWorkspaceFolders(): WorkspaceFolder[] { + return workspace.workspaceFolders + ? workspace.workspaceFolders.filter((folder) => folder?.uri?.scheme === "file") + : []; +} + +/** + * Returns an array of file system paths for workspace folders with 'file' URI scheme. + * Filters out virtual workspaces (remote, SSH, WSL, etc.) that don't have valid fsPath. + * @returns Array of file system paths, or empty array if no file-scheme workspaces exist + */ +export function getWorkspaceFolders(): string[] { + return getFileSchemeWorkspaceFolders().map((ws) => ws.uri.fsPath); +} + +/** + * Returns the first file-scheme workspace path, or fallback if none exist. + * Convenience method for cases where you need a single path with a default. + * @param fallback The fallback path to use if no file-scheme workspaces exist + * @returns The first file-scheme workspace path or the fallback value + */ +export function getFirstWorkspacePath(fallback: string): string { + const paths = getWorkspaceFolders(); + return paths.length > 0 ? paths[0] : fallback; +} diff --git a/packages/backend/src/vscode-youi-events.ts b/packages/backend/src/vscode-youi-events.ts index da000674c..00fa487fe 100644 --- a/packages/backend/src/vscode-youi-events.ts +++ b/packages/backend/src/vscode-youi-events.ts @@ -1,5 +1,5 @@ import * as vscode from "vscode"; -import { isEmpty, size, isNil, set } from "lodash"; +import { isEmpty, isNil, set } from "lodash"; import { YouiEvents } from "./youi-events"; import { IRpc } from "@sap-devx/webview-rpc/out.ext/rpc-common"; import { GeneratorOutput } from "./vscode-output"; @@ -9,6 +9,7 @@ import { getImage } from "./images/messageImages"; import { AppWizard, MessageType, Severity, IBannerProps } from "@sap-devx/yeoman-ui-types"; import { FolderUriConfig, getFolderUri, getValidFolderUri, WorkspaceFile, WsFoldersToAdd } from "./utils/workspaceFile"; import { Constants } from "./utils/constants"; +import { getFileSchemeWorkspaceFolders } from "./utils/workspaceFolders"; class YoUiAppWizard extends AppWizard { constructor(private readonly events: VSCodeYouiEvents) { @@ -240,7 +241,7 @@ export class VSCodeYouiEvents implements YouiEvents { } private getUniqueProjectName(baseName: string): string { - const existingNames = vscode.workspace.workspaceFolders?.map((folder) => folder.name) || []; + const existingNames = getFileSchemeWorkspaceFolders().map((folder) => folder.name); if (!existingNames.includes(baseName)) { return baseName; } @@ -257,8 +258,9 @@ export class VSCodeYouiEvents implements YouiEvents { } private addOrCreateProjectWorkspace(wsFoldersToAdd: WsFoldersToAdd) { - const wsFoldersQuantity = size(vscode.workspace.workspaceFolders); - vscode.workspace.updateWorkspaceFolders(wsFoldersQuantity, null, wsFoldersToAdd); + const fileSchemeWorkspaces = getFileSchemeWorkspaceFolders(); + const insertPosition = fileSchemeWorkspaces.length; + vscode.workspace.updateWorkspaceFolders(insertPosition, null, wsFoldersToAdd); } private getSuccessInfoMessage(selectedWorkspace: string, type: string): string { diff --git a/packages/backend/src/yeomanui.ts b/packages/backend/src/yeomanui.ts index 3bf9cf6e6..2501eb7ac 100644 --- a/packages/backend/src/yeomanui.ts +++ b/packages/backend/src/yeomanui.ts @@ -24,6 +24,7 @@ import { Questions } from "yeoman-environment/lib/adapter"; import { State } from "./utils/promise"; import { Constants } from "./utils/constants"; import { isUriFlow } from "./utils/workspaceFile"; +import { getFirstWorkspacePath } from "./utils/workspaceFolders"; export interface IQuestionsPrompt extends IPrompt { questions: any[]; @@ -363,9 +364,7 @@ export class YeomanUI { return targetFolderConfig; } - return Constants.IS_IN_BAS - ? Constants.HOMEDIR_PROJECTS - : _.get(vscode, "workspace.workspaceFolders[0].uri.fsPath", Constants.HOMEDIR_PROJECTS); + return Constants.IS_IN_BAS ? Constants.HOMEDIR_PROJECTS : getFirstWorkspacePath(Constants.HOMEDIR_PROJECTS); } public async showPrompt(questions: Questions): Promise { diff --git a/packages/backend/test/panels/YeomanUIPanel.spec.ts b/packages/backend/test/panels/YeomanUIPanel.spec.ts index 0c3f06037..f3e4bd907 100644 --- a/packages/backend/test/panels/YeomanUIPanel.spec.ts +++ b/packages/backend/test/panels/YeomanUIPanel.spec.ts @@ -231,7 +231,7 @@ describe("YeomanUIPanel unit test", () => { it("showOpenDialog - empty path provided, ws folder exists", async () => { const canSelectFiles = true; - const objWs = [{ uri: { fsPath: "rootFolderPath" } }]; + const objWs = [{ uri: { fsPath: "rootFolderPath", scheme: "file" } }]; sandbox.stub(vscode.workspace, "workspaceFolders").value(objWs); windowMock .expects("showOpenDialog") diff --git a/packages/backend/test/utils/workspaceFolders.spec.ts b/packages/backend/test/utils/workspaceFolders.spec.ts new file mode 100644 index 000000000..29eebb18f --- /dev/null +++ b/packages/backend/test/utils/workspaceFolders.spec.ts @@ -0,0 +1,329 @@ +import { createSandbox, SinonSandbox, SinonMock } from "sinon"; +import { expect } from "chai"; +import { vscode } from "../mockUtil"; +import { + getWorkspaceFolders, + getFileSchemeWorkspaceFolders, + getFirstWorkspacePath, +} from "../../src/utils/workspaceFolders"; +import { Uri, WorkspaceFolder } from "vscode"; + +describe("workspaceFolders utility tests", () => { + let sandbox: SinonSandbox; + let workspaceMock: SinonMock; + + before(() => { + sandbox = createSandbox(); + }); + + afterEach(() => { + sandbox.restore(); + }); + + beforeEach(() => { + workspaceMock = sandbox.mock(vscode.workspace); + }); + + afterEach(() => { + workspaceMock.verify(); + }); + + describe("getWorkspaceFolders", () => { + it("returns empty array when workspaceFolders is undefined", () => { + sandbox.stub(vscode.workspace, "workspaceFolders").value(undefined); + const result = getWorkspaceFolders(); + expect(result).to.be.an("array").that.is.empty; + }); + + it("returns empty array when workspaceFolders is null", () => { + sandbox.stub(vscode.workspace, "workspaceFolders").value(null); + const result = getWorkspaceFolders(); + expect(result).to.be.an("array").that.is.empty; + }); + + it("returns empty array when workspaceFolders is empty", () => { + sandbox.stub(vscode.workspace, "workspaceFolders").value([]); + const result = getWorkspaceFolders(); + expect(result).to.be.an("array").that.is.empty; + }); + + it("returns all paths when all folders have file scheme", () => { + const mockFolders: WorkspaceFolder[] = [ + { + uri: Uri.file("/path/to/workspace1"), + name: "workspace1", + index: 0, + }, + { + uri: Uri.file("/path/to/workspace2"), + name: "workspace2", + index: 1, + }, + ]; + sandbox.stub(vscode.workspace, "workspaceFolders").value(mockFolders); + + const result = getWorkspaceFolders(); + expect(result).to.deep.equal(["/path/to/workspace1", "/path/to/workspace2"]); + }); + + it("filters out non-file scheme folders (vscode-remote)", () => { + const mockFolders: WorkspaceFolder[] = [ + { + uri: Uri.file("/local/path"), + name: "local", + index: 0, + }, + { + uri: Uri.parse("vscode-remote://ssh-remote/remote/path"), + name: "remote", + index: 1, + }, + ]; + sandbox.stub(vscode.workspace, "workspaceFolders").value(mockFolders); + + const result = getWorkspaceFolders(); + expect(result).to.deep.equal(["/local/path"]); + }); + + it("filters out multiple virtual schemes (ssh, wsl, vscode-vfs)", () => { + const mockFolders: WorkspaceFolder[] = [ + { + uri: Uri.file("/local/path1"), + name: "local1", + index: 0, + }, + { + uri: Uri.parse("ssh://remote/path"), + name: "ssh", + index: 1, + }, + { + uri: Uri.file("/local/path2"), + name: "local2", + index: 2, + }, + { + uri: Uri.parse("wsl://ubuntu/home/user"), + name: "wsl", + index: 3, + }, + { + uri: Uri.parse("vscode-vfs://github/repo"), + name: "vfs", + index: 4, + }, + ]; + sandbox.stub(vscode.workspace, "workspaceFolders").value(mockFolders); + + const result = getWorkspaceFolders(); + expect(result).to.deep.equal(["/local/path1", "/local/path2"]); + }); + + it("returns empty array when only virtual workspaces exist", () => { + const mockFolders: WorkspaceFolder[] = [ + { + uri: Uri.parse("vscode-remote://ssh-remote/remote/path"), + name: "remote1", + index: 0, + }, + { + uri: Uri.parse("ssh://host/path"), + name: "remote2", + index: 1, + }, + ]; + sandbox.stub(vscode.workspace, "workspaceFolders").value(mockFolders); + + const result = getWorkspaceFolders(); + expect(result).to.be.an("array").that.is.empty; + }); + + it("handles workspace folders with null/undefined properties", () => { + const mockFolders: any[] = [ + { + uri: Uri.file("/valid/path"), + name: "valid", + index: 0, + }, + null, + { + uri: null, + name: "null-uri", + index: 2, + }, + { + uri: Uri.file("/another/valid/path"), + name: "valid2", + index: 3, + }, + ]; + sandbox.stub(vscode.workspace, "workspaceFolders").value(mockFolders); + + const result = getWorkspaceFolders(); + expect(result).to.deep.equal(["/valid/path", "/another/valid/path"]); + }); + }); + + describe("getFileSchemeWorkspaceFolders", () => { + it("returns empty array when workspaceFolders is undefined", () => { + sandbox.stub(vscode.workspace, "workspaceFolders").value(undefined); + const result = getFileSchemeWorkspaceFolders(); + expect(result).to.be.an("array").that.is.empty; + }); + + it("returns empty array when workspaceFolders is null", () => { + sandbox.stub(vscode.workspace, "workspaceFolders").value(null); + const result = getFileSchemeWorkspaceFolders(); + expect(result).to.be.an("array").that.is.empty; + }); + + it("returns WorkspaceFolder objects for file scheme folders", () => { + const mockFolders: WorkspaceFolder[] = [ + { + uri: Uri.file("/path/to/workspace1"), + name: "workspace1", + index: 0, + }, + { + uri: Uri.parse("vscode-remote://ssh-remote/remote/path"), + name: "remote", + index: 1, + }, + { + uri: Uri.file("/path/to/workspace2"), + name: "workspace2", + index: 2, + }, + ]; + sandbox.stub(vscode.workspace, "workspaceFolders").value(mockFolders); + + const result = getFileSchemeWorkspaceFolders(); + expect(result).to.have.lengthOf(2); + expect(result[0].name).to.equal("workspace1"); + expect(result[0].uri.scheme).to.equal("file"); + expect(result[1].name).to.equal("workspace2"); + expect(result[1].uri.scheme).to.equal("file"); + }); + + it("returns empty array when only virtual workspaces exist", () => { + const mockFolders: WorkspaceFolder[] = [ + { + uri: Uri.parse("vscode-remote://ssh-remote/remote/path"), + name: "remote", + index: 0, + }, + ]; + sandbox.stub(vscode.workspace, "workspaceFolders").value(mockFolders); + + const result = getFileSchemeWorkspaceFolders(); + expect(result).to.be.an("array").that.is.empty; + }); + + it("handles workspace folders with null/undefined properties", () => { + const mockFolders: any[] = [ + { + uri: Uri.file("/valid/path"), + name: "valid", + index: 0, + }, + null, + { + uri: null, + name: "null-uri", + index: 2, + }, + { + uri: Uri.file("/another/valid/path"), + name: "valid2", + index: 3, + }, + ]; + sandbox.stub(vscode.workspace, "workspaceFolders").value(mockFolders); + + const result = getFileSchemeWorkspaceFolders(); + expect(result).to.have.lengthOf(2); + expect(result[0].uri.fsPath).to.equal("/valid/path"); + expect(result[1].uri.fsPath).to.equal("/another/valid/path"); + }); + }); + + describe("getFirstWorkspacePath", () => { + it("returns first file-scheme path when available", () => { + const mockFolders: WorkspaceFolder[] = [ + { + uri: Uri.file("/first/path"), + name: "first", + index: 0, + }, + { + uri: Uri.file("/second/path"), + name: "second", + index: 1, + }, + ]; + sandbox.stub(vscode.workspace, "workspaceFolders").value(mockFolders); + + const result = getFirstWorkspacePath("/fallback/path"); + expect(result).to.equal("/first/path"); + }); + + it("returns fallback when no workspaces exist", () => { + sandbox.stub(vscode.workspace, "workspaceFolders").value(undefined); + + const result = getFirstWorkspacePath("/fallback/path"); + expect(result).to.equal("/fallback/path"); + }); + + it("returns fallback when workspaceFolders is empty", () => { + sandbox.stub(vscode.workspace, "workspaceFolders").value([]); + + const result = getFirstWorkspacePath("/fallback/path"); + expect(result).to.equal("/fallback/path"); + }); + + it("returns fallback when only virtual workspaces exist", () => { + const mockFolders: WorkspaceFolder[] = [ + { + uri: Uri.parse("vscode-remote://ssh-remote/remote/path"), + name: "remote", + index: 0, + }, + { + uri: Uri.parse("ssh://host/path"), + name: "ssh", + index: 1, + }, + ]; + sandbox.stub(vscode.workspace, "workspaceFolders").value(mockFolders); + + const result = getFirstWorkspacePath("/fallback/path"); + expect(result).to.equal("/fallback/path"); + }); + + it("skips virtual workspaces and returns first file-scheme path", () => { + const mockFolders: WorkspaceFolder[] = [ + { + uri: Uri.parse("vscode-remote://ssh-remote/remote/path"), + name: "remote", + index: 0, + }, + { + uri: Uri.file("/local/path"), + name: "local", + index: 1, + }, + ]; + sandbox.stub(vscode.workspace, "workspaceFolders").value(mockFolders); + + const result = getFirstWorkspacePath("/fallback/path"); + expect(result).to.equal("/local/path"); + }); + + it("works with empty string fallback", () => { + sandbox.stub(vscode.workspace, "workspaceFolders").value(undefined); + + const result = getFirstWorkspacePath(""); + expect(result).to.equal(""); + }); + }); +}); diff --git a/packages/backend/test/vscode-youi-events.spec.ts b/packages/backend/test/vscode-youi-events.spec.ts index 9891a1abf..05c3ebbae 100644 --- a/packages/backend/test/vscode-youi-events.spec.ts +++ b/packages/backend/test/vscode-youi-events.spec.ts @@ -307,7 +307,10 @@ describe("vscode-youi-events unit test", () => { eventsMock.expects("doClose"); sandbox .stub(vscode.workspace, "workspaceFolders") - .value([{ uri: { fsPath: "rootFolderPath" } }, { uri: { fsPath: "testRoot" } }]); + .value([ + { uri: { fsPath: "rootFolderPath", scheme: "file" } }, + { uri: { fsPath: "testRoot", scheme: "file" } }, + ]); sandbox.stub(vscode.workspace, "workspaceFile").value("/workspace/file/path"); windowMock .expects("showInformationMessage") @@ -321,7 +324,10 @@ describe("vscode-youi-events unit test", () => { eventsMock.expects("doClose"); sandbox .stub(vscode.workspace, "workspaceFolders") - .value([{ uri: { fsPath: "rootFolderPath" } }, { uri: { fsPath: "testDestinationRoot" } }]); + .value([ + { uri: { fsPath: "rootFolderPath", scheme: "file" } }, + { uri: { fsPath: "testDestinationRoot", scheme: "file" } }, + ]); sandbox.stub(vscode.workspace, "workspaceFile").value("/workspace/file/path"); windowMock .expects("showInformationMessage") @@ -335,7 +341,10 @@ describe("vscode-youi-events unit test", () => { eventsMock.expects("doClose"); sandbox .stub(vscode.workspace, "workspaceFolders") - .value([{ uri: { fsPath: "rootFolderPath" } }, { uri: { fsPath: "testDestinationRoot" } }]); + .value([ + { uri: { fsPath: "rootFolderPath", scheme: "file" } }, + { uri: { fsPath: "testDestinationRoot", scheme: "file" } }, + ]); windowMock .expects("showInformationMessage") .withExactArgs(messages.default.artifact_generated_project_saved_for_future) @@ -353,7 +362,10 @@ describe("vscode-youi-events unit test", () => { eventsMock.expects("doClose"); sandbox .stub(vscode.workspace, "workspaceFolders") - .value([{ uri: { fsPath: "rootFolderPath" } }, { uri: { fsPath: "testDestinationRoot" } }]); + .value([ + { uri: { fsPath: "rootFolderPath", scheme: "file" } }, + { uri: { fsPath: "testDestinationRoot", scheme: "file" } }, + ]); windowMock .expects("showInformationMessage") .withExactArgs(messages.default.artifact_generated_project_open_in_a_new_workspace) @@ -460,7 +472,10 @@ describe("vscode-youi-events unit test", () => { eventsMock.expects("doClose"); sandbox .stub(vscode.workspace, "workspaceFolders") - .value([{ uri: { fsPath: "rootFolderPath" } }, { uri: { fsPath: "testDestinationRoot" } }]); + .value([ + { uri: { fsPath: "rootFolderPath", scheme: "file" } }, + { uri: { fsPath: "testDestinationRoot", scheme: "file" } }, + ]); windowMock.expects("showInformationMessage").withExactArgs(messages.default.artifact_generated_module).resolves(); return events.doGeneratorDone( true, @@ -476,8 +491,8 @@ describe("vscode-youi-events unit test", () => { sandbox .stub(vscode.workspace, "workspaceFolders") .value([ - { uri: { fsPath: "rootFolderPath" } }, - { uri: { fsPath: "testDestinationRoot/../testDestinationRoot" } }, + { uri: { fsPath: "rootFolderPath", scheme: "file" } }, + { uri: { fsPath: "testDestinationRoot/../testDestinationRoot", scheme: "file" } }, ]); windowMock.expects("showInformationMessage").withExactArgs(messages.default.artifact_generated_files).resolves(); return events.doGeneratorDone( @@ -491,7 +506,7 @@ describe("vscode-youi-events unit test", () => { it("on success with null targetFolderPath", () => { eventsMock.expects("doClose"); - sandbox.stub(vscode.workspace, "workspaceFolders").value([{ uri: { fsPath: "rootFolderPath" } }]); + sandbox.stub(vscode.workspace, "workspaceFolders").value([{ uri: { fsPath: "rootFolderPath", scheme: "file" } }]); windowMock.expects("showInformationMessage").withExactArgs(messages.default.artifact_generated_files).resolves(); return events.doGeneratorDone(true, "success message", createAndClose, "files", null); }); @@ -505,21 +520,29 @@ describe("vscode-youi-events unit test", () => { describe("getUniqueProjectName", () => { it("should return baseName if it does not exist in workspace", () => { - sandbox.stub(vscode.workspace, "workspaceFolders").value([{ name: "Project1" }, { name: "Project2" }]); + sandbox.stub(vscode.workspace, "workspaceFolders").value([ + { name: "Project1", uri: { scheme: "file" } }, + { name: "Project2", uri: { scheme: "file" } }, + ]); const result = events["getUniqueProjectName"]("NewProject"); expect(result).to.equal("NewProject"); }); it("should return baseName(1) if baseName already exists", () => { - sandbox.stub(vscode.workspace, "workspaceFolders").value([{ name: "Project1" }, { name: "NewProject" }]); + sandbox.stub(vscode.workspace, "workspaceFolders").value([ + { name: "Project1", uri: { scheme: "file" } }, + { name: "NewProject", uri: { scheme: "file" } }, + ]); const result = events["getUniqueProjectName"]("NewProject"); expect(result).to.equal("NewProject(1)"); }); it("should return baseName with incremented counter if multiple exist", () => { - sandbox - .stub(vscode.workspace, "workspaceFolders") - .value([{ name: "NewProject" }, { name: "NewProject(1)" }, { name: "NewProject(2)" }]); + sandbox.stub(vscode.workspace, "workspaceFolders").value([ + { name: "NewProject", uri: { scheme: "file" } }, + { name: "NewProject(1)", uri: { scheme: "file" } }, + { name: "NewProject(2)", uri: { scheme: "file" } }, + ]); const result = events["getUniqueProjectName"]("NewProject"); expect(result).to.equal("NewProject(3)"); }); diff --git a/packages/backend/test/yeomanui.spec.ts b/packages/backend/test/yeomanui.spec.ts index 236fb7e59..20c2febb3 100644 --- a/packages/backend/test/yeomanui.spec.ts +++ b/packages/backend/test/yeomanui.spec.ts @@ -952,6 +952,7 @@ describe("yeomanui unit test", () => { Constants.IS_IN_BAS = false; const openedVscodeFolderPath = "/home/user/folder/folder2"; _.set(vscode, "workspace.workspaceFolders[0].uri.fsPath", openedVscodeFolderPath); + _.set(vscode, "workspace.workspaceFolders[0].uri.scheme", "file"); wsConfigMock.expects("get").withExactArgs(yeomanUiInstance["TARGET_FOLDER_CONFIG_PROP"]); const res = yeomanUiInstance["getCwd"](); expect(res).equal(openedVscodeFolderPath); diff --git a/yarn.lock b/yarn.lock index 560abff3c..f4e0c088b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14946,6 +14946,11 @@ vite@4.5.11: optionalDependencies: fsevents "~2.3.2" +vscode-uri@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.1.0.tgz#dd09ec5a66a38b5c3fffc774015713496d14e09c" + integrity sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ== + vue-component-type-helpers@1.8.4: version "1.8.4" resolved "https://registry.yarnpkg.com/vue-component-type-helpers/-/vue-component-type-helpers-1.8.4.tgz#302d85fac912519cdf0dd2fb51402e5215d85628"