unbag
Version:
一个专门用来开发npm工具的包
118 lines • 5.24 kB
JavaScript
import { Command, Option } from "commander";
import { TransformCommand } from "../commands/transform/index.mjs";
import { parallel } from "../commands/parallel/index.mjs";
import { WaitCmdName, checkWaitFile } from "../commands/parallel/wait.mjs";
import { resolveUserConfig, mergeDefaultConfig, useDefaultConfig, mergeConfig, deepFreezeConfig } from "./config.mjs";
import { ReleaseCommand } from "../commands/release/index.mjs";
import { CommitCommand } from "../commands/commit/index.mjs";
import { AbsolutePath } from "./path.mjs";
import path from "node:path";
import { CommitLintCommand } from "./../commands/commit/lint.mjs";
import { resolveUserConfigFromCli } from "./../core/user-config.mjs";
class CustomCliCommand extends Command {
addOptions(options) {
for (const option of options) {
this.addOption(option);
}
return this;
}
}
const getCommonOptions = () => {
const options = [new Option("-c,--config <string>", "\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84"), new Option("-r,--root <string>", "\u6839\u8DEF\u5F84"), new Option("-l,--local <string>", "\u672C\u5730\u5316\u8BED\u8A00")];
return options;
};
const resolveCliUserConfig = async options => {
const {
config,
root,
overrides,
locale
} = options;
const defaultConfig = useDefaultConfig();
const absoluteRoot = new AbsolutePath({
content: path.resolve(root || defaultConfig.root)
});
const userConfig = await resolveUserConfig({
root: absoluteRoot,
filePath: config,
locale: locale || defaultConfig.locale
});
let mergedConfig = mergeDefaultConfig(userConfig);
mergedConfig = mergeConfig(mergedConfig, {
root: absoluteRoot.content
});
mergedConfig = mergeConfig(mergedConfig, {
...overrides
});
const freezedConfig = deepFreezeConfig(mergedConfig);
return freezedConfig;
};
const read = () => {
const program = new CustomCliCommand();
program.name("unbag").description("unbag CLI").version("0.8.0");
program.addCommand(new CustomCliCommand().name("transform").description("\u8F6C\u6362\u6587\u4EF6").addOptions(getCommonOptions()).option("-w,--watch", "\u542F\u7528\u89C2\u5BDF\u6A21\u5F0F").action(async options => {
const userConfig = await resolveUserConfigFromCli({
cliOptions: options,
overrides: {
transform: {
watch: options.watch
}
}
});
const cmd = new TransformCommand(userConfig);
await cmd.run();
})).addCommand(new CustomCliCommand().name("commit").description("\u63D0\u4EA4\u6587\u4EF6").addOptions(getCommonOptions()).action(async options => {
const userConfig = await resolveUserConfigFromCli({
cliOptions: options
});
const cmd = new CommitCommand(userConfig);
await cmd.run();
}).addCommand(new CustomCliCommand().name("lint").description("\u6821\u9A8C\u63D0\u4EA4\u4FE1\u606F").addOptions(getCommonOptions()).option("-m,--message <string>", "\u4FE1\u606F").action(async options => {
const {
message
} = options;
const userConfig = await resolveUserConfigFromCli({
cliOptions: options
});
const cmd = new CommitLintCommand(userConfig);
await cmd.run(message);
}))).addCommand(new CustomCliCommand().name("release").description("release").addOptions(getCommonOptions()).option("-d,--dry", "\u542F\u7528\u8BD5\u8FD0\u884C\u6A21\u5F0F").action(async options => {
const userConfig = await resolveUserConfigFromCli({
cliOptions: options,
overrides: {
release: {
dry: options.dry
}
}
});
const cmd = new ReleaseCommand(userConfig);
await cmd.run();
})).addCommand(new CustomCliCommand().name("clean").action(() => {
console.log("clean");
}).addCommand(new CustomCliCommand().name("cleansss").action(() => {
console.log("cleansss");
}))).addCommand(new CustomCliCommand().name("parallel").description("\u8FD0\u884C\u591A\u4E2Anpm script").option("-c,--config <string>", "\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84").addOptions(getCommonOptions()).action(async options => {
const cliUserConfig = await resolveCliUserConfig(options);
const finalConfig = mergeConfig(cliUserConfig, {});
await parallel(finalConfig);
})).addCommand(new CustomCliCommand().name(WaitCmdName).description("parallel\u547D\u4EE4\u5229\u7528\u6B64\u547D\u4EE4\u6765\u8FBE\u5230wait\u529F\u80FD").option("-n,--name <string>", "\u7B49\u5F85\u7684\u547D\u4EE4\u540D\u79F0").option("-f,--absoluteFilePath <string>", "\u8981\u8F6E\u8BE2\u68C0\u67E5\u7684\u6587\u4EF6\u7684\u7EDD\u5BF9\u8DEF\u5F84").option("-tg,--tag <string>", "\u7B49\u5F85\u7684\u51FD\u6570\u8FD0\u884C\u6807\u5FD7").option("-td,--tempDir <string>", "\u4E34\u65F6\u6587\u4EF6\u5939").option("-i,--interval <string>", "\u68C0\u6D4B\u95F4\u9694").option("-tm,--timeout <string>", "\u8D85\u65F6\u65F6\u95F4").action(async options => {
const {
name = "",
absoluteFilePath = ""
} = options;
let checkResult = void 0;
if (absoluteFilePath && name) {
checkResult = await checkWaitFile({
name,
absoluteFilePath
});
}
if (checkResult?.content.result) {
process.exit(0);
} else {
process.exit(1);
}
}));
program.parse();
};
export { read };