jovo-cli
Version:
jovo command line tool (beta)
130 lines • 5.74 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const command_1 = __importDefault(require("@oclif/command"));
const fs_extra_1 = require("fs-extra");
const jovo_cli_core_1 = require("jovo-cli-core");
const Listr = require("listr");
const utils_1 = require("../utils");
const Prompts_1 = require("../utils/Prompts");
const chalk_1 = __importDefault(require("chalk"));
class Load extends command_1.default {
async run() {
try {
const { args } = this.parse(Load);
const project = jovo_cli_core_1.getProject();
await project.init();
if (!fs_extra_1.existsSync(`./node_modules/${args.component}`)) {
throw new jovo_cli_core_1.JovoCliError(`The component '${args.component}' does not exist.`, 'jovo-cli', "Please check for spelling or install it with 'npm i ${args.component} -s'.");
}
this.log(`\n jovo load: ${Load.description}`);
this.log(chalk_1.default.grey(' >> Learn more: https://jovo.tech/docs/cli/load\n'));
const dest = fs_extra_1.existsSync('./src') ? './src/components' : './components';
const isTsProject = await project.isTypeScriptProject();
if (fs_extra_1.existsSync(`${dest}/${args.component}`)) {
const { overwriteComponent } = await Prompts_1.promptOverwriteComponent();
switch (overwriteComponent) {
case Prompts_1.ANSWER_OVERWRITE:
{
fs_extra_1.removeSync(`${dest}/${args.component}`);
}
break;
case Prompts_1.ANSWER_BACKUP:
{
fs_extra_1.moveSync(`${dest}/${args.component}`, `${dest}/${args.component}.backup.${Date.now()}`);
}
break;
default:
return;
}
}
const tasksArr = [
{
title: 'Copying component files...',
async task() {
await new Promise((res) => setTimeout(() => {
load(args.component, dest, isTsProject);
res();
}, 1000));
},
},
];
const tasks = new Listr(tasksArr, {
renderer: new utils_1.JovoCliRenderer(),
collapse: false,
});
await tasks.run();
this.log();
this.log(`\n\nSuccessfully copied ${args.component} into ${dest}.` +
'\n\nLearn more on how to use it here >> https://github.com/jovotech/jovo-framework/blob/master/docs/advanced-concepts/components.md');
this.log();
}
catch (err) {
this.error(`There was a problem:\n${err}`);
}
}
}
exports.Load = Load;
Load.description = 'Extracts the necessary files for a component from ./node_modules into your projects ./components folder.';
Load.examples = ['jovo load jovo-component-get-email'];
Load.args = [{ name: 'component' }];
function load(component, dest, isTsProject) {
const src = `node_modules/${component}`;
const isTsComponent = isTypeScriptComponent(src);
if (!fs_extra_1.existsSync(dest)) {
fs_extra_1.mkdirSync(dest);
}
const invalidFiles = [];
if (isTsProject) {
invalidFiles.push('dist');
}
else {
if (isTsComponent) {
invalidFiles.push('index.ts', 'src', 'tsconfig.json');
}
}
fs_extra_1.copySync(`./${src}`, `${dest}/${component}`, {
filter(file) {
return !invalidFiles.includes(file.replace(`${src}/`, ''));
},
});
if (!isTsProject && isTsComponent) {
fs_extra_1.copySync(`./${src}/dist`, `${dest}/${component}`, {
filter(file) {
return !/.*(\.d\.ts)|.*(\.js\.map)/g.test(file);
},
});
fs_extra_1.removeSync(`${dest}/${component}/dist`);
}
const { devDependencies = {}, dependencies = {} } = JSON.parse(fs_extra_1.readFileSync(`${src}/package.json`, { encoding: 'utf-8' }));
const dependencyKeys = Object.keys(dependencies).concat(Object.keys(devDependencies));
for (const dependencyKey of dependencyKeys) {
if (!dependencyKey.includes('jovo-component')) {
continue;
}
if (!fs_extra_1.existsSync(`./node_modules/${dependencyKey}`)) {
throw new jovo_cli_core_1.JovoCliError(`The component ${component} depends on the nested component ${dependencyKey}, which does not exist in ./node_modules.`, 'jovo-cli', `Please install it with npm i ${dependencyKey} -s and reload your component.`);
}
const nestedDest = fs_extra_1.existsSync(`${dest}/${component}/src`)
? `${dest}/${component}/src/components`
: `${dest}/${component}/components`;
load(dependencyKey, nestedDest, isTsProject);
}
fs_extra_1.removeSync(`${dest}/${component}/package.json`);
}
function isTypeScriptComponent(componentSrc) {
const content = fs_extra_1.readFileSync(`${componentSrc}/package.json`, {
encoding: 'utf-8',
});
if (content) {
const packageFile = JSON.parse(content);
if (packageFile.hasOwnProperty('devDependencies') &&
packageFile.devDependencies.hasOwnProperty('typescript')) {
return true;
}
}
return false;
}
//# sourceMappingURL=load.js.map