UNPKG

@tecfancy/init

Version:
187 lines 7.48 kB
"use strict"; 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