public publish()

in app/exec/extension/_lib/publish.ts [340:402]


	public publish(): Promise<GalleryInterfaces.PublishedExtension> {
		const extPackage: GalleryInterfaces.ExtensionPackage = {	
			extensionManifest: fs.readFileSync(this.settings.vsixPath, "base64"),	
		};
		trace.debug("Publishing %s", this.settings.vsixPath);

		// Check if the app is already published. If so, call the update endpoint. Otherwise, create.
		trace.info("Checking if this extension is already published");

		return this.getExtInfo().then(extInfo => {
			const quitValidation = this.settings.noWaitValidation
				? "You passed --no-wait-validation, so TFX is exiting."
				: "You can choose to exit (Ctrl-C) if you don't want to wait.";
			const noWaitHelp = this.settings.noWaitValidation
				? ""
				: "If you don't want TFX to wait for validation, use the --no-wait-validation parameter. ";
			const extensionValidationTime = extInfo.isPublicExtension
				? "Based on the package size, this can take up to 20 mins."
				: "This should take only a few seconds, but in some cases may take a bit longer.";
			const validationMessage = `\n== Extension Validation In Progress ==\n${extensionValidationTime} ${quitValidation} To get the validation status, you may run the command below. ${noWaitHelp}This extension will be available after validation is successful.\n\n${colors.yellow(
				`tfx extension isvalid --publisher ${extInfo.publisher} --extension-id ${extInfo.id} --version ${
					extInfo.version
				} --service-url ${this.settings.galleryUrl} --token <your PAT>`,
			)}`;
			return this.createOrUpdateExtension(extPackage).then(ext => {
				if (this.settings.noWaitValidation) {
					trace.info(validationMessage);
					return ext;
				} else {
					trace.info(validationMessage);
					const versions = ext.versions;
					versions.sort((a, b) => b.lastUpdated.getTime() - a.lastUpdated.getTime());

					const validationInterval = extInfo.isPublicExtension
						? PackagePublisher.fullValidationInterval
						: PackagePublisher.fastValidationInterval;
					const validationRetries = extInfo.isPublicExtension
						? PackagePublisher.fullValidationRetries
						: PackagePublisher.fastValidationRetries;
					const hangTightMessageRetryCount = extInfo.isPublicExtension ? -1 : 25;

					return this.waitForValidation(
						1000,
						validationInterval,
						validationRetries,
						hangTightMessageRetryCount,
						extInfo.publisher,
						extInfo.id,
						versions[0].version,
					).then(result => {
						if (result === PackagePublisher.validated) {
							return ext;
						} else {
							throw new Error(
								"Extension validation failed. Please address the following issues and retry publishing.\n" +
									result,
							);
						}
					});
				}
			});
		});
	}