Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
83440de
Add TanStack router and rename index.tsx to main.tsx
kingston Jul 4, 2025
01135b0
Add vite plugin
kingston Jul 4, 2025
1c47731
Remove unused react routes readonly provider
kingston Jul 4, 2025
1bd0b0a
Rename App to app and use named export
kingston Jul 4, 2025
89a9731
Lay initial foundation fo app routes instead of browser router
kingston Jul 4, 2025
23db5d9
Move route header to app-routes
kingston Jul 4, 2025
153c29e
Add enhanced toposort test
kingston Jul 4, 2025
a54f5fa
Fix bug with cycle detection in toposort
kingston Jul 4, 2025
21ab752
Add base routes-root path root
kingston Jul 4, 2025
c2ac93d
Move from pages to routes
kingston Jul 4, 2025
0e8dcda
Switch to tanstack index
kingston Jul 4, 2025
a6f4c5a
Allow web to generate a placeholder index page
kingston Jul 4, 2025
605b473
Convert auth callback pages to use new patterns
kingston Jul 4, 2025
79b0aff
Switch auth0 compoennts to use tanstack equivalents
kingston Jul 4, 2025
f2dcda4
Convert bull board page
kingston Jul 4, 2025
1fb6f4c
Remove NotFoundPage
kingston Jul 4, 2025
4a7bd2f
Move list files around
kingston Jul 4, 2025
89be659
Add changesets
kingston Jul 4, 2025
7e50114
Switch admin list to use tanstack
kingston Jul 4, 2025
23781f3
Switch to TanStack for list page
kingston Jul 4, 2025
664f0e4
Move edit generator files in their correct place
kingston Jul 4, 2025
a44aaae
Add create/edit files to router
kingston Jul 4, 2025
2021e61
Rename edit forms
kingston Jul 4, 2025
bd920c3
Rename and move embedded forms
kingston Jul 4, 2025
747fc01
Switch Sentry to use Tanstack integration
kingston Jul 4, 2025
6e86be7
Fix navigate on create page
kingston Jul 4, 2025
ca0ff4b
Switch over edit page routes
kingston Jul 4, 2025
322a63f
Switch over admin crud list generator
kingston Jul 4, 2025
1a6b368
Update NotFoundCard component to Tanstack
kingston Jul 4, 2025
25c8e40
Remove react-router-dom package
kingston Jul 4, 2025
b31f8b7
Improve converting case with prefix for react routes
kingston Jul 4, 2025
8a0b99a
Functionally disable react routes
kingston Jul 4, 2025
d7f2854
Moved admin pages to _admin pathless layout
kingston Jul 4, 2025
5dcaa92
Properly ignore route tree
kingston Jul 4, 2025
618f668
Strip out old react router code
kingston Jul 4, 2025
7894339
Reove unused import
kingston Jul 4, 2025
c4bae99
Regenerate simple tests
kingston Jul 4, 2025
359fb59
Fix tests
kingston Jul 4, 2025
7d97100
feat: Migrate React generators to use Tanstack Router instead of Reac…
kingston Jul 4, 2025
57fb163
Fix tests + app
kingston Jul 4, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Lay initial foundation fo app routes instead of browser router
  • Loading branch information
kingston committed Jul 4, 2025
commit 89a973118ac34be8793bad7fba8c62c466a11060
Original file line number Diff line number Diff line change
@@ -1,6 +1,21 @@
{
"name": "core/react-router",
"templates": {
"src/app/app-routes.tsx": {
"name": "app-routes",
"type": "ts",
"fileOptions": { "kind": "singleton" },
"generator": "@baseplate-dev/react-generators#core/react-router",
"importMapProviders": {
"reactComponentsImportsProvider": {
"importName": "reactComponentsImportsProvider",
"packagePathSpecifier": "@baseplate-dev/react-generators:src/generators/core/react-components/generated/ts-import-providers.ts"
}
},
"pathRootRelativePath": "{src-root}/app/app-routes.tsx",
"projectExports": { "AppRoutes": {}, "router": {} },
"variables": {}
},
"src/pages/index.tsx": {
"name": "index",
"type": "ts",
Expand All @@ -9,6 +24,14 @@
"importMapProviders": {},
"pathRootRelativePath": "{src-root}/pages/index.tsx",
"variables": { "TPL_RENDER_HEADER": {}, "TPL_ROUTES": {} }
},
"src/route-tree.gen.ts": {
"name": "route-tree",
"type": "ts",
"fileOptions": { "kind": "singleton" },
"generator": "@baseplate-dev/react-generators#core/react-router",
"pathRootRelativePath": "{src-root}/route-tree.gen.ts",
"projectExportsOnly": true
}
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { CORE_REACT_ROUTER_PATHS } from './template-paths.js';
import { CORE_REACT_ROUTER_RENDERERS } from './template-renderers.js';
import { CORE_REACT_ROUTER_IMPORTS } from './ts-import-providers.js';
import { CORE_REACT_ROUTER_TEMPLATES } from './typed-templates.js';

export const CORE_REACT_ROUTER_GENERATED = {
imports: CORE_REACT_ROUTER_IMPORTS,
paths: CORE_REACT_ROUTER_PATHS,
renderers: CORE_REACT_ROUTER_RENDERERS,
templates: CORE_REACT_ROUTER_TEMPLATES,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ import { packageInfoProvider } from '@baseplate-dev/core-generators';
import { createGeneratorTask, createProviderType } from '@baseplate-dev/sync';

export interface CoreReactRouterPaths {
appRoutes: string;
index: string;
routeTree: string;
}

const coreReactRouterPaths = createProviderType<CoreReactRouterPaths>(
Expand All @@ -17,7 +19,11 @@ const coreReactRouterPathsTask = createGeneratorTask({

return {
providers: {
coreReactRouterPaths: { index: `${srcRoot}/pages/index.tsx` },
coreReactRouterPaths: {
appRoutes: `${srcRoot}/app/app-routes.tsx`,
index: `${srcRoot}/pages/index.tsx`,
routeTree: `${srcRoot}/route-tree.gen.ts`,
},
},
};
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,22 @@ import type { BuilderAction } from '@baseplate-dev/sync';
import { typescriptFileProvider } from '@baseplate-dev/core-generators';
import { createGeneratorTask, createProviderType } from '@baseplate-dev/sync';

import { reactComponentsImportsProvider } from '#src/generators/core/react-components/generated/ts-import-providers.js';

import { CORE_REACT_ROUTER_PATHS } from './template-paths.js';
import { CORE_REACT_ROUTER_TEMPLATES } from './typed-templates.js';

export interface CoreReactRouterRenderers {
appRoutes: {
render: (
options: Omit<
RenderTsTemplateFileActionInput<
typeof CORE_REACT_ROUTER_TEMPLATES.appRoutes
>,
'destination' | 'importMapProviders' | 'template'
>,
) => BuilderAction;
};
index: {
render: (
options: Omit<
Expand All @@ -18,6 +30,16 @@ export interface CoreReactRouterRenderers {
>,
) => BuilderAction;
};
routeTree: {
render: (
options: Omit<
RenderTsTemplateFileActionInput<
typeof CORE_REACT_ROUTER_TEMPLATES.routeTree
>,
'destination' | 'importMapProviders' | 'template'
>,
) => BuilderAction;
};
}

const coreReactRouterRenderers = createProviderType<CoreReactRouterRenderers>(
Expand All @@ -27,13 +49,25 @@ const coreReactRouterRenderers = createProviderType<CoreReactRouterRenderers>(
const coreReactRouterRenderersTask = createGeneratorTask({
dependencies: {
paths: CORE_REACT_ROUTER_PATHS.provider,
reactComponentsImports: reactComponentsImportsProvider,
typescriptFile: typescriptFileProvider,
},
exports: { coreReactRouterRenderers: coreReactRouterRenderers.export() },
run({ paths, typescriptFile }) {
run({ paths, reactComponentsImports, typescriptFile }) {
return {
providers: {
coreReactRouterRenderers: {
appRoutes: {
render: (options) =>
typescriptFile.renderTemplateFile({
template: CORE_REACT_ROUTER_TEMPLATES.appRoutes,
destination: paths.appRoutes,
importMapProviders: {
reactComponentsImports,
},
...options,
}),
},
index: {
render: (options) =>
typescriptFile.renderTemplateFile({
Expand All @@ -42,6 +76,14 @@ const coreReactRouterRenderersTask = createGeneratorTask({
...options,
}),
},
routeTree: {
render: (options) =>
typescriptFile.renderTemplateFile({
template: CORE_REACT_ROUTER_TEMPLATES.routeTree,
destination: paths.routeTree,
...options,
}),
},
},
},
};
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import type { TsImportMapProviderFromSchema } from '@baseplate-dev/core-generators';

import {
createTsImportMap,
createTsImportMapSchema,
packageScope,
} from '@baseplate-dev/core-generators';
import {
createGeneratorTask,
createReadOnlyProviderType,
} from '@baseplate-dev/sync';

import { CORE_REACT_ROUTER_PATHS } from './template-paths.js';

const reactRouterImportsSchema = createTsImportMapSchema({
AppRoutes: {},
router: {},
});

export type ReactRouterImportsProvider = TsImportMapProviderFromSchema<
typeof reactRouterImportsSchema
>;

export const reactRouterImportsProvider =
createReadOnlyProviderType<ReactRouterImportsProvider>(
'react-router-imports',
);

const coreReactRouterImportsTask = createGeneratorTask({
dependencies: {
paths: CORE_REACT_ROUTER_PATHS.provider,
},
exports: {
reactRouterImports: reactRouterImportsProvider.export(packageScope),
},
run({ paths }) {
return {
providers: {
reactRouterImports: createTsImportMap(reactRouterImportsSchema, {
AppRoutes: paths.appRoutes,
router: paths.appRoutes,
}),
},
};
},
});

export const CORE_REACT_ROUTER_IMPORTS = {
task: coreReactRouterImportsTask,
};
Original file line number Diff line number Diff line change
@@ -1,6 +1,21 @@
import { createTsTemplateFile } from '@baseplate-dev/core-generators';
import path from 'node:path';

import { reactComponentsImportsProvider } from '#src/generators/core/react-components/generated/ts-import-providers.js';

const appRoutes = createTsTemplateFile({
fileOptions: { kind: 'singleton' },
importMapProviders: {
reactComponentsImports: reactComponentsImportsProvider,
},
name: 'app-routes',
projectExports: { AppRoutes: {}, router: {} },
source: {
path: path.join(import.meta.dirname, '../templates/src/app/app-routes.tsx'),
},
variables: {},
});

const index = createTsTemplateFile({
fileOptions: { kind: 'singleton' },
importMapProviders: {},
Expand All @@ -11,4 +26,13 @@ const index = createTsTemplateFile({
variables: { TPL_RENDER_HEADER: {}, TPL_ROUTES: {} },
});

export const CORE_REACT_ROUTER_TEMPLATES = { index };
const routeTree = createTsTemplateFile({
fileOptions: { kind: 'singleton' },
name: 'route-tree',
source: {
path: path.join(import.meta.dirname, '../templates/src/route-tree.gen.ts'),
},
variables: {},
});

export const CORE_REACT_ROUTER_TEMPLATES = { appRoutes, index, routeTree };
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
export type { ReactRouterImportsProvider } from './generated/ts-import-providers.js';
export { reactRouterImportsProvider } from './generated/ts-import-providers.js';
export * from './react-router.generator.js';
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import type { TsCodeFragment } from '@baseplate-dev/core-generators';
import type {
TsCodeFragment,
TsTemplateOutputTemplateMetadata,
} from '@baseplate-dev/core-generators';

import {
createNodePackagesTask,
Expand Down Expand Up @@ -64,6 +67,8 @@ export const reactRouterGenerator = createGenerator({
dev: extractPackageVersions(REACT_PACKAGES, ['@tanstack/router-plugin']),
}),
paths: CORE_REACT_ROUTER_GENERATED.paths.task,
imports: CORE_REACT_ROUTER_GENERATED.imports.task,
renderers: CORE_REACT_ROUTER_GENERATED.renderers.task,
vite: createProviderTask(reactBaseConfigProvider, (reactBaseConfig) => {
// TODO [2025-07-03]: Re-enable logging once migration is complete
reactBaseConfig.vitePlugins.set(
Expand All @@ -86,18 +91,10 @@ export const reactRouterGenerator = createGenerator({
paths: CORE_REACT_ROUTER_GENERATED.paths.provider,
},
run({ reactAppConfig, paths }) {
reactAppConfig.renderWrappers.set('react-router', {
wrap: (contents) =>
TsCodeUtils.templateWithImports(
tsImportBuilder(['BrowserRouter']).from('react-router-dom'),
)`<BrowserRouter>${contents}</BrowserRouter>`,
type: 'router',
});

reactAppConfig.renderRoot.set(
tsCodeFragment(
'<PagesRoot />',
tsImportBuilder().default('PagesRoot').from(paths.index),
'<AppRoutes />',
tsImportBuilder(['AppRoutes']).from(paths.appRoutes),
),
);
},
Expand Down Expand Up @@ -145,6 +142,7 @@ export const reactRouterGenerator = createGenerator({
reactRouteValues: reactRouteValuesProvider,
typescriptFile: typescriptFileProvider,
paths: CORE_REACT_ROUTER_GENERATED.paths.provider,
renderers: CORE_REACT_ROUTER_GENERATED.renderers.provider,
},
run({
reactRouterConfigValues: {
Expand All @@ -157,6 +155,7 @@ export const reactRouterGenerator = createGenerator({
reactRouteValues: { routes, layouts },
typescriptFile,
paths,
renderers,
}) {
return {
build: async (builder) => {
Expand All @@ -165,6 +164,24 @@ export const reactRouterGenerator = createGenerator({
// group routes by layout key
const renderedRoutes = renderRoutes(routes, layouts);

await builder.apply(renderers.appRoutes.render({}));

// Write a pseudo-file so that the template extractor can infer metadata for the
// generated route tree file
builder.writeFile({
id: 'route-tree',
destination: '@/src/route-tree.gen.ts',
contents: '',
options: { skipWriting: true },
templateMetadata: {
generator: builder.generatorInfo.name,
name: 'route-tree',
projectExportsOnly: true,
type: 'ts',
fileOptions: { kind: 'singleton' },
} satisfies TsTemplateOutputTemplateMetadata,
});

await builder.apply(
typescriptFile.renderTemplateFile({
template: CORE_REACT_ROUTER_GENERATED.templates.index,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// @ts-nocheck

import type { ErrorRouteComponent } from '@tanstack/react-router';

import { Button, ErrorDisplay, NotFoundCard } from '%reactComponentsImports';
import { createRouter, RouterProvider } from '@tanstack/react-router';

import { routeTree } from '../route-tree.gen.js';

const ErrorComponent: ErrorRouteComponent = ({
error,
reset,
}: React.ComponentProps<ErrorRouteComponent>) => (
<ErrorDisplay
error={error}
actions={<Button onClick={reset}>Reset</Button>}
/>
);

export const router = createRouter({
routeTree,
defaultNotFoundComponent: NotFoundCard,
defaultErrorComponent: ErrorComponent,
});

// Register the router instance for type safety
declare module '@tanstack/react-router' {
interface Register {
router: typeof router;
}
}

export function AppRoutes(): React.ReactElement {
return <RouterProvider router={router} />;
}