import { getProjectPath, readJsonFile, USER_HOME, printMsg, PackageJSON, writeJsonFile, RegistryJSON, NrcJSON, NpmJson, } from './common'; import { writeFileSync, existsSync } from 'fs'; import { red, cyan } from 'chalk'; import { spawn } from 'cross-spawn'; import { prompt } from 'inquirer'; const nrmName = 'nrm.json'; const nrmFile = getProjectPath(nrmName, USER_HOME); /** * 验证当前目录下是否已经存在指定文件,如果不存在则退出进行 */ export function isFileExist(): void { // 验证文件是否已经存在,不存在则推出进程 if (!existsSync(nrmFile)) { printMsg(red(`${nrmFile} 不存在, 请创建该文件!`)); process.exit(1); } } /** * 覆写 package.json 的 publishConfig 信息 * @param registry npm 源 */ export function changePublishConfig(registry: string): void { const packageJson = readJsonFile('./package.json'); packageJson.publishConfig = { registry, }; writeJsonFile('./package.json', packageJson); } /** * 覆写 .npmrc 文件 * @param registryInfo npm 源信息 */ export function overWriteNpmrc(registryInfo: string): void { const file = getProjectPath('.npmrc'); writeFileSync(file, registryInfo); } /** * 执行 npm publish */ export function publish(registry: string): void { printMsg(cyan(`${registry} 发布`)); spawn.sync('npm', ['publish'], { stdio: 'inherit' }); } /** * 修改 npm 源相关信息 * @param data */ export function changeRegistryInfo(data: RegistryJSON) { let registryInfo = ''; let registry = ''; Object.keys(data).forEach((key) => { if (key !== 'packageRegistry') { registryInfo += `${key}=${data[key]}\r\n`; } else { registry = data[key]; changePublishConfig(registry); } }); overWriteNpmrc(registryInfo); publish(registry); } /** * 选择 npm 镜像源 * @param auto 自动发布到所有 npm 镜像 * @returns Promise */ export async function selectRegistry(auto: boolean): Promise { const fileJson: NrcJSON = readJsonFile(nrmFile); if (auto) return fileJson; const keys = Object.keys(fileJson); const { registry } = await prompt([ { type: 'list', name: 'registry', message: 'What registry do you need?', choices: keys, }, ]); return fileJson[registry] as RegistryJSON; }