import { logger } from '@umijs/utils';import { existsSync } from 'fs';import getGitRepoInfo from 'git-repo-info';import { join } from 'path';import rimraf from 'rimraf';import 'zx/globals';import { PATHS } from './.internal/constants';import { assert, eachPkg, getPkgs } from './.internal/utils';
(async () => { const { branch } = getGitRepoInfo(); logger.info(`branch: ${branch}`); const pkgs = getPkgs(); logger.info(`pkgs: ${pkgs.join(', ')}`);
logger.event('check git status'); const isGitClean = (await $`git status --porcelain`).stdout.trim().length; assert(!isGitClean, 'git status is not clean');
logger.event('check git remote update'); await $`git fetch`; const gitStatus = (await $`git status --short --branch`).stdout.trim(); assert(!gitStatus.includes('behind'), `git status is behind remote`);
logger.event('check npm registry'); const registry = (await $`npm config get registry`).stdout.trim(); assert( registry === 'https://registry.npmjs.org/', 'npm registry is not https://registry.npmjs.org/', );
logger.event('check npm ownership'); const whoami = (await $`npm whoami`).stdout.trim(); await Promise.all( ['alita'].map(async (pkg) => { const owners = (await $`npm owner ls ${pkg}`).stdout .trim() .split('\n') .map((line) => { return line.split(' ')[0]; }); assert(owners.includes(whoami), `${pkg} is not owned by ${whoami}`); }), );
logger.event('clean'); eachPkg(pkgs, ({ dir, name }) => { logger.info(`clean dist of ${name}`); rimraf.sync(join(dir, 'dist')); });
logger.event('build packages'); await $`npm run build:release`; await $`npm run build:extra`; await $`npm run build:client`;
logger.event('check client code change'); const isGitCleanAfterClientBuild = ( await $`git status --porcelain` ).stdout.trim().length; assert(!isGitCleanAfterClientBuild, 'client code is updated');
const version = require('../packages/alita/package.json').version; let tag = 'latest'; if ( version.includes('-alpha.') || version.includes('-beta.') || version.includes('-rc.') ) { tag = 'next'; } if (version.includes('-canary.')) tag = 'canary';
logger.event('update example versions'); const examplesDir = PATHS.EXAMPLES; const examples = fs.readdirSync(examplesDir).filter((dir) => { return ( !dir.startsWith('.') && existsSync(join(examplesDir, dir, 'package.json')) ); }); examples.forEach((example) => { const pkg = require(join(examplesDir, example, 'package.json')); pkg.scripts ||= {}; pkg.scripts['start'] = 'npm run dev'; setDepsVersion({ pkg, version, deps: ['alita'], }); delete pkg.version; fs.writeFileSync( join(examplesDir, example, 'package.json'), `${JSON.stringify(pkg, null, 2)}\n`, ); });
logger.event('update pnpm lockfile'); $.verbose = false; await $`pnpm i`; $.verbose = true;
logger.event('commit'); await $`git commit --all --message "release: ${version}"`;
if (tag !== 'canary') { logger.event('git tag'); await $`git tag v${version}`; }
logger.event('git push'); await $`git push origin ${branch} --tags`;
logger.event('pnpm publish'); $.verbose = false; const innerPkgs = pkgs.filter((pkg) => !['alita'].includes(pkg));
let otpArg: string[] = []; if ( (await $`npm profile get "two-factor auth"`).toString().includes('writes') ) { let code = ''; do { code = await question('This operation requires a one-time password: '); otpArg = ['--otp', code]; } while (code.length !== 6); }
await Promise.all( innerPkgs.map(async (pkg) => { await $`cd packages/${pkg} && npm publish --tag ${tag} ${otpArg}`; logger.info(`+ ${pkg}`); }), ); await $`cd packages/alita && npm publish --tag ${tag} ${otpArg}`; logger.info(`+ alita`);
$.verbose = true;
})();
function setDepsVersion(opts: { deps: string[]; pkg: Record<string, any>; version: string;}) { const { deps, pkg, version } = opts; pkg.dependencies ||= {}; deps.forEach((dep) => { if (pkg?.dependencies?.[dep]) { pkg.dependencies[dep] = version; } if (pkg?.devDependencies?.[dep]) { pkg.devDependencies[dep] = version; } }); return pkg;}