/* eslint-disable no-console */ import output from '@/output' import { getPluginProjectPackUpTasks } from '@/scripts' import { printManifest } from '@/scripts/build/manifest' import { createUpgradeMessage, getPluginConfigContent, updatePluginConfigContent, } from '@/scripts/shared' import type { PackupCLIOptionsSchema, BumpVersionMode } from '@ones-open/cli-utils' import { semverInc, BumpVersionOption, addFileToStage, commitMessage, semverValid, checkUnstaged, PROJECT_CONFIG_DIR_NAME, PLUGIN_CONFIG_FILE_NAME, } from '@ones-open/cli-utils' import { clone } from '@senojs/lodash' import enquirer from 'enquirer' import Listr from 'listr' import { join, sep } from 'path' import { cwd } from 'process' async function packup(fileName?: string, options: PackupCLIOptionsSchema = {}) { try { // 命令行获取的 `bump` 参数 const { bump: cliBumpMode, release: isReleaseVersion } = options const currentPluginConfig = await getPluginConfigContent() const currentVersion = currentPluginConfig?.service?.version let bumpMode = cliBumpMode let newVersion = currentVersion let versionBumpMessage = null const bumpModeChoices: BumpVersionMode[] = [ BumpVersionOption.NoModify, BumpVersionOption.Major, BumpVersionOption.Minor, BumpVersionOption.Patch, ] if (!semverValid(currentVersion)) { throw new Error( `The value '${currentVersion}' of 'service.version' is invalid. \nPlease check 'plugin.yaml'.`, ) } // error bump mode input if (cliBumpMode && !bumpModeChoices.includes(cliBumpMode)) { throw new Error('Invalid bump mode! Please check your params!') } // 命令没有传入bumpmode,则通过问答的方式获取 if (!cliBumpMode) { const { quireBumpMode } = await enquirer.prompt<{ quireBumpMode: BumpVersionMode }>({ type: 'select', name: 'quireBumpMode', message: 'Please select the version bump mode:', choices: bumpModeChoices, }) bumpMode = quireBumpMode } if (bumpMode && bumpMode !== BumpVersionOption.NoModify) { // 检查工作区是否干净 const unstaged = await checkUnstaged() if (unstaged) { throw new Error(`Cannot update version.You have unstaged changes:\n${unstaged}`) } const relativeYamlPath = `${sep}${PROJECT_CONFIG_DIR_NAME}${sep}${PLUGIN_CONFIG_FILE_NAME}` const pluginYamlPath = join(cwd(), relativeYamlPath) const clonePluginConfig = clone(currentPluginConfig) newVersion = semverInc(currentVersion, bumpMode) as string const message = `chore: plugin's version bump to ${newVersion}` if (clonePluginConfig?.service) { clonePluginConfig.service.version = newVersion } versionBumpMessage = `plugin's version has been update to ${newVersion}` await updatePluginConfigContent(clonePluginConfig) await addFileToStage(pluginYamlPath) await commitMessage(message) } const tasks = getPluginProjectPackUpTasks(fileName, isReleaseVersion) const packupTasks = new Listr(tasks) const { opkFileName, manifest, pluginConfig } = await packupTasks.run() if (!cliBumpMode) { printManifest(manifest.content, pluginConfig) } const upgradeMessage = await createUpgradeMessage() const succeedMessage = 'Packed up the project' + `\nPlease check the file \`${opkFileName}\` on current directory` output.newline() output.success(succeedMessage) versionBumpMessage && output.success(versionBumpMessage) upgradeMessage && output.warn(upgradeMessage) } catch (error) { output.error(error) } } export { packup }