gub
Version:
> 接入成本极低,快速从原有项目(可运行项目)中clone出新项目,并重写package.json,安装依赖
551 lines (444 loc) • 15 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _commander = _interopRequireDefault(require("commander"));
var _nanoid = _interopRequireDefault(require("nanoid"));
var _log = _interopRequireDefault(require("./log"));
var _fsExtra = _interopRequireDefault(require("fs-extra"));
var _path = _interopRequireDefault(require("path"));
var _gitUsername = _interopRequireDefault(require("git-username"));
var _inquirer = _interopRequireDefault(require("inquirer"));
var _execa = _interopRequireDefault(require("execa"));
var _chalk = _interopRequireDefault(require("chalk"));
var _mkdirp = _interopRequireDefault(require("mkdirp"));
var _cliSpinner = require("cli-spinner");
var _getenv = _interopRequireDefault(require("getenv"));
var _escapeStringRegexp = _interopRequireDefault(require("escape-string-regexp"));
var _alias = require("./alias");
var _parseGithubUrl = _interopRequireDefault(require("parse-github-url"));
var banner = "\n\n|||||||||||||||||||||||||||||||||||||||||||||||||||||\n\n Welcome use gub to init your npm package.\n\n https://github.com/janryWang/gub\n\n|||||||||||||||||||||||||||||||||||||||||||||||||||||\n\n";
var required = function required(input) {
if (input) return true;else return "This field is required";
};
var getGloabNodeModulesPath = function getGloabNodeModulesPath() {
return String((0, _getenv["default"])("PATH")).split(":").filter(function (path) {
return path.indexOf("node") > -1 && path[0] !== ".";
})[0];
};
var hasTnpm =
/*#__PURE__*/
function () {
var _ref = (0, _asyncToGenerator2["default"])(
/*#__PURE__*/
_regenerator["default"].mark(function _callee() {
var npm;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
npm = getGloabNodeModulesPath();
if (!npm) {
_context.next = 7;
break;
}
_context.next = 4;
return _fsExtra["default"].exists(npm + "/tnpm");
case 4:
return _context.abrupt("return", _context.sent);
case 7:
return _context.abrupt("return", false);
case 8:
case "end":
return _context.stop();
}
}
}, _callee);
}));
return function hasTnpm() {
return _ref.apply(this, arguments);
};
}();
var promiseCall = function promiseCall(fn) {
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
return new Promise(function (resolve, reject) {
fn.apply(void 0, args.concat([function (err, res) {
if (!err) {
resolve(res);
} else {
reject(err);
}
}]));
});
};
var transform =
/*#__PURE__*/
function () {
var _ref2 = (0, _asyncToGenerator2["default"])(
/*#__PURE__*/
_regenerator["default"].mark(function _callee2(file_path, fn) {
var file;
return _regenerator["default"].wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
_context2.next = 2;
return _fsExtra["default"].readFile(file_path, "utf8");
case 2:
file = _context2.sent;
_context2.next = 5;
return _fsExtra["default"].writeFile(file_path, fn(file), "utf8");
case 5:
return _context2.abrupt("return", _context2.sent);
case 6:
case "end":
return _context2.stop();
}
}
}, _callee2);
}));
return function transform(_x, _x2) {
return _ref2.apply(this, arguments);
};
}();
/**
*
* 1. clone文件到当前目录
* 2.
*
*/
var getPkgInfo =
/*#__PURE__*/
function () {
var _ref3 = (0, _asyncToGenerator2["default"])(
/*#__PURE__*/
_regenerator["default"].mark(function _callee3(cwd) {
var name;
return _regenerator["default"].wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
name = cwd.replace(/.*\/([^\/]+)$/g, "$1");
_context3.next = 3;
return _inquirer["default"].prompt([{
type: "input",
name: "name",
validate: required,
"default": name,
message: "Please input the package name"
}, {
type: "input",
name: "description",
message: "Please input the package description"
}, {
type: "input",
name: "version",
"default": "0.1.0-alpha.0",
message: "Please input the package version"
}, {
type: "input",
name: "author",
"default": (0, _gitUsername["default"])({
cwd: cwd
}),
message: "Please input the pacakge author"
}, {
type: "input",
name: "license",
"default": "MIT",
message: "Please input the pacakge license"
}]);
case 3:
return _context3.abrupt("return", _context3.sent);
case 4:
case "end":
return _context3.stop();
}
}
}, _callee3);
}));
return function getPkgInfo(_x3) {
return _ref3.apply(this, arguments);
};
}();
var traverseFile =
/*#__PURE__*/
function () {
var _ref4 = (0, _asyncToGenerator2["default"])(
/*#__PURE__*/
_regenerator["default"].mark(function _callee4(dir, traverse) {
var files, i, file_path, status, content, newContent;
return _regenerator["default"].wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
_context4.next = 2;
return _fsExtra["default"].readdir(dir);
case 2:
files = _context4.sent;
i = 0;
case 4:
if (!(i < files.length)) {
_context4.next = 31;
break;
}
_context4.prev = 5;
file_path = _path["default"].join(dir, files[i]);
_context4.next = 9;
return _fsExtra["default"].stat(file_path);
case 9:
status = _context4.sent;
if (!status) {
_context4.next = 24;
break;
}
if (!status.isFile()) {
_context4.next = 22;
break;
}
_context4.next = 14;
return _fsExtra["default"].readFile(file_path, "utf-8");
case 14:
content = _context4.sent;
if (!(typeof traverse === "function")) {
_context4.next = 20;
break;
}
newContent = traverse(content);
if (!(newContent !== undefined)) {
_context4.next = 20;
break;
}
_context4.next = 20;
return _fsExtra["default"].writeFile(file_path, newContent);
case 20:
_context4.next = 24;
break;
case 22:
_context4.next = 24;
return traverseFile(file_path, traverse);
case 24:
_context4.next = 28;
break;
case 26:
_context4.prev = 26;
_context4.t0 = _context4["catch"](5);
case 28:
i++;
_context4.next = 4;
break;
case 31:
case "end":
return _context4.stop();
}
}
}, _callee4, null, [[5, 26]]);
}));
return function traverseFile(_x4, _x5) {
return _ref4.apply(this, arguments);
};
}();
var cloneRepo =
/*#__PURE__*/
function () {
var _ref5 = (0, _asyncToGenerator2["default"])(
/*#__PURE__*/
_regenerator["default"].mark(function _callee5(repos, branch, dir) {
var tmp_path, cwd, spinner, pkg, oldPkgName, newPkgName, tnpm;
return _regenerator["default"].wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
if (dir === void 0) {
dir = process.cwd();
}
tmp_path = "/tmp/gub_repos/" + (0, _nanoid["default"])();
cwd = process.cwd();
spinner = new _cliSpinner.Spinner(_chalk["default"].yellow("Cloning your repository... %s"));
spinner.setSpinnerString("|/-\\");
_context5.next = 7;
return getPkgInfo(cwd);
case 7:
pkg = _context5.sent;
console.log("\n\n");
spinner.start();
_context5.prev = 10;
if (_fsExtra["default"].existsSync(tmp_path)) {
_context5.next = 14;
break;
}
_context5.next = 14;
return promiseCall(_mkdirp["default"], tmp_path);
case 14:
_context5.next = 16;
return _execa["default"].shell("git clone " + (branch ? "-b " + branch : "") + " " + repos + " " + tmp_path);
case 16:
_context5.next = 18;
return _fsExtra["default"].copy(tmp_path, dir, {
overwrite: true,
filter: function filter(src) {
if (src.indexOf(".gitignore") > -1) return true;
return src.indexOf(".git") == -1;
}
});
case 18:
oldPkgName = "", newPkgName = pkg.name;
_context5.next = 21;
return transform(_path["default"].resolve(dir, "./package.json"), function (file) {
var _pkg = file ? JSON.parse(file) : {};
oldPkgName = _pkg.name;
if (file) {
return JSON.stringify(Object.assign(_pkg, pkg), null, 2);
} else {
return JSON.stringify(pkg, null, 2);
}
});
case 21:
_context5.next = 23;
return traverseFile(dir, function (target) {
return target.replace(new RegExp((0, _escapeStringRegexp["default"])(oldPkgName), "ig"), newPkgName);
});
case 23:
_context5.next = 25;
return hasTnpm();
case 25:
tnpm = _context5.sent;
_context5.next = 28;
return _execa["default"].shell((tnpm ? "tnpm" : "npm") + " install", {
cwd: dir
});
case 28:
spinner.stop(true);
_log["default"].success("🎉🎉 Gub init success!");
_context5.next = 36;
break;
case 32:
_context5.prev = 32;
_context5.t0 = _context5["catch"](10);
spinner.stop(true);
throw _context5.t0;
case 36:
case "end":
return _context5.stop();
}
}
}, _callee5, null, [[10, 32]]);
}));
return function cloneRepo(_x6, _x7, _x8) {
return _ref5.apply(this, arguments);
};
}();
_commander["default"].command("init [repos] [dir]").option("-b, --branch <branch>", "Init with git branch").action(
/*#__PURE__*/
function () {
var _ref6 = (0, _asyncToGenerator2["default"])(
/*#__PURE__*/
_regenerator["default"].mark(function _callee6(repos, dir, options) {
var no_repos;
return _regenerator["default"].wrap(function _callee6$(_context6) {
while (1) {
switch (_context6.prev = _context6.next) {
case 0:
_context6.prev = 0;
_log["default"].flat(banner);
no_repos = !repos;
if (repos) {
_context6.next = 7;
break;
}
_context6.next = 6;
return (0, _alias.selectAliasViewer)();
case 6:
repos = _context6.sent;
case 7:
_context6.next = 9;
return cloneRepo(repos, options.branch, dir);
case 9:
if (!no_repos) {
_context6.next = 12;
break;
}
_context6.next = 12;
return (0, _alias.addAlias)(repos, (0, _parseGithubUrl["default"])(repos).name);
case 12:
_context6.next = 17;
break;
case 14:
_context6.prev = 14;
_context6.t0 = _context6["catch"](0);
if (_context6.t0) {
_log["default"].error(_context6.t0.Error || _context6.t0.Message || _context6.t0.message);
} else {
_log["default"].error("Operation Failed!");
}
case 17:
case "end":
return _context6.stop();
}
}
}, _callee6, null, [[0, 14]]);
}));
return function (_x9, _x10, _x11) {
return _ref6.apply(this, arguments);
};
}());
_commander["default"].command("alias").option("-c, --create", "Add an repository alias").option("-u, --update", "Update the repository alias").option("-r, --remove", "Remove the repository alias").option("-d, --delete", "Remove the repository alias").action(
/*#__PURE__*/
function () {
var _ref7 = (0, _asyncToGenerator2["default"])(
/*#__PURE__*/
_regenerator["default"].mark(function _callee7(cmd) {
return _regenerator["default"].wrap(function _callee7$(_context7) {
while (1) {
switch (_context7.prev = _context7.next) {
case 0:
if (!cmd.create) {
_context7.next = 5;
break;
}
_context7.next = 3;
return (0, _alias.createAliasViewer)();
case 3:
_context7.next = 18;
break;
case 5:
if (!cmd.update) {
_context7.next = 10;
break;
}
_context7.next = 8;
return (0, _alias.updateAliasViewer)();
case 8:
_context7.next = 18;
break;
case 10:
if (!cmd.remove) {
_context7.next = 15;
break;
}
_context7.next = 13;
return (0, _alias.removeAliasViewer)();
case 13:
_context7.next = 18;
break;
case 15:
if (!cmd["delete"]) {
_context7.next = 18;
break;
}
_context7.next = 18;
return (0, _alias.createAliasViewer)();
case 18:
case "end":
return _context7.stop();
}
}
}, _callee7);
}));
return function (_x12) {
return _ref7.apply(this, arguments);
};
}());
_commander["default"].parse(process.argv);