UNPKG

stackpress

Version:

Incept is a content management framework.

70 lines (69 loc) 2.6 kB
import path from 'node:path'; import FileLoader from '@stackpress/lib/FileLoader'; export default async function generate(server, idea, tsconfig, cli) { const build = getBuildPath(server); const transformer = await getTransformer(server, idea); const project = await createProject(build, tsconfig); cli?.verbose && cli.control.system('Looking up ideas...'); await server.resolve('idea', { transformer }); const directory = project.createDirectory(build); cli?.verbose && cli.control.system('Generating ideas...'); await transformer.transform({ cli, project: directory }); const lang = server.config.path('client.lang', 'js'); if (lang === 'ts') { cli?.verbose && cli.control.system('Converting to typescript...'); const prettier = await import('prettier'); project.saveSync(); const files = project.getSourceFiles(); for (const file of files) { const filePath = file.getFilePath(); const content = file.getFullText(); const pretty = await prettier.default.format(content, { parser: 'typescript' }); const fs = server.loader.fs; await fs.writeFile(filePath, pretty); } } else { cli?.verbose && cli.control.system('Converting to javascript...'); await project.emit(); } cli?.verbose && cli.control.success('Ideas generated'); } ; export async function createProject(output, tsconfig) { const morph = await import('ts-morph'); const { Project, IndentationText } = morph; return new Project({ tsConfigFilePath: tsconfig, skipAddingFilesFromTsConfig: true, compilerOptions: { outDir: output, declaration: true, declarationMap: false, sourceMap: false, }, manipulationSettings: { indentationText: IndentationText.TwoSpaces } }); } ; export function getBuildPath(server) { let build = server.config.path('client.build'); if (!build) { const cwd = server.config.path('server.cwd', process.cwd()); const name = server.config.path('client.package', 'stackpress-client'); build = path.join(cwd, 'node_modules', name); } return build; } ; export async function getTransformer(server, idea) { const loader = new FileLoader(server.loader.fs, server.loader.cwd); const transformer = await import('@stackpress/idea-transformer/Transformer'); const Transformer = transformer.default; return new Transformer(idea, loader); } ;