UNPKG

webstorm-init

Version:

CLI tool to write initial WebStorm settings into a new project

109 lines 4.47 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.copyTemplate = exports.IDEA = void 0; const fs_extra_1 = __importDefault(require("fs-extra")); const os_1 = __importDefault(require("os")); const glob_promise_1 = __importDefault(require("glob-promise")); const path_1 = __importDefault(require("path")); const replace_in_file_1 = require("replace-in-file"); exports.IDEA = ".idea"; const workingDir = process.cwd(); const template = path_1.default.join(__dirname, ".idea_template", ".idea"); const project = path_1.default.basename(workingDir); const workspace = `${exports.IDEA}/workspace.xml`; const iml = `${exports.IDEA}/${project}.iml`; const getTemplate = (templatePath) => { const result = templatePath ? path_1.default.join(templatePath, ".idea") : path_1.default.join(os_1.default.homedir(), ".idea_template", ".idea"); if (fs_extra_1.default.pathExistsSync(result)) { // prefer the template stored in the user's home directory return result; } if (templatePath) { // user explicitly requested using a custom template. If that does not exist: cancel! throw new Error(`Invalid template path. No .idea folder found in ${templatePath}`); } return; // use the built-in template otherwise }; exports.copyTemplate = (templatePath) => { let userTemplate; try { userTemplate = getTemplate(templatePath); } catch (err) { return Promise.reject(err); } const getProjectId = () => { if (fs_extra_1.default.pathExistsSync(workspace)) { const file = fs_extra_1.default.readFileSync(workspace, { encoding: "utf8" }); const match = file.match(/<component name="ProjectId" id="(.*)" ?\/>/); if (match && match.length > 1) { return match[1]; } } return ""; }; const renameIml = (files) => { if (files.length !== 1) { throw new RangeError("Invalid project template, check *.iml file"); } return fs_extra_1.default.move(files[0], iml); }; const setProjectName = () => { const options = { files: `${exports.IDEA}/modules.xml`, from: /\/\.idea\/[^"]*\.iml/g, to: `/.idea/${project}.iml`, }; return replace_in_file_1.replaceInFile(options); }; const addProjectId = (projectId) => { const options = { files: workspace, from: /<\/project>/, to: `<component name="ProjectId" id="${projectId}" /></project>`, }; return replace_in_file_1.replaceInFile(options); }; const setProjectId = (projectId) => () => { const options = { files: workspace, from: /<component name="ProjectId" id="[^"]*" ?\/>/, to: `<component name="ProjectId" id="${projectId}" />`, }; replace_in_file_1.replaceInFile(options).then((results) => { if (results.length === 1 && !results[0].hasChanged) { // the template workspace file did not include a projectId // re-add it instead: return addProjectId(projectId); } return Promise; }); }; const setNodeModulesPath = () => { const options = { files: workspace, from: /<property name="(.*)" value=".*(.)node_modules(.*)" ?\/>/g, to: `<property name="$1" value="${workingDir}$2node_modules$3" />`, }; return replace_in_file_1.replaceInFile(options); }; const processTemplate = (projectId) => () => { fs_extra_1.default.removeSync(iml); return glob_promise_1.default(`${exports.IDEA}/*.iml`) .then(renameIml) .then(setProjectName) .then(setProjectId(projectId)) .then(setNodeModulesPath) .then(() => Promise.resolve(userTemplate || "Built-in")); }; const projectId = getProjectId(); // retain the target project's id return fs_extra_1.default .copy(userTemplate || template, exports.IDEA) .then(processTemplate(projectId)); }; //# sourceMappingURL=copyTemplate.js.map