@tsed/cli
Version:
CLI to bootstrap your Ts.ED project
50 lines (49 loc) • 2.27 kB
JavaScript
import { basename, dirname, join } from "node:path";
import { inject, injectable, ProjectPackageJson } from "@tsed/cli-core";
import { constant } from "@tsed/di";
import { ArchitectureConvention, ProjectConvention } from "../interfaces/index.js";
import { CliTemplatesService } from "../services/CliTemplatesService.js";
import { SymbolNamePipe } from "./SymbolNamePipe.js";
export class OutputFilePathPipe {
constructor() {
this.templatesService = inject(CliTemplatesService);
this.projectPackageJson = inject(ProjectPackageJson);
this.classNamePipe = inject(SymbolNamePipe);
}
transform(options) {
const template = this.templatesService.get(options.type);
const { outputDir, preserveCase, preserveDirectory } = template || {};
const hasSrcDir = outputDir?.includes("{{srcDir}}");
options.format = options.format || this.projectPackageJson.preferences.convention || ProjectConvention.DEFAULT;
const featureDir = dirname(options.name);
const baseDir = this.getBaseDir(options.baseDir, outputDir, options.type);
if (!preserveCase && !preserveDirectory && this.projectPackageJson.preferences.architecture === ArchitectureConvention.FEATURE) {
return join(hasSrcDir ? constant("project.srcDir", "") : "", options.subDir || "", featureDir, this.classNamePipe.transform(options));
}
return join(hasSrcDir ? constant("project.srcDir", "") : "", baseDir, options.subDir || "", featureDir, this.classNamePipe.transform(options));
}
getBaseDir(baseDir, outputDir, type) {
if (baseDir) {
return baseDir;
}
if (outputDir) {
return outputDir.replace(/\{\{srcDir}}/, "");
}
return `${type}s`.split(":").at(-1) || "";
}
getServerName() {
return basename(`${this.transform({
name: "Server",
type: "server",
format: this.projectPackageJson.preferences.convention
})}.ts`);
}
getIndexControllerName() {
return basename(`${this.transform({
name: "Index",
type: "controller",
format: this.projectPackageJson.preferences.convention
})}.ts`);
}
}
injectable(OutputFilePathPipe);