@platform/cell.tmpl
Version:
Template generator for CellOS.
46 lines (45 loc) • 1.8 kB
JavaScript
import { Observable } from 'rxjs';
import { filter, map } from 'rxjs/operators';
import { cli, fs, log, Template, defaultValue } from '../common';
import * as middleware from './cmd.tmpl.middleware';
export async function tmpl(args) {
const install = defaultValue(args.install, true);
const tmplDir = fs.resolve(fs.join(__dirname, '../../templates'));
const fsPrompt = cli.prompt.fs.paths(tmplDir, { pageSize: 10, all: false });
const dir = (await fsPrompt.radio('create from:'))[0];
const name = await cli.prompt.text({ message: 'module name' });
const rename = [{ from: 'pkg.json', to: 'package.json' }];
let tmpl = Template
.create(dir)
.use(middleware.processPackage({ filename: 'pkg.json' }))
.use(middleware.replaceText())
.use(middleware.saveFile({ rename, done: install ? 'NEXT' : 'COMPLETE' }));
if (install) {
tmpl = tmpl.use(middleware.npmInstall({ done: 'COMPLETE' }));
}
const variables = {
dir: fs.resolve(`./${name}`),
name,
};
const alerts$ = tmpl.events$.pipe(filter((e) => e.type === 'TMPL/alert'), map((e) => e.payload));
const task = {
title: log.gray(`Create template: ${log.white(fs.basename(dir))}`),
task: () => new Observable((observer) => {
alerts$.subscribe((e) => observer.next(e.message));
(async () => {
await tmpl.execute({ variables });
observer.complete();
})();
}),
};
log.info();
await cli.exec.tasks.run(task);
log.info();
log.info.cyan(` cd ${fs.basename(variables.dir)}`);
if (!install) {
log.info.cyan(` yarn install`);
}
log.info.cyan(` yarn ${log.green('start')}`);
log.info();
log.info.gray(variables.dir);
}