mirror of https://github.com/alibaba/ice.git
				
				
				
			
		
			
				
	
	
		
			110 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
/**
 | 
						|
 * Scripts to check unpublished version and run publish
 | 
						|
 */
 | 
						|
import path from 'path';
 | 
						|
import { spawnSync } from 'child_process';
 | 
						|
import fse from 'fs-extra';
 | 
						|
import { setPublishedPackages } from './publishedInfo';
 | 
						|
import { getPackageInfos, getVersionPrefix } from './getPackageInfos';
 | 
						|
import type { IPackageInfo } from './getPackageInfos';
 | 
						|
 | 
						|
const PUBLISH_TYPE = process.env.PUBLISH_TYPE || 'beta';
 | 
						|
const VERSION_PREFIX = process.env.VERSION_PREFIX || PUBLISH_TYPE;
 | 
						|
const DIST_TAG_REG = new RegExp(`([^-]+)-${VERSION_PREFIX}\\.(\\d+)`);
 | 
						|
 | 
						|
interface ITagPackageInfo extends IPackageInfo {
 | 
						|
  distTagVersion: string;
 | 
						|
}
 | 
						|
 | 
						|
const publishTag = process.env.PUBLISH_TAG || '';
 | 
						|
function getVersionInfo(packageInfo: IPackageInfo, tag: string): ITagPackageInfo {
 | 
						|
  const { name, localVersion } = packageInfo;
 | 
						|
 | 
						|
  let version = localVersion;
 | 
						|
 | 
						|
  if (!DIST_TAG_REG.test(localVersion)) {
 | 
						|
    let distTagVersion = 1;
 | 
						|
    const childProcess = spawnSync('npm', [
 | 
						|
      'show', name, 'dist-tags',
 | 
						|
      '--json',
 | 
						|
    ], {
 | 
						|
      encoding: 'utf-8',
 | 
						|
    });
 | 
						|
 | 
						|
    let distTags = {};
 | 
						|
    try {
 | 
						|
      distTags = JSON.parse(childProcess.stdout) || {};
 | 
						|
    // eslint-disable-next-line no-empty
 | 
						|
    } catch (err) {}
 | 
						|
    const matched = (distTags[tag] || '').match(DIST_TAG_REG);
 | 
						|
 | 
						|
    // 1.0.0-beta.1 -> ["1.0.0-beta.1", "1.0.0", "1"] -> 1.0.0-beta.2
 | 
						|
    if (matched && matched[1] === localVersion && matched[2]) {
 | 
						|
      distTagVersion = Number(matched[2]) + 1;
 | 
						|
    }
 | 
						|
    version += `-${VERSION_PREFIX}.${distTagVersion}`;
 | 
						|
  }
 | 
						|
 | 
						|
  return Object.assign({}, packageInfo, { distTagVersion: version });
 | 
						|
}
 | 
						|
 | 
						|
function updatePackageJson(packageInfos: ITagPackageInfo[]): void {
 | 
						|
  packageInfos.forEach((packageInfo: ITagPackageInfo) => {
 | 
						|
    const { directory, distTagVersion } = packageInfo;
 | 
						|
 | 
						|
    const packageFile = path.join(directory, 'package.json');
 | 
						|
    const packageData = fse.readJsonSync(packageFile);
 | 
						|
 | 
						|
    packageData.version = distTagVersion;
 | 
						|
 | 
						|
    for (let i = 0; i < packageInfos.length; i++) {
 | 
						|
      const dependenceName = packageInfos[i].name;
 | 
						|
      const dependenceVersion = packageInfos[i].distTagVersion;
 | 
						|
 | 
						|
      if (packageData.dependencies && packageData.dependencies[dependenceName]) {
 | 
						|
        packageData.dependencies[dependenceName] = `${getVersionPrefix(packageData.dependencies[dependenceName])}${dependenceVersion}`;
 | 
						|
      } else if (packageData.devDependencies && packageData.devDependencies[dependenceName]) {
 | 
						|
        packageData.devDependencies[dependenceName] = `${getVersionPrefix(packageData.devDependencies[dependenceName])}${dependenceVersion}`;
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    fse.writeFileSync(packageFile, JSON.stringify(packageData, null, 2));
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
function publish(pkg: string, distTagVersion: string, directory: string, tag: string): void {
 | 
						|
  console.log(`[PUBLISH ${tag.toUpperCase()}]`, `${pkg}@${distTagVersion}`);
 | 
						|
  spawnSync('npm', [
 | 
						|
    'publish',
 | 
						|
    `--tag=${tag}`,
 | 
						|
  ], {
 | 
						|
    stdio: 'inherit',
 | 
						|
    cwd: directory,
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
// Entry
 | 
						|
console.log(`[PUBLISH ${PUBLISH_TYPE.toUpperCase()}] Start:`);
 | 
						|
getPackageInfos(publishTag).then((packageInfos: IPackageInfo[]) => {
 | 
						|
  const shouldPublishPackages = packageInfos
 | 
						|
    .filter(packageInfo => packageInfo.shouldPublish)
 | 
						|
    .map(packageInfo => getVersionInfo(packageInfo, PUBLISH_TYPE));
 | 
						|
 | 
						|
  updatePackageJson(shouldPublishPackages);
 | 
						|
 | 
						|
  // Publish
 | 
						|
  let publishedCount = 0;
 | 
						|
  const publishedPackages = [];
 | 
						|
  shouldPublishPackages.forEach((packageInfo) => {
 | 
						|
    const { name, directory, distTagVersion } = packageInfo;
 | 
						|
    publishedCount++;
 | 
						|
    console.log(`--- ${name}@${distTagVersion} ---`);
 | 
						|
    publish(name, distTagVersion, directory, PUBLISH_TYPE);
 | 
						|
    publishedPackages.push(`${name}:${distTagVersion}`);
 | 
						|
  });
 | 
						|
 | 
						|
  console.log(`[PUBLISH PACKAGE ${PUBLISH_TYPE.toUpperCase()}] Complete (count=${publishedCount}):`);
 | 
						|
  console.log(`${publishedPackages.join('\n')}`);
 | 
						|
  setPublishedPackages(publishedPackages);
 | 
						|
});
 |