diff --git a/packages/tuono-routes-generator/src/generator.ts b/packages/tuono-routes-generator/src/generator.ts index 7494dbea..89851f11 100644 --- a/packages/tuono-routes-generator/src/generator.ts +++ b/packages/tuono-routes-generator/src/generator.ts @@ -34,8 +34,11 @@ const defaultConfig: Config = { let isFirst = false let skipMessage = false -async function getRouteNodes(config = defaultConfig): Promise { +async function getRouteNodes( + config = defaultConfig, +): Promise<{ routeNodes: RouteNode[]; rustHandlersNodes: string[] }> { const routeNodes: RouteNode[] = [] + const rustHandlersNodes: string[] = [] async function recurse(dir: string): Promise { const fullDir = path.resolve(config.folderName, dir) @@ -74,6 +77,19 @@ async function getRouteNodes(config = defaultConfig): Promise { isLoader, variableName, }) + } else if (fullPath.match(/\.(rs)$/)) { + const filePath = replaceBackslash(path.join(dir, dirent.name)) + const filePathNoExt = removeExt(filePath) + let routePath = + cleanPath(`/${filePathNoExt.split('.').join('/')}`) || '' + + if (routePath === 'index') { + routePath = '/' + } + + routePath = routePath.replace(/\/index$/, '/') || '/' + + rustHandlersNodes.push(routePath) } }), ) @@ -81,7 +97,7 @@ async function getRouteNodes(config = defaultConfig): Promise { await recurse('./') - return routeNodes + return { routeNodes, rustHandlersNodes } } export function hasParentRoute( @@ -139,7 +155,8 @@ export async function routeGenerator(config = defaultConfig): Promise { latestTask = taskId const start = Date.now() - const beforeRouteNodes = await getRouteNodes(config) + const { routeNodes: beforeRouteNodes, rustHandlersNodes } = + await getRouteNodes(config) const preRouteNodes = multiSortBy(beforeRouteNodes, [ (d): number => (d.routePath === '/' ? -1 : 1), @@ -259,21 +276,7 @@ export async function routeGenerator(config = defaultConfig): Promise { }), ].join('\n') - const routeImports = [ - '// This file is auto-generated by Tuono', - "import { createRoute } from 'tuono'", - [ - `import RootImport from './${replaceBackslash( - path.relative( - path.dirname(config.generatedRouteTree), - path.resolve(config.folderName, ROOT_PATH_ID), - ), - )}'`, - ].join('\n'), - imports, - 'const rootRoute = createRoute({ isRoot: true, component: RootImport });', - createRoutes, - '// Create/Update Routes', + const createRouteUpdates = [ sortedRouteNodes .map((node) => { const loaderNode = routePiecesByPath[node.routePath]?.loader @@ -284,6 +287,9 @@ export async function routeGenerator(config = defaultConfig): Promise { ${[ `path: '${node.cleanedPath}'`, `getParentRoute: () => ${node.parent?.variableName ?? 'root'}Route`, + rustHandlersNodes.includes(node.path || '') + ? 'hasHandler: true' + : '', ] .filter(Boolean) .join(',')} @@ -313,6 +319,24 @@ export async function routeGenerator(config = defaultConfig): Promise { ].join('') }) .join('\n\n'), + ] + + const routeImports = [ + '// This file is auto-generated by Tuono', + "import { createRoute } from 'tuono'", + [ + `import RootImport from './${replaceBackslash( + path.relative( + path.dirname(config.generatedRouteTree), + path.resolve(config.folderName, ROOT_PATH_ID), + ), + )}'`, + ].join('\n'), + imports, + 'const rootRoute = createRoute({ isRoot: true, component: RootImport });', + createRoutes, + '// Create/Update Routes', + createRouteUpdates, '// Create and export the route tree', `export const routeTree = rootRoute.addChildren([${routeConfigChildrenText}])`, ] diff --git a/packages/tuono-routes-generator/tests/generator/with-rust-handler/routeTree.expected.ts b/packages/tuono-routes-generator/tests/generator/with-rust-handler/routeTree.expected.ts new file mode 100644 index 00000000..d67556d1 --- /dev/null +++ b/packages/tuono-routes-generator/tests/generator/with-rust-handler/routeTree.expected.ts @@ -0,0 +1,30 @@ +// This file is auto-generated by Tuono + +import { createRoute } from 'tuono' + +import RootImport from './routes/__root' + +import AboutImport from './routes/about' +import IndexImport from './routes/index' + +const rootRoute = createRoute({ isRoot: true, component: RootImport }) + +const About = createRoute({ component: AboutImport }) +const Index = createRoute({ component: IndexImport }) + +// Create/Update Routes + +const AboutRoute = About.update({ + path: '/about', + getParentRoute: () => rootRoute, +} as any) + +const IndexRoute = Index.update({ + path: '/', + getParentRoute: () => rootRoute, + hasHandler: true, +} as any) + +// Create and export the route tree + +export const routeTree = rootRoute.addChildren([IndexRoute, AboutRoute]) diff --git a/packages/tuono-routes-generator/tests/generator/with-rust-handler/routes/__root.tsx b/packages/tuono-routes-generator/tests/generator/with-rust-handler/routes/__root.tsx new file mode 100644 index 00000000..ab504e42 --- /dev/null +++ b/packages/tuono-routes-generator/tests/generator/with-rust-handler/routes/__root.tsx @@ -0,0 +1 @@ +/** */ diff --git a/packages/tuono-routes-generator/tests/generator/with-rust-handler/routes/about.tsx b/packages/tuono-routes-generator/tests/generator/with-rust-handler/routes/about.tsx new file mode 100644 index 00000000..ab504e42 --- /dev/null +++ b/packages/tuono-routes-generator/tests/generator/with-rust-handler/routes/about.tsx @@ -0,0 +1 @@ +/** */ diff --git a/packages/tuono-routes-generator/tests/generator/with-rust-handler/routes/index.rs b/packages/tuono-routes-generator/tests/generator/with-rust-handler/routes/index.rs new file mode 100644 index 00000000..e69de29b diff --git a/packages/tuono-routes-generator/tests/generator/with-rust-handler/routes/index.tsx b/packages/tuono-routes-generator/tests/generator/with-rust-handler/routes/index.tsx new file mode 100644 index 00000000..ab504e42 --- /dev/null +++ b/packages/tuono-routes-generator/tests/generator/with-rust-handler/routes/index.tsx @@ -0,0 +1 @@ +/** */