@router-cli/react-router-dev
Version:
File based routing cli for react-router-dom.
54 lines (44 loc) • 1.86 kB
text/typescript
import { template } from "../template";
import { RouterType, AppRouteComponents } from "../types";
type PopulateTemplateArgs = {
layouts: RouteData;
pages: RouteData;
appRouteComponents: AppRouteComponents,
imports: string[];
exports: string[];
routerType: RouterType;
};
export type RouteData = {
routes: string[];
imports: string[];
};
export const CODE_NAMING = {
exportType: "export type",
exportConst: "export const",
never: "never",
empty: "{}",
pages: "pageImports",
layouts: "layoutImports"
}
export function populateTemplate(args: PopulateTemplateArgs) {
let content = template;
function replaceImportObject(src: string[], type: string) {
if (src.length > 0) {
content = content.replaceAll(
`${CODE_NAMING.exportConst} ${type} = ${CODE_NAMING.empty};`,
`${CODE_NAMING.exportConst} ${type} = {
${src.sort().join(',\n ')}
};`);
}
}
replaceImportObject(args.layouts.imports, CODE_NAMING.layouts);
replaceImportObject(args.pages.imports, CODE_NAMING.pages);
content = content.replace("/*imports*/", args.imports.join("\n"));
content = content.replace("/*exports*/", args.exports.join("\n"));
content = content.replaceAll("/*{browserType}*/", args.routerType);
if(args.appRouteComponents.app) content = content.replace("app: undefined,", `app: App,`);
if(args.appRouteComponents.notFound) content = content.replace("notFound: undefined,", `notFound: NotFound,`);
if(args.appRouteComponents.error) content = content.replace("error: undefined,", `error: DefaultErrorComponent,`);
if(args.appRouteComponents.pending) content = content.replace("pending: undefined,", `pending: DefaultPendingComponent,`);
return content;
}