stackpress
Version:
Incept is a content management framework.
70 lines (69 loc) • 2.6 kB
JavaScript
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);
}
;