unbag
Version:
一个专门用来开发npm工具的包
104 lines • 2.94 kB
JavaScript
import { v4 as uuidv4 } from "uuid";
import { WaitDefaultConfig, genWaitCommand, genWaitResAbsoluteFilePath, writeWaitResFile } from "./wait.mjs";
import concurrently from "concurrently";
import { usePath } from "../../utils/path.mjs";
const ParallelDefaultConfig = {
wait: WaitDefaultConfig,
commands: [],
groups: {}
};
const parallel = async config => {
const needWaitCmdMap = /* @__PURE__ */new Map();
const {
parallel: parallel2,
root,
tempDir
} = config;
const {
commands,
groupName,
groups
} = parallel2;
const path = usePath();
const parallelTempDir = path.resolve(root, tempDir, "parallel");
const parallelWaitTempDir = path.resolve(parallelTempDir, "wait");
const finalCommands = (groupName ? groups[groupName] : commands) || [];
const commandList = finalCommands.map(e => {
let command = `${e.npmScript}`;
if (e.wait?.func) {
const waitTag = `${e.name}_wait_${uuidv4()}`;
const waitCmd = genWaitCommand({
tag: waitTag,
name: e.name
});
command = `${waitCmd} && ${command}`;
needWaitCmdMap.set(waitTag, e);
}
return {
name: e.name,
command
};
});
const waitFuncObj = Object.fromEntries(needWaitCmdMap.entries());
await Promise.all(Object.keys(waitFuncObj).map(async tag => {
const cmd = waitFuncObj[tag];
if (!cmd?.wait?.func) {
return;
}
const waitResAbsoluteFilePath = genWaitResAbsoluteFilePath({
absoluteTempDir: parallelWaitTempDir,
tag
});
await writeWaitResFile({
absoluteFilePath: waitResAbsoluteFilePath,
content: {
tag,
lastUpdateTime: Date.now(),
finish: false,
interval: cmd.wait.interval || WaitDefaultConfig.interval,
timeout: cmd.wait.interval || WaitDefaultConfig.timeout
}
});
}));
concurrently(commandList, {
prefixColors: "auto",
prefix: "[{time}]-[{name}]",
timestampFormat: "HH:mm:ss",
killOthers: ["failure"]
});
Object.keys(waitFuncObj).map(async tag => {
const cmd = waitFuncObj[tag];
if (!cmd?.wait?.func) {
return;
}
const waitResAbsoluteFilePath = genWaitResAbsoluteFilePath({
absoluteTempDir: parallelWaitTempDir,
tag
});
try {
const res = await cmd.wait.func();
await writeWaitResFile({
absoluteFilePath: waitResAbsoluteFilePath,
merge: true,
content: {
lastUpdateTime: Date.now(),
finish: true,
result: res,
message: res ? "success" : "false"
}
});
} catch (error) {
await writeWaitResFile({
absoluteFilePath: waitResAbsoluteFilePath,
merge: true,
content: {
finish: true,
lastUpdateTime: Date.now(),
result: false,
message: error.message || "unknown error"
}
});
}
});
};
export { ParallelDefaultConfig, parallel };