diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ddb4feca9c..5484a42cfb7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,2 +1,3 @@ - Increased extension instance create poll timeout to 1h to match backend (#5969). - Refactored `ext:install` to use the latest extension metadata. (#5997) +- Normalized extension root path before usage in `ext:dev:upload`. (#6054) diff --git a/src/extensions/extensionsHelper.ts b/src/extensions/extensionsHelper.ts index b61073423f5..a5025142fe7 100644 --- a/src/extensions/extensionsHelper.ts +++ b/src/extensions/extensionsHelper.ts @@ -408,24 +408,17 @@ export async function promptForValidRepoURI(): Promise { } /** - * Prompts for a valid extension root. + * Prompts for an extension root. * * @param defaultRoot the default extension root */ -export async function promptForValidExtensionRoot(defaultRoot: string): Promise { - let rootIsValid = false; - let extensionRoot = ""; - while (!rootIsValid) { - extensionRoot = await promptOnce({ - type: "input", - message: - "Enter this extension's root directory in the repo (defaults to previous root if set):", - default: defaultRoot, - }); - // TODO: Add real directory path validation. - rootIsValid = true; - } - return extensionRoot; +export async function promptForExtensionRoot(defaultRoot: string): Promise { + return await promptOnce({ + type: "input", + message: + "Enter this extension's root directory in the repo (defaults to previous root if set):", + default: defaultRoot, + }); } /** @@ -817,11 +810,17 @@ export async function uploadExtensionVersionFromGitHubSource(args: { if (!extensionRoot) { const defaultRoot = "/"; if (!args.nonInteractive) { - extensionRoot = await promptForValidExtensionRoot(defaultRoot); + extensionRoot = await promptForExtensionRoot(defaultRoot); } else { extensionRoot = defaultRoot; } } + // Normalize root path and strip leading and trailing slashes and all `../`. + const normalizedRoot = path + .normalize(extensionRoot) + .replaceAll(/^\/|\/$/g, "") + .replaceAll(/^(\.\.\/)*/g, ""); + extensionRoot = normalizedRoot || "/"; // Prompt for source ref and default to HEAD. let sourceRef = args.sourceRef; diff --git a/src/extensions/publisherApi.ts b/src/extensions/publisherApi.ts index 877ccac7198..b1caa6f177f 100644 --- a/src/extensions/publisherApi.ts +++ b/src/extensions/publisherApi.ts @@ -205,7 +205,7 @@ export async function createExtensionVersionFromGitHubSource(args: { ExtensionVersion >(`/${refs.toExtensionName(ref)}/versions:createFromSource`, { versionId: ref.version, - extensionRoot: args.extensionRoot ?? "/", + extensionRoot: args.extensionRoot || "/", githubRepositorySource: { uri: args.repoUri, sourceRef: args.sourceRef,