UNPKG

stackpress

Version:

Incept is a content management framework.

82 lines (81 loc) 3.21 kB
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); } }