stackpress
Version:
Incept is a content management framework.
82 lines (81 loc) • 3.21 kB
JavaScript
import { Project, IndentationText } from 'ts-morph';
import prettier from 'prettier';
import Terminal from '@stackpress/lib/Terminal';
import FileLoader from '@stackpress/lib/FileLoader';
import Transformer from '@stackpress/idea-transformer/Transformer';
export default class InceptTerminal extends Terminal {
static brand = '[INCEPT]';
static extension = 'idea';
terminal;
server;
transformer;
constructor(args, server) {
super(args);
const idea = `${server.loader.cwd}/schema.idea`;
const input = this.expect(['input', 'i'], idea);
const loader = new FileLoader(server.loader.fs, server.loader.cwd);
this.transformer = new Transformer(input, loader);
this.server = server;
this.server.on('transform', async (req, res, server) => {
const build = server.config.path('client.build');
const tsconfig = server.config.path('client.tsconfig');
const project = this.project(build, tsconfig);
const directory = project.createDirectory(build);
await this.transformer.transform({ cli: this, project: directory });
const lang = server.config.path('client.lang', 'js');
if (lang === 'ts') {
project.saveSync();
const files = project.getSourceFiles();
for (const file of files) {
const filePath = file.getFilePath();
const content = file.getFullText();
const pretty = await prettier.format(content, {
parser: 'typescript'
});
const fs = this.server.loader.fs;
await fs.writeFile(filePath, pretty);
}
await this.server.emit('transformed', req, res);
}
else {
await project.emit();
await this.server.emit('transformed', req, res);
}
process.exit(0);
});
}
async bootstrap() {
await this.server.bootstrap();
await this.server.resolve('config');
await this.server.resolve('listen');
await this.server.resolve('route');
return this;
}
project(output, tsconfig) {
return new Project({
tsConfigFilePath: tsconfig,
skipAddingFilesFromTsConfig: true,
compilerOptions: {
outDir: output,
declaration: true,
declarationMap: false,
sourceMap: false,
},
manipulationSettings: {
indentationText: IndentationText.TwoSpaces
}
});
}
async run() {
if (this.command === 'transform') {
const request = this.server.request({
data: { transformer: this.transformer }
});
const response = this.server.response();
await this.server.emit('idea', request, response);
}
const request = this.server.request({ data: this.data });
const response = this.server.response();
return await this.server.emit(this.command, request, response);
}
}