create-plume-react-project
Version:
CLI to create Plume React Project
64 lines (63 loc) • 3.02 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs_extra_1 = __importDefault(require("fs-extra"));
const path_1 = __importDefault(require("path"));
const simple_logging_system_1 = require("simple-logging-system");
const logger = new simple_logging_system_1.Logger('Creator');
/**
* Handle project creation using templates
*/
class Creator {
constructor(config) {
this.config = config;
}
create() {
try {
this.copyTemplate();
this.updateTargetFilesWithProjectName();
logger.info(`Project created in ${this.config.get().targetDirectory}`);
logger.info('To start the project, you can now run the commands: yarn && yarn start');
}
catch (e) {
logger.error('Could not create project', e);
}
}
copyTemplate() {
const { targetDirectory } = this.config.get();
if (fs_extra_1.default.readdirSync(targetDirectory).length > 0) {
throw new Error(`Target directory '${targetDirectory}' is not empty`);
}
fs_extra_1.default.copySync(path_1.default.resolve(this.config.get().templateDirectory, this.config.get().template), targetDirectory);
// strangely the .gitignore file is not copy when the CLI is executed by npx/npm init/yarn create/...
// => so this hack enables to bypass this issue (cf 'package.json' & the 'copy-templates' script)
fs_extra_1.default.moveSync(path_1.default.resolve(targetDirectory, '.gitignore_safe'), path_1.default.resolve(targetDirectory, '.gitignore'));
}
updateTargetFilesWithProjectName() {
this.updatePackageJson();
this.updateIndexHtml();
}
updatePackageJson() {
const { projectName } = this.config.get();
this.updateFileContent('package.json', (fileContent) => {
const packageJsonContent = JSON.parse(fileContent);
packageJsonContent.name = projectName;
return JSON.stringify(packageJsonContent, null, 2);
});
}
updateIndexHtml() {
const { projectName } = this.config.get();
this.updateFileContent('index.html', (fileContent) => fileContent.replace('Plume admin', projectName));
}
updateFileContent(relativePath, fileTransformer) {
const absolutePath = path_1.default.resolve(this.config.get().targetDirectory, relativePath);
const fileContent = fs_extra_1.default.readFileSync(absolutePath, 'utf-8');
const fileUpdatedContent = fileTransformer(fileContent);
fs_extra_1.default.writeFileSync(absolutePath, fileUpdatedContent, 'utf-8');
}
static get [Symbol.for("___CTOR_ARGS___")]() { return [`Config`]; }
static get [Symbol.for("___CTOR_NAME___")]() { return "Creator"; }
}
exports.default = Creator;