utopia-scripts
Version:
scripts makes you free
580 lines (559 loc) • 20.1 kB
JavaScript
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
for (var prop in b || (b = {}))
if (__hasOwnProp.call(b, prop))
__defNormalProp(a, prop, b[prop]);
if (__getOwnPropSymbols)
for (var prop of __getOwnPropSymbols(b)) {
if (__propIsEnum.call(b, prop))
__defNormalProp(a, prop, b[prop]);
}
return a;
};
var __objRest = (source, exclude) => {
var target = {};
for (var prop in source)
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
target[prop] = source[prop];
if (source != null && __getOwnPropSymbols)
for (var prop of __getOwnPropSymbols(source)) {
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
target[prop] = source[prop];
}
return target;
};
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod));
var __async = (__this, __arguments, generator) => {
return new Promise((resolve6, reject) => {
var fulfilled = (value) => {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
};
var step = (x) => x.done ? resolve6(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
step((generator = generator.apply(__this, __arguments)).next());
});
};
// package.json
var require_package = __commonJS({
"package.json"(exports, module2) {
module2.exports = {
name: "utopia-scripts",
version: "0.1.0",
description: "scripts makes you free",
engines: {
node: ">=8.3.0"
},
bin: {
"utopia-scripts": "./bin/index.js"
},
files: [
"bin",
"lib"
],
scripts: {
build: "node build.js",
lint: "eslint --ext .js,.ts src",
test: 'echo "pass test"',
publish: "bash publish.sh"
},
keywords: [
"utopia",
"scripts",
"cli"
],
author: "ConradZhangcong",
license: "MIT",
dependencies: {
chalk: "^4.1.2",
commander: "^9.3.0",
"download-git-repo": "^3.0.2",
inquirer: "^8.2.4",
ora: "5.4.1",
"utopia-utils": "^0.0.4"
},
devDependencies: {
"@types/inquirer": "^8.2.1",
"@types/node": "^17.0.40",
"@typescript-eslint/eslint-plugin": "^4.33.0",
"@typescript-eslint/parser": "^4.33.0",
esbuild: "^0.14.42",
eslint: "^7.32.0",
"eslint-config-prettier": "^8.5.0",
"eslint-define-config": "^1.5.0",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-prettier": "^3.4.1",
prettier: "2.2.1",
typescript: "^4.7.3"
},
repository: {
type: "git",
url: "https://github.com/ConradZhangcong/utopia-scripts.git"
}
};
}
});
// src/main.ts
var import_commander = require("commander");
var import_chalk4 = require("../node_modules/chalk/source/index.js");
// src/create/index.ts
var import_process = require("process");
var import_fs4 = require("fs");
var import_path3 = require("path");
var import_ora = __toESM(require("../node_modules/ora/index.js"));
var import_util3 = require("util");
var import_chalk2 = require("../node_modules/chalk/source/index.js");
// src/__utils/downloadGitRepo.ts
var import_util = require("util");
var import_download_git_repo = __toESM(require("../node_modules/download-git-repo/index.js"));
var downloadRepo = (0, import_util.promisify)(import_download_git_repo.default);
var downloadGitRepo_default = downloadRepo;
// src/__utils/isExists.ts
var import_fs = require("fs");
var isExists = (path, options = {}) => {
const exists = (0, import_fs.existsSync)(path);
if (!exists)
return false;
const stats = (0, import_fs.statSync)(path);
const isFile = stats.isFile();
const type = options.type || "file";
if (type === "file") {
return isFile;
} else if (type === "directory") {
return !isFile;
} else {
console.warn(`isExists options.type: ${type} is not validate, will be seen as 'file'`);
return isFile;
}
};
var isDirectoryExists = (path) => isExists(path, { type: "directory" });
var isExists_default = isExists;
// src/create/getActualProjectName.ts
var import_fs2 = require("fs");
var import_path = require("path");
// src/create/inquirers.ts
var import_inquirer = require("../node_modules/inquirer/lib/inquirer.js");
var import_chalk = require("../node_modules/chalk/source/index.js");
var inputNewPrjName = () => (0, import_inquirer.prompt)({
type: "input",
name: "prjName",
message: "Target directory exists, please input new project name: "
});
var confirmOverwrite = (projectName) => (0, import_inquirer.prompt)({
type: "confirm",
name: "isOverwrite",
message: `Sure to overwrite: ${(0, import_chalk.red)(projectName)} ?`
});
var operateWhilePrjNameConflict = () => (0, import_inquirer.prompt)({
type: "list",
name: "conflictAction",
message: "Target directory exists, Please choose an action",
choices: [
{ name: "Create a new floder", value: "newFolder" },
{ name: "Overwrite", value: "overwrite" },
{ name: "Quit", value: "quit" }
]
});
var chooseTemplate = () => (0, import_inquirer.prompt)({
type: "list",
name: "template",
message: "Please choose a template",
choices: ["basic", "react"]
});
// src/create/getActualProjectName.ts
var checkExist = (projectName) => {
const cwd = process.cwd();
const targetDir = (0, import_path.resolve)(cwd, projectName);
return (0, import_fs2.existsSync)(targetDir);
};
var getNewPrjName = () => __async(void 0, null, function* () {
const loop = () => __async(void 0, null, function* () {
const answer = yield inputNewPrjName();
return answer.prjName;
});
let prjName = yield loop();
while (checkExist(prjName)) {
prjName = yield loop();
}
return prjName;
});
var conflict = (projectName) => __async(void 0, null, function* () {
const { conflictAction } = yield operateWhilePrjNameConflict();
if (conflictAction === "overwrite") {
const { isOverwrite } = yield confirmOverwrite(projectName);
if (isOverwrite) {
return { projectName, overwrite: true };
} else {
return yield conflict(projectName);
}
} else if (conflictAction === "newFolder") {
const newPrjName = yield getNewPrjName();
return { projectName: newPrjName, overwrite: false };
} else {
return {
quit: true
};
}
});
var getActualProjectName = (projectName, options) => __async(void 0, null, function* () {
if (!checkExist(projectName))
return { projectName, overwrite: false };
if (Reflect.has(options, "force")) {
let forceOverwrite = false;
if (options.force) {
const ans = yield confirmOverwrite(projectName);
forceOverwrite = ans.isOverwrite;
}
if (forceOverwrite)
return { projectName, overwrite: true };
const newPrjName = yield getNewPrjName();
return { projectName: newPrjName, overwrite: true };
}
const confilctRes = conflict(projectName);
return confilctRes;
});
var getActualProjectName_default = getActualProjectName;
// src/create/updateProject.ts
var import_fs3 = __toESM(require("fs"));
var import_path2 = require("path");
var import_child_process = require("child_process");
var import_util2 = require("util");
// src/create/const.ts
var TemplateRepos = {
basic: "github:ConradZhangcong/utopia-template-basic",
react: "github:ConradZhangcong/utopia-template-react"
};
var GIT_USER_NAME_CMD = "git config user.name";
var GIT_USER_EMAIL_CMD = "git config user.email";
var GIT_REPOSITORY_INIT = "git init";
var GIT_REPOSITORY_FIRST_COMMIT = `git add . && git commit -m "init"`;
// src/create/updateProject.ts
var exec = (0, import_util2.promisify)(import_child_process.exec);
var readFile = (0, import_util2.promisify)(import_fs3.default.readFile);
var writeFile = (0, import_util2.promisify)(import_fs3.default.writeFile);
var getGitUserInfo = () => __async(void 0, null, function* () {
try {
const result = {};
const nameRes = yield exec(GIT_USER_NAME_CMD);
if (nameRes) {
Object.assign(result, { name: nameRes.stdout.replace(`
`, "") });
}
const emailRes = yield exec(GIT_USER_EMAIL_CMD);
if (nameRes) {
Object.assign(result, { email: emailRes.stdout.replace(`
`, "") });
}
return result;
} catch (error) {
console.error("utopia-scripts: \u83B7\u53D6git\u4FE1\u606F\u5931\u8D25");
console.error(error);
}
});
var updatePackageJson = (_0) => __async(void 0, [_0], function* ({
path,
prjName
}) {
const pkgPath = (0, import_path2.resolve)(path, "package.json");
if (!isExists_default(pkgPath))
return;
const pkgInfo = yield readFile(pkgPath, "utf8");
const pkgData = JSON.parse(pkgInfo);
Object.assign(pkgData, { name: prjName });
const userInfo = yield getGitUserInfo();
if (userInfo) {
const { name: name2, email } = userInfo;
if (name2 && email) {
Object.assign(pkgData, { author: `${name2} ${email}` });
}
}
yield writeFile(pkgPath, JSON.stringify(pkgData, null, 2));
});
var initGitRepo = (_0) => __async(void 0, [_0], function* ({ path }) {
yield exec(GIT_REPOSITORY_INIT, { cwd: path });
});
var firstCommit = (_0) => __async(void 0, [_0], function* ({ path }) {
yield exec(GIT_REPOSITORY_FIRST_COMMIT, { cwd: path });
});
var updateProject = (options) => __async(void 0, null, function* () {
yield Promise.all([
updatePackageJson(options),
initGitRepo(options)
]);
yield firstCommit(options);
});
var updateProject_default = updateProject;
// src/create/index.ts
var remove = (0, import_util3.promisify)(import_fs4.rm);
var create = (projectName, options) => __async(void 0, null, function* () {
try {
const actualPrjNameRes = yield getActualProjectName_default(projectName, options);
const { quit, projectName: actualPrjName, overwrite } = actualPrjNameRes;
if (quit) {
console.log("quit");
console.log((0, import_chalk2.blue)("utopia-scripts: create done!"));
(0, import_process.exit)(0);
}
const cwd = process.cwd();
const actualPath = (0, import_path3.resolve)(cwd, actualPrjName);
const { template } = yield chooseTemplate();
const spinner = (0, import_ora.default)("downloading template, please wait");
spinner.start();
try {
if (overwrite) {
yield remove(actualPath, { force: true, recursive: true });
}
yield downloadGitRepo_default(TemplateRepos[template], actualPath);
yield updateProject_default({ path: actualPath, prjName: actualPrjName });
spinner.succeed();
console.log("done");
} catch (err) {
spinner.fail("request fail, refetching");
console.log("err: ", err);
}
} catch (error) {
console.error((0, import_chalk2.red)("utopia-scripts create error:"));
console.error(error);
(0, import_process.exit)(1);
}
});
var create_default = create;
// src/generate-changelog/index.ts
var import_process2 = require("process");
var import_chalk3 = require("../node_modules/chalk/source/index.js");
// src/generate-changelog/check.ts
var import_child_process2 = require("child_process");
var import_util4 = require("util");
var exec2 = (0, import_util4.promisify)(import_child_process2.exec);
var checkGit = () => exec2("git --version").catch(() => {
throw new Error("command not found: git");
});
var checkGitRepo = (path) => exec2("git rev-parse --is-inside-work-tree", { cwd: path }).then((data) => {
if (data.stdout.includes("true")) {
return true;
}
return false;
}).catch((err) => {
throw err;
});
// src/generate-changelog/process.ts
var import_path4 = require("path");
var getLocaleTime = (date) => {
const now = date || new Date();
return now.toLocaleDateString() + " " + now.toLocaleTimeString();
};
var isArray = (directory) => /^\[.*\]$/.test(directory);
var getDirectoryList = (directory) => {
const baseUrl = process.cwd();
if (!directory) {
return [baseUrl];
}
if (isArray(directory)) {
const directoryList = JSON.parse(directory);
return directoryList.map((dir) => (0, import_path4.resolve)(baseUrl, dir));
}
return [];
};
var processOptions = (options) => {
const _a = options, { since, until, directory } = _a, restOptions = __objRest(_a, ["since", "until", "directory"]);
const nowDate = new Date();
const untilTime = until || getLocaleTime(nowDate);
const sinceTime = since || nowDate.toLocaleDateString() + " 00:00:00";
const directoryList = getDirectoryList(directory);
return __spreadValues({
directory,
directoryList,
since: sinceTime,
until: untilTime,
now: nowDate
}, restOptions);
};
// src/generate-changelog/generateLog.ts
var import_child_process3 = require("child_process");
var import_fs5 = require("fs");
var import_path5 = require("path");
var import_util5 = require("util");
// src/generate-changelog/const.ts
var SPLIT_STR = "--utopia-scripts-split--";
// src/generate-changelog/generateLog.ts
var exec3 = (0, import_util5.promisify)(import_child_process3.exec);
var writeFile2 = (0, import_util5.promisify)(import_fs5.writeFile);
var matchRegExp = /commitId: (.*), author: (.*), date: (.*), message: (.*)/;
var getLogCommand = ({ since, until }) => {
return `git log --date=iso --since="${since}" --until="${until}" --pretty=format:"commitId: %h, author: %aN, date: %ad, message: %s${SPLIT_STR}"`;
};
var formatLog = (log) => {
const result = log.match(matchRegExp);
if (!result)
return null;
const [, commitId, author, date, message] = result;
return { commitId, author, date, message };
};
var matchMessage = (message, reg) => {
var _a;
return reg ? (_a = message.match(new RegExp(reg))) == null ? void 0 : _a[1] : message;
};
var generateFileStr = (dirList, options) => {
const { message: reg, since, until } = options;
const originData = JSON.stringify(dirList, null, 2);
const completeList = [];
let result = `# CHANGELOG\r
\r
`;
result += `startTime: ${since}\r
endTime: ${until}\r
\r
`;
for (const dirItem of dirList) {
const { dirPath, logList } = dirItem;
let str = `## ${dirPath}\r
\r
`;
const messageList = [];
logList == null ? void 0 : logList.forEach((item) => {
const message = matchMessage(item.message, reg);
if (message) {
messageList.push(message);
}
});
const messageListSet = new Set(messageList);
for (const item of messageListSet) {
str += `${item}\r
`;
}
if (str) {
dirItem.messageStr = `${str}\r
`;
}
completeList.push(...messageList);
}
const completeListSet = new Set(completeList);
let completeMessage = "";
for (const item of completeListSet) {
completeMessage += item;
completeMessage += "\r\n";
}
result += `${completeMessage}\r
`;
for (const dirItem of dirList) {
result += dirItem.messageStr;
}
result += `### origin data\r
\r
\`\`\`json\r
${originData}\r
\`\`\`\r
`;
return result;
};
var generateLog = (execDirList, options) => __async(void 0, null, function* () {
const LOG_COMMAND = getLogCommand(options);
const gitLogExecList = [];
const gitLogList = [];
for (const dir of execDirList) {
gitLogExecList.push(exec3(LOG_COMMAND, { cwd: dir }));
gitLogList.push({ dirPath: dir });
}
const originList = yield Promise.all(gitLogExecList);
for (const index in originList) {
const gitlogItem = originList[index];
if (!gitlogItem.stdout) {
continue;
}
const logList = gitlogItem.stdout.split(SPLIT_STR).map((item) => formatLog(item)).filter((item) => !!item);
gitLogList[index].logList = logList;
}
const fileData = generateFileStr(gitLogList, options);
const { now } = options;
const fileName = `CHANGELOG-${now.getTime()}.md`;
yield writeFile2(fileName, fileData);
return (0, import_path5.resolve)(process.cwd(), fileName);
});
var generateLog_default = generateLog;
// src/generate-changelog/index.ts
var generateChangelog = (options) => __async(void 0, null, function* () {
try {
yield checkGit();
const handledOptions = processOptions(options);
const notExistsDirList = [];
const notGitRepoDirList = [];
const execDirList = [];
for (const directory of handledOptions.directoryList) {
if (!isDirectoryExists(directory)) {
notExistsDirList.push(directory);
continue;
}
if (!(yield checkGitRepo(directory))) {
notGitRepoDirList.push(directory);
continue;
}
execDirList.push(directory);
}
if (execDirList.length > 0) {
const logFilePath = yield generateLog_default(execDirList, handledOptions);
console.log((0, import_chalk3.blue)(`changelog has been generated, open ${logFilePath}!`));
}
if (notExistsDirList.length > 0) {
const notExistsDirStr = notExistsDirList.join("\r\n");
const errorMsg = `directory are not exist:\r
${notExistsDirStr}\r
`;
console.log((0, import_chalk3.red)(errorMsg));
}
if (notGitRepoDirList.length > 0) {
const notGitRepoDirStr = notGitRepoDirList.join("\r\n");
const errorMsg = `not a git repository:\r
${notGitRepoDirStr}\r
`;
console.log((0, import_chalk3.red)(errorMsg));
}
console.log((0, import_chalk3.blue)("utopia-scripts: generate changelog done!"));
(0, import_process2.exit)(0);
} catch (error) {
console.error((0, import_chalk3.red)("utopia-scripts generate-changelog error:"));
console.error(error);
(0, import_process2.exit)(1);
}
});
var generate_changelog_default = generateChangelog;
// src/main.ts
var packageInfo = require_package();
var { name, version } = packageInfo;
import_commander.program.name(name).version(version, "-v, -V, --version", `display version for ${name}`).usage(`<command> [option]`);
import_commander.program.command("create <project-name>").description("create a new project with utopia-template").option("-f, --force", "overwrite target directory if it exists").action((...args) => create_default(...args));
import_commander.program.command("generate-changelog").description("generate changelog by commit message").option("-c, --config <config-file>", "if exists, other configs will be ignored").option("-d, --directory <directory-list>", "accpet string | Array<string>, search subdirectories of current directory").option("-s, --since <start-time>", "start time").option("-u, --until <end-time>", "end time").option("-m, --message <message-regexp>", "match regexp for actual message").action((...args) => generate_changelog_default(...args));
import_commander.program.on("--help", function() {
console.log(`\r
Run ${(0, import_chalk4.cyan)(`${name} <command> --help`)} for detailed usage of given command.\r
`);
});
import_commander.program.parse(process.argv);