async function packageVsix()

in gulpfile.ts [270:362]


async function packageVsix(): Promise<void> {
    // We use a staging folder so we have more control over exactly what goes into the .vsix
    function copyToStagingFolder(relativeOrAbsSource: string, relativeDest: string): void {
        const absSource = path.resolve(__dirname, relativeOrAbsSource);
        const absDest = path.join(stagingFolder, relativeDest);

        if (fse.statSync(absSource).isDirectory()) {
            console.log(`Copying folder ${absSource} to staging folder`);
            copyFolder(absSource, absDest);
        } else {
            console.log(`Copying file ${absSource} to staging folder`);
            fse.copyFileSync(absSource, absDest);
        }
    }

    let stagingFolder = getTempFilePath('staging', '');
    console.log(`Staging folder: ${stagingFolder}`);
    fse.mkdirpSync(stagingFolder);

    // Copy files/folders to staging
    for (let p of filesAndFoldersToPackage) {
        copyToStagingFolder(p, p);
    }
    let filesInStaging = fse.readdirSync(stagingFolder);
    filesInStaging.forEach(fn => assert(!/license/i.test(fn), `Should not have copied the original license file into staging: ${fn}`));

    let expectedLicenseFileName: string;
    if (languageServerAvailable) {
        let languageServerSourcePath: string;
        let licenseSourcePath: string;

        if (languageServerPackagingPath) {
            console.warn(`========== WARNING ==========: Packaging language server from local path instead of NuGet location`);
            languageServerSourcePath = languageServerPackagingPath;
            licenseSourcePath = path.join(languageServerPackagingPath, '../../../../..', languageServerLicenseFileName);
        } else {
            languageServerSourcePath = path.join(__dirname, languageServerFolderName);
            licenseSourcePath = path.join(__dirname, languageServerFolderName, languageServerLicenseFileName);
        }
        console.warn(`  Language server source path: ${languageServerSourcePath}`);
        console.warn(`  License source path: ${licenseSourcePath}`);

        // Copy language server bits
        copyToStagingFolder(languageServerSourcePath, languageServerFolderName);

        // Copy license to staging main folder
        copyToStagingFolder(licenseSourcePath, languageServerLicenseFileName);
        expectedLicenseFileName = languageServerLicenseFileName;
    } else {
        // No language server available - jusy copy license.md to staging main folder
        copyToStagingFolder(publicLicenseFileName, languageServerFolderName);
        expectedLicenseFileName = publicLicenseFileName;
    }

    // Copy package.json to staging
    let packageContents = fse.readJsonSync(path.join(__dirname, 'package.json'));
    assert(packageContents.license, "package.json doesn't contain a license field?");
    // ... modify package.json to point to language server license
    packageContents.license = `SEE LICENSE IN ${expectedLicenseFileName}`;
    // ... remove vscode:prepublish script from package, since everything's already built
    delete packageContents.scripts['vscode:prepublish'];
    fse.writeFileSync(path.join(stagingFolder, 'package.json'), JSON.stringify(packageContents, null, 2));
    assert(fse.readFileSync(path.join(stagingFolder, 'package.json')).toString().includes(`"license": "SEE LICENSE IN ${expectedLicenseFileName}"`), "Language server license not correctly installed into staged package.json");

    try {
        console.log(`Running vsce package in staging folder ${stagingFolder}`);
        shelljs.cd(stagingFolder);
        executeInShell('vsce package --githubBranch main');
    } finally {
        shelljs.cd(__dirname);
    }

    // Copy vsix to current folder
    let vsixName = fse.readdirSync(stagingFolder).find(fn => /\.vsix$/.test(fn));
    if (!vsixName) {
        throw new Error("Couldn't find a .vsix file");
    }
    let vsixDestPath = path.join(__dirname, vsixName);
    if (!languageServerAvailable) {
        vsixDestPath = vsixDestPath.replace('.vsix', '-no-languageserver.vsix');
    }
    if (fse.existsSync(vsixDestPath)) {
        fse.unlinkSync(vsixDestPath);
    }
    fse.copyFileSync(path.join(stagingFolder, vsixName), vsixDestPath);

    // Remove staging folder since packaging was a success
    if (!preserveStagingFolder) {
        rimraf.sync(stagingFolder);
    }

    console.log(`Packaged successfully to ${vsixDestPath}`);
}