in src/downloadAzureProject/setupProjectFolder.ts [21:85]
export async function setupProjectFolder(uri: vscode.Uri, vsCodeFilePathUri: vscode.Uri, context: IActionContext): Promise<void> {
const parsedQuery: querystring.ParsedUrlQuery = querystring.parse(uri.query);
const resourceId: string = getRequiredQueryParameter(parsedQuery, 'resourceId');
const devContainerName: string = getRequiredQueryParameter(parsedQuery, 'devcontainer');
const language: string = getRequiredQueryParameter(parsedQuery, 'language');
const toBeDeletedFolderPathUri: vscode.Uri = vscode.Uri.joinPath(vsCodeFilePathUri, 'temp');
try {
const functionAppName: string = getNameFromId(resourceId);
const downloadFilePath: string = vscode.Uri.joinPath(toBeDeletedFolderPathUri, `${functionAppName}.zip`).fsPath;
await vscode.window.withProgress({ location: vscode.ProgressLocation.Notification, title: localize('settingUpFunctionAppLocalProjInfoMessage', `Setting up project for function app '${functionAppName}' with language '${language}'.`) }, async () => {
// NOTE: We don't want to download app content for compiled languages.
const slotTreeItem: SlotTreeItemBase | undefined = await ext.tree.findTreeItem(resourceId, { ...context, loadAll: true });
if (!slotTreeItem) {
throw new Error(localize('failedToFindApp', 'Failed to find function app with id "{0}"', resourceId));
}
const client = await slotTreeItem.site.createClient(context);
const hostKeys: WebSiteManagementModels.HostKeys | undefined = await client.listHostKeys();
const defaultHostName: string | undefined = slotTreeItem.site.defaultHostName;
if (!!hostKeys && hostKeys.masterKey && defaultHostName) {
const requestOptions: RequestPrepareOptions = {
method: 'GET',
url: `https://${defaultHostName}/admin/functions/download?includeCsproj=true&includeAppSettings=true`,
headers: { 'x-functions-key': hostKeys.masterKey }
};
await requestUtils.downloadFile(context, requestOptions, downloadFilePath);
} else {
throw new Error(localize('hostInformationNotFound', 'Failed to get host information for the functionApp.'));
}
const projectFilePathUri: vscode.Uri = vscode.Uri.joinPath(vsCodeFilePathUri, `${functionAppName}`);
const projectFilePath: string = projectFilePathUri.fsPath;
const devContainerFolderPathUri: vscode.Uri = vscode.Uri.joinPath(projectFilePathUri, '.devcontainer');
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
await extract(downloadFilePath, { dir: projectFilePath });
await requestUtils.downloadFile(
context,
`https://raw.githubusercontent.com/microsoft/vscode-dev-containers/master/containers/${devContainerName}/.devcontainer/devcontainer.json`,
vscode.Uri.joinPath(devContainerFolderPathUri, 'devcontainer.json').fsPath
);
await requestUtils.downloadFile(
context,
`https://raw.githubusercontent.com/microsoft/vscode-dev-containers/master/containers/${devContainerName}/.devcontainer/Dockerfile`,
vscode.Uri.joinPath(devContainerFolderPathUri, 'Dockerfile').fsPath
);
await initProjectForVSCode(context, projectFilePath, getProjectLanguageForLanguage(language));
await vscode.window.showInformationMessage(localize('restartingVsCodeInfoMessage', 'Restarting VS Code with your function app project'));
await vscode.commands.executeCommand('vscode.openFolder', vscode.Uri.file(projectFilePath), true);
});
} catch (err) {
throw new Error(localize('failedLocalProjSetupErrorMessage', 'Failed to set up your local project: "{0}".', parseError(err).message));
} finally {
await vscode.workspace.fs.delete(
vscode.Uri.file(toBeDeletedFolderPathUri.fsPath),
{
recursive: true,
useTrash: true
}
);
}
}