webstorm-init
Version:
CLI tool to write initial WebStorm settings into a new project
109 lines • 4.47 kB
JavaScript
;
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