@tecfancy/init
Version:
187 lines • 7.48 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const path_1 = __importDefault(require("path"));
const fs_extra_1 = __importDefault(require("fs-extra"));
const axios_1 = __importDefault(require("axios"));
const npminstall_1 = __importDefault(require("npminstall"));
const semver_1 = __importDefault(require("semver"));
const log_1 = __importDefault(require("@tecfancy/log"));
const spinner_1 = require("@tecfancy/spinner");
const set_env_variables_1 = require("@tecfancy/set-env-variables");
const const_1 = require("@tecfancy/const");
const createWorkingDir_1 = __importDefault(require("./createWorkingDir"));
const GenerateGitIgnoreFile_1 = __importDefault(require("./GenerateGitIgnoreFile"));
function setEnvVariables(options) {
(0, set_env_variables_1.setEnvVariablesFromCommand)(options, "china", {
TECFANCY_CLI_REGISTRY_URL: "https://registry.npmmirror.com",
});
}
function createNodeModulesDir() {
if (!fs_extra_1.default.pathExistsSync(const_1.TECFANCY_CLI_NODE_MODULES_DIR)) {
fs_extra_1.default.mkdirpSync(const_1.TECFANCY_CLI_NODE_MODULES_DIR);
}
}
/**
* Get the project list from github
* @returns project list
*/
async function getProjectsList() {
(0, spinner_1.spinnerStart)("Getting project list...");
try {
const request = axios_1.default.create({
baseURL: "https://api.github.com/repos",
timeout: 5000,
});
const result = await request({
url: "/tecfancy/tecfancy-templates/contents/templates.json",
});
(0, spinner_1.spinnerStop)();
return JSON.parse(Buffer.from(result.data.content, "base64").toString());
}
catch (error) {
(0, spinner_1.spinnerStop)();
log_1.default.error("", `Get project list failed: ${error}`);
throw new Error(`Get project list failed: ${error}`); // Propagate the exception to be handled by the caller
}
}
/**
* Get the project tags
* @param projectListData project list data
* @returns project tags
*/
function extraTags(projectListData) {
const tagsSet = new Set();
projectListData.forEach((project) => {
project.tags.forEach((tag) => {
// TODO: default is English, need to be changed to the current language
tagsSet.add(tag.default);
});
});
return Array.from(tagsSet).map((tag) => ({ name: tag, value: tag }));
}
/**
* Select the project type
* @returns project type
*/
async function selectType(projectListData) {
const inquirer = (await import("inquirer")).default;
return inquirer.prompt([
{
type: "list",
name: "type",
message: "Please select the project type:",
default: "Project",
choices: extraTags(projectListData),
},
]);
}
/**
* Select the project
* @param selectedType selected type
* @param projectList project list data
* @returns project name
*/
async function selectProject(selectedType, projectList) {
const filteredProjectList = projectList.filter((project) => project.tags.find((tag) => tag.default === selectedType));
const inquirer = (await import("inquirer")).default;
return inquirer.prompt([
{
type: "list",
name: "npmName",
message: `Please select the project:`,
choices: filteredProjectList.map((project) => ({
name: project.name.default, // TODO: default is English, need to be changed to the current language
value: project.npmName,
})),
},
]);
}
async function getProjectVersions(selectedNpmName) {
(0, spinner_1.spinnerStart)("Getting project verions...");
try {
const request = axios_1.default.create({
baseURL: process.env.TECFANCY_CLI_REGISTRY_URL || const_1.TECFANCY_CLI_REGISTRY_URL,
timeout: 5000,
});
const result = await request({ url: selectedNpmName });
(0, spinner_1.spinnerStop)();
const versions = Object.keys(result.data.versions);
if (versions?.length) {
return versions.sort((a, b) => (semver_1.default.compare(a, b)));
}
return [];
}
catch (error) {
(0, spinner_1.spinnerStop)();
log_1.default.error("", `Get project verions failed: ${error}`);
throw new Error(`Get project verions failed: ${error}`); // Propagate the exception to be handled by the caller
}
}
async function selectProjectVersion(projectVersions) {
const inquirer = (await import("inquirer")).default;
return inquirer.prompt([
{
type: "list",
name: "version",
message: `Please select the project version:`,
choices: projectVersions,
},
]);
}
async function downloadProject(selectedNpmName, selectedVersion) {
try {
await (0, npminstall_1.default)({
root: const_1.TECFANCY_CLI_CACHE_DIR,
storeDir: const_1.TECFANCY_CLI_NODE_MODULES_DIR,
registry: process.env.TECFANCY_CLI_REGISTRY_URL || const_1.TECFANCY_CLI_REGISTRY_URL,
pkgs: [{ name: selectedNpmName, version: selectedVersion || "latest" }],
});
log_1.default.success("", "Download project successfully.");
}
catch (error) {
log_1.default.info("", `Try to use the mirror of China with -c option.`);
log_1.default.error("", `Get project failed: ${error}`);
throw new Error(`Get project failed: ${error}`); // Propagate the exception to be handled by the caller
}
}
function installProject(projectName = "", selectedNpmName) {
(0, spinner_1.spinnerStart)("Installing project...");
const projectPath = path_1.default.join(const_1.TECFANCY_CLI_NODE_MODULES_DIR, selectedNpmName, 'template');
const workingPath = path_1.default.join(process.cwd(), projectName);
fs_extra_1.default.ensureDirSync(projectPath);
fs_extra_1.default.ensureDirSync(workingPath);
fs_extra_1.default.copySync(projectPath, workingPath, {
dereference: true, // Follow symbolic links
});
(0, spinner_1.spinnerStop)();
log_1.default.success("", "Install project successfully.");
}
/**
* Initialize the project
* @param projectName project name
* @param options options
*/
async function init(projectName, options) {
try {
setEnvVariables(options);
await (0, createWorkingDir_1.default)(projectName, options.force);
createNodeModulesDir();
const projectListData = await getProjectsList();
const { type: selectedType } = await selectType(projectListData);
const { npmName: selectedNpmName } = await selectProject(selectedType, projectListData);
const projectVersions = await getProjectVersions(selectedNpmName);
const { version: selectedVersion } = await selectProjectVersion(projectVersions);
await downloadProject(selectedNpmName, selectedVersion);
(0, GenerateGitIgnoreFile_1.default)(selectedNpmName);
installProject(projectName, selectedNpmName);
}
catch (error) {
log_1.default.error("", `Initialization failed: ${error}`);
throw new Error(`Initialization failed: ${error}`); // Propagate the exception to be handled by the caller
}
}
exports.default = init;
//# sourceMappingURL=index.js.map