From bfcadf887d9e2303aea09df9b6ac34d62a925c2b Mon Sep 17 00:00:00 2001 From: Deep Shekhar Singh Date: Wed, 4 Feb 2026 00:18:51 +0530 Subject: [PATCH 01/20] fix: pass_host resets to default when editing upstream nodes (#3294) Also added E2E regression test e2e/tests/upstreams.pass-host-reset.spec.ts --- e2e/tests/upstreams.pass-host-reset.spec.ts | 312 ++++++++++++++++++++ src/routes/routes/detail.$id.tsx | 8 + src/routes/services/detail.$id/index.tsx | 1 + src/routes/stream_routes/detail.$id.tsx | 1 + src/routes/upstreams/detail.$id.tsx | 2 + 5 files changed, 324 insertions(+) create mode 100644 e2e/tests/upstreams.pass-host-reset.spec.ts diff --git a/e2e/tests/upstreams.pass-host-reset.spec.ts b/e2e/tests/upstreams.pass-host-reset.spec.ts new file mode 100644 index 0000000000..9332ffcead --- /dev/null +++ b/e2e/tests/upstreams.pass-host-reset.spec.ts @@ -0,0 +1,312 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { upstreamsPom } from '@e2e/pom/upstreams'; +import { randomId } from '@e2e/utils/common'; +import { e2eReq } from '@e2e/utils/req'; +import { test } from '@e2e/utils/test'; +import { uiHasToastMsg } from '@e2e/utils/ui'; +import { expect } from '@playwright/test'; + +import { deleteAllUpstreams } from '@/apis/upstreams'; + +test.beforeAll(async () => { + await deleteAllUpstreams(e2eReq); +}); + +/** + * Test for GitHub issue #3294 + * Bug: pass_host is reset to default value "pass" when editing upstream nodes + * @see https://github.com/apache/apisix-dashboard/issues/3294 + */ +test('should preserve pass_host value when editing upstream nodes', async ({ + page, +}) => { + const upstreamName = randomId('test-pass-host'); + + // Navigate to upstream add page + await upstreamsPom.toIndex(page); + await upstreamsPom.isIndexPage(page); + await upstreamsPom.getAddUpstreamBtn(page).click(); + await upstreamsPom.isAddPage(page); + + await test.step('create upstream with pass_host=node via UI', async () => { + // Fill in the Name field + await page.getByLabel('Name', { exact: true }).fill(upstreamName); + + // Add a node + const nodesSection = page.getByRole('group', { name: 'Nodes' }); + const addNodeBtn = page.getByRole('button', { name: 'Add a Node' }); + + await addNodeBtn.click(); + const rows = nodesSection.locator('tr.ant-table-row'); + const firstRow = rows.first(); + await expect(firstRow).toBeVisible(); + + const hostInput = firstRow.locator('input').first(); + await hostInput.click(); + await hostInput.fill('my-service.my-namespace.svc'); + + // Click outside to trigger update + await nodesSection.click(); + + // Set pass_host to "node" + const passHostSection = page.getByRole('group', { name: 'Pass Host' }); + await passHostSection.getByRole('textbox', { name: 'Pass Host' }).click(); + await page.getByRole('option', { name: 'node' }).click(); + + // Submit the form + await upstreamsPom.getAddBtn(page).click(); + await uiHasToastMsg(page, { + hasText: 'Add Upstream Successfully', + }); + }); + + await test.step('verify auto navigate to detail page', async () => { + await upstreamsPom.isDetailPage(page); + }); + + await test.step('verify initial pass_host value is "node"', async () => { + const passHostSection = page.getByRole('group', { name: 'Pass Host' }); + const passHostField = passHostSection.getByRole('textbox', { + name: 'Pass Host', + exact: true, + }); + await expect(passHostField).toHaveValue('node'); + await expect(passHostField).toBeDisabled(); + }); + + await test.step('click edit and add a new node', async () => { + await page.getByRole('button', { name: 'Edit' }).click(); + + const nodesSection = page.getByRole('group', { name: 'Nodes' }); + const addNodeBtn = page.getByRole('button', { name: 'Add a Node' }); + + // Add a new node + await addNodeBtn.click(); + + // Fill in the new node details + const rows = nodesSection.locator('tr.ant-table-row'); + const newRow = rows.nth(1); + await expect(newRow).toBeVisible(); + + const hostInput = newRow.locator('input').first(); + await hostInput.click(); + await hostInput.fill('another-service.svc'); + + const portInput = newRow.locator('input').nth(1); + await portInput.click(); + await portInput.fill('8080'); + + const weightInput = newRow.locator('input').nth(2); + await weightInput.click(); + await weightInput.fill('1'); + + // Click outside to trigger the update + await nodesSection.click(); + }); + + await test.step('verify pass_host is still "node" before saving', async () => { + const passHostSection = page.getByRole('group', { name: 'Pass Host' }); + const passHostField = passHostSection.getByRole('textbox', { + name: 'Pass Host', + exact: true, + }); + // This is the bug check - pass_host should still be "node" not reset to "pass" + await expect(passHostField).toHaveValue('node'); + }); + + await test.step('save and verify pass_host is preserved', async () => { + const saveBtn = page.getByRole('button', { name: 'Save' }); + await saveBtn.click(); + + await uiHasToastMsg(page, { + hasText: 'Edit Upstream Successfully', + }); + + // Verify we're back in detail view mode + await upstreamsPom.isDetailPage(page); + + const passHostSection = page.getByRole('group', { name: 'Pass Host' }); + const passHostField = passHostSection.getByRole('textbox', { + name: 'Pass Host', + exact: true, + }); + await expect(passHostField).toHaveValue('node'); + await expect(passHostField).toBeDisabled(); + }); + + await test.step('verify pass_host is preserved after page reload', async () => { + await page.reload(); + await page.waitForLoadState('load'); + await upstreamsPom.isDetailPage(page); + + const passHostSection = page.getByRole('group', { name: 'Pass Host' }); + const passHostField = passHostSection.getByRole('textbox', { + name: 'Pass Host', + exact: true, + }); + await expect(passHostField).toHaveValue('node'); + }); + + await test.step('delete upstream via UI', async () => { + // Navigate to list page first to avoid ambiguity with node delete buttons + await upstreamsPom.getUpstreamNavBtn(page).click(); + await upstreamsPom.isIndexPage(page); + + const row = page.getByRole('row', { name: upstreamName }); + await row.getByRole('button', { name: 'Delete' }).click(); + + await page + .getByRole('dialog', { name: 'Delete Upstream' }) + .getByRole('button', { name: 'Delete' }) + .click(); + + await uiHasToastMsg(page, { + hasText: 'Delete Upstream Successfully', + }); + await expect(page.getByRole('cell', { name: upstreamName })).toBeHidden(); + }); +}); + +/** + * Additional test to verify pass_host=rewrite is also preserved + */ +test('should preserve pass_host value "rewrite" when editing upstream nodes', async ({ + page, +}) => { + const upstreamName = randomId('test-pass-host-rewrite'); + + // Navigate to upstream add page + await upstreamsPom.toIndex(page); + await upstreamsPom.isIndexPage(page); + await upstreamsPom.getAddUpstreamBtn(page).click(); + await upstreamsPom.isAddPage(page); + + await test.step('create upstream with pass_host=rewrite via UI', async () => { + // Fill in the Name field + await page.getByLabel('Name', { exact: true }).fill(upstreamName); + + // Add a node + const nodesSection = page.getByRole('group', { name: 'Nodes' }); + const addNodeBtn = page.getByRole('button', { name: 'Add a Node' }); + + await addNodeBtn.click(); + const rows = nodesSection.locator('tr.ant-table-row'); + const firstRow = rows.first(); + await expect(firstRow).toBeVisible(); + + const hostInput = firstRow.locator('input').first(); + await hostInput.click(); + await hostInput.fill('my-service.svc'); + + // Click outside to trigger update + await nodesSection.click(); + + // Set pass_host to "rewrite" + const passHostSection = page.getByRole('group', { name: 'Pass Host' }); + await passHostSection.getByRole('textbox', { name: 'Pass Host' }).click(); + await page.getByRole('option', { name: 'rewrite' }).click(); + + // Fill upstream_host (required when pass_host is "rewrite") + await page.getByLabel('Upstream Host').fill('custom.host.example.com'); + + // Submit the form + await upstreamsPom.getAddBtn(page).click(); + await uiHasToastMsg(page, { + hasText: 'Add Upstream Successfully', + }); + }); + + await test.step('verify auto navigate to detail page', async () => { + await upstreamsPom.isDetailPage(page); + }); + + await test.step('verify initial values', async () => { + const passHostSection = page.getByRole('group', { name: 'Pass Host' }); + const passHostField = passHostSection.getByRole('textbox', { + name: 'Pass Host', + exact: true, + }); + await expect(passHostField).toHaveValue('rewrite'); + await expect(passHostField).toBeDisabled(); + + const upstreamHostField = page.getByLabel('Upstream Host'); + await expect(upstreamHostField).toHaveValue('custom.host.example.com'); + }); + + await test.step('edit and modify nodes', async () => { + await page.getByRole('button', { name: 'Edit' }).click(); + + const nodesSection = page.getByRole('group', { name: 'Nodes' }); + const rows = nodesSection.locator('tr.ant-table-row'); + const firstRow = rows.first(); + + // Modify the existing node's weight + const weightInput = firstRow.locator('input').nth(2); + await weightInput.click(); + await weightInput.fill('10'); + + // Click outside to trigger the update + await nodesSection.click(); + }); + + await test.step('verify values before saving', async () => { + const passHostSection = page.getByRole('group', { name: 'Pass Host' }); + const passHostField = passHostSection.getByRole('textbox', { + name: 'Pass Host', + exact: true, + }); + await expect(passHostField).toHaveValue('rewrite'); + + const upstreamHostField = page.getByLabel('Upstream Host'); + await expect(upstreamHostField).toHaveValue('custom.host.example.com'); + }); + + await test.step('save and verify values are preserved', async () => { + const saveBtn = page.getByRole('button', { name: 'Save' }); + await saveBtn.click(); + + await uiHasToastMsg(page, { + hasText: 'Edit Upstream Successfully', + }); + + const passHostSection = page.getByRole('group', { name: 'Pass Host' }); + const passHostField = passHostSection.getByRole('textbox', { + name: 'Pass Host', + exact: true, + }); + await expect(passHostField).toHaveValue('rewrite'); + }); + + await test.step('delete upstream via UI', async () => { + await upstreamsPom.getUpstreamNavBtn(page).click(); + await upstreamsPom.isIndexPage(page); + + const row = page.getByRole('row', { name: upstreamName }); + await row.getByRole('button', { name: 'Delete' }).click(); + + await page + .getByRole('dialog', { name: 'Delete Upstream' }) + .getByRole('button', { name: 'Delete' }) + .click(); + + await uiHasToastMsg(page, { + hasText: 'Delete Upstream Successfully', + }); + await expect(page.getByRole('cell', { name: upstreamName })).toBeHidden(); + }); +}); diff --git a/src/routes/routes/detail.$id.tsx b/src/routes/routes/detail.$id.tsx index ca49bf2de7..3f24266f83 100644 --- a/src/routes/routes/detail.$id.tsx +++ b/src/routes/routes/detail.$id.tsx @@ -62,12 +62,20 @@ const RouteDetailForm = (props: Props) => { const routeQuery = useQuery(getRouteQueryOptions(id)); const { data: routeData, isLoading, refetch } = routeQuery; + // Compute initial form values from route data + const formDefaults = routeData?.value + ? produceVarsToForm( + produceToUpstreamForm(routeData.value.upstream || {}, routeData.value) + ) + : undefined; + const form = useForm({ resolver: zodResolver(RoutePutSchema), shouldUnregister: true, shouldFocusError: true, mode: 'all', disabled: readOnly, + defaultValues: formDefaults, }); useEffect(() => { diff --git a/src/routes/services/detail.$id/index.tsx b/src/routes/services/detail.$id/index.tsx index e64f9188de..11261a9ad7 100644 --- a/src/routes/services/detail.$id/index.tsx +++ b/src/routes/services/detail.$id/index.tsx @@ -61,6 +61,7 @@ const ServiceDetailForm = (props: Props) => { shouldFocusError: true, mode: 'all', disabled: readOnly, + defaultValues: serviceData?.value, }); useEffect(() => { diff --git a/src/routes/stream_routes/detail.$id.tsx b/src/routes/stream_routes/detail.$id.tsx index 4abffa63d9..11c69a49b9 100644 --- a/src/routes/stream_routes/detail.$id.tsx +++ b/src/routes/stream_routes/detail.$id.tsx @@ -61,6 +61,7 @@ const StreamRouteDetailForm = (props: Props) => { shouldFocusError: true, mode: 'all', disabled: readOnly, + defaultValues: streamRouteData?.value, }); useEffect(() => { diff --git a/src/routes/upstreams/detail.$id.tsx b/src/routes/upstreams/detail.$id.tsx index ca5f8e9c42..a042592721 100644 --- a/src/routes/upstreams/detail.$id.tsx +++ b/src/routes/upstreams/detail.$id.tsx @@ -68,11 +68,13 @@ const UpstreamDetailForm = ( refetch, } = useSuspenseQuery(getUpstreamQueryOptions(id)); + const formDefaults = produceToUpstreamForm(upstreamData); const form = useForm({ resolver: zodResolver(FormPartUpstreamSchema), shouldUnregister: true, mode: 'all', disabled: readOnly, + defaultValues: formDefaults, }); const putUpstream = useMutation({ From 6143d34bcad1a67c825e1a831ce777a4826e9164 Mon Sep 17 00:00:00 2001 From: Deep Shekhar Singh Date: Wed, 4 Feb 2026 00:27:32 +0530 Subject: [PATCH 02/20] chore: update generated route tree --- src/routeTree.gen.ts | 1744 ++++++++++++++++++++++++------------------ 1 file changed, 1006 insertions(+), 738 deletions(-) diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts index bb344f0269..09bb7be2cc 100644 --- a/src/routeTree.gen.ts +++ b/src/routeTree.gen.ts @@ -8,620 +8,344 @@ // You should NOT make any changes in this file as it will be overwritten. // Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. -import { Route as rootRouteImport } from './routes/__root' -import { Route as IndexRouteImport } from './routes/index' -import { Route as UpstreamsIndexRouteImport } from './routes/upstreams/index' -import { Route as Stream_routesIndexRouteImport } from './routes/stream_routes/index' -import { Route as SslsIndexRouteImport } from './routes/ssls/index' -import { Route as ServicesIndexRouteImport } from './routes/services/index' -import { Route as SecretsIndexRouteImport } from './routes/secrets/index' -import { Route as RoutesIndexRouteImport } from './routes/routes/index' -import { Route as ProtosIndexRouteImport } from './routes/protos/index' -import { Route as Plugin_metadataIndexRouteImport } from './routes/plugin_metadata/index' -import { Route as Plugin_configsIndexRouteImport } from './routes/plugin_configs/index' -import { Route as Global_rulesIndexRouteImport } from './routes/global_rules/index' -import { Route as ConsumersIndexRouteImport } from './routes/consumers/index' -import { Route as Consumer_groupsIndexRouteImport } from './routes/consumer_groups/index' -import { Route as UpstreamsAddRouteImport } from './routes/upstreams/add' -import { Route as Stream_routesAddRouteImport } from './routes/stream_routes/add' -import { Route as SslsAddRouteImport } from './routes/ssls/add' -import { Route as ServicesAddRouteImport } from './routes/services/add' -import { Route as SecretsAddRouteImport } from './routes/secrets/add' -import { Route as RoutesAddRouteImport } from './routes/routes/add' -import { Route as ProtosAddRouteImport } from './routes/protos/add' -import { Route as Plugin_configsAddRouteImport } from './routes/plugin_configs/add' -import { Route as Global_rulesAddRouteImport } from './routes/global_rules/add' -import { Route as ConsumersAddRouteImport } from './routes/consumers/add' -import { Route as Consumer_groupsAddRouteImport } from './routes/consumer_groups/add' -import { Route as UpstreamsDetailIdRouteImport } from './routes/upstreams/detail.$id' -import { Route as Stream_routesDetailIdRouteImport } from './routes/stream_routes/detail.$id' -import { Route as SslsDetailIdRouteImport } from './routes/ssls/detail.$id' -import { Route as ServicesDetailIdRouteImport } from './routes/services/detail.$id' -import { Route as RoutesDetailIdRouteImport } from './routes/routes/detail.$id' -import { Route as ProtosDetailIdRouteImport } from './routes/protos/detail.$id' -import { Route as Plugin_configsDetailIdRouteImport } from './routes/plugin_configs/detail.$id' -import { Route as Global_rulesDetailIdRouteImport } from './routes/global_rules/detail.$id' -import { Route as ConsumersDetailUsernameRouteImport } from './routes/consumers/detail.$username' -import { Route as Consumer_groupsDetailIdRouteImport } from './routes/consumer_groups/detail.$id' -import { Route as ServicesDetailIdIndexRouteImport } from './routes/services/detail.$id/index' -import { Route as ConsumersDetailUsernameIndexRouteImport } from './routes/consumers/detail.$username/index' -import { Route as SecretsDetailManagerIdRouteImport } from './routes/secrets/detail.$manager.$id' -import { Route as ServicesDetailIdStream_routesIndexRouteImport } from './routes/services/detail.$id/stream_routes/index' -import { Route as ServicesDetailIdRoutesIndexRouteImport } from './routes/services/detail.$id/routes/index' -import { Route as ConsumersDetailUsernameCredentialsIndexRouteImport } from './routes/consumers/detail.$username/credentials/index' -import { Route as ServicesDetailIdStream_routesAddRouteImport } from './routes/services/detail.$id/stream_routes/add' -import { Route as ServicesDetailIdRoutesAddRouteImport } from './routes/services/detail.$id/routes/add' -import { Route as ConsumersDetailUsernameCredentialsAddRouteImport } from './routes/consumers/detail.$username/credentials/add' -import { Route as ServicesDetailIdStream_routesDetailRouteIdRouteImport } from './routes/services/detail.$id/stream_routes/detail.$routeId' -import { Route as ServicesDetailIdRoutesDetailRouteIdRouteImport } from './routes/services/detail.$id/routes/detail.$routeId' -import { Route as ConsumersDetailUsernameCredentialsDetailIdRouteImport } from './routes/consumers/detail.$username/credentials/detail.$id' - -const IndexRoute = IndexRouteImport.update({ +// Import Routes + +import { Route as rootRoute } from './routes/__root' +import { Route as IndexImport } from './routes/index' +import { Route as UpstreamsIndexImport } from './routes/upstreams/index' +import { Route as StreamroutesIndexImport } from './routes/stream_routes/index' +import { Route as SslsIndexImport } from './routes/ssls/index' +import { Route as ServicesIndexImport } from './routes/services/index' +import { Route as SecretsIndexImport } from './routes/secrets/index' +import { Route as RoutesIndexImport } from './routes/routes/index' +import { Route as ProtosIndexImport } from './routes/protos/index' +import { Route as PluginmetadataIndexImport } from './routes/plugin_metadata/index' +import { Route as PluginconfigsIndexImport } from './routes/plugin_configs/index' +import { Route as GlobalrulesIndexImport } from './routes/global_rules/index' +import { Route as ConsumersIndexImport } from './routes/consumers/index' +import { Route as ConsumergroupsIndexImport } from './routes/consumer_groups/index' +import { Route as UpstreamsAddImport } from './routes/upstreams/add' +import { Route as StreamroutesAddImport } from './routes/stream_routes/add' +import { Route as SslsAddImport } from './routes/ssls/add' +import { Route as ServicesAddImport } from './routes/services/add' +import { Route as SecretsAddImport } from './routes/secrets/add' +import { Route as RoutesAddImport } from './routes/routes/add' +import { Route as ProtosAddImport } from './routes/protos/add' +import { Route as PluginconfigsAddImport } from './routes/plugin_configs/add' +import { Route as GlobalrulesAddImport } from './routes/global_rules/add' +import { Route as ConsumersAddImport } from './routes/consumers/add' +import { Route as ConsumergroupsAddImport } from './routes/consumer_groups/add' +import { Route as UpstreamsDetailIdImport } from './routes/upstreams/detail.$id' +import { Route as StreamroutesDetailIdImport } from './routes/stream_routes/detail.$id' +import { Route as SslsDetailIdImport } from './routes/ssls/detail.$id' +import { Route as ServicesDetailIdImport } from './routes/services/detail.$id' +import { Route as RoutesDetailIdImport } from './routes/routes/detail.$id' +import { Route as ProtosDetailIdImport } from './routes/protos/detail.$id' +import { Route as PluginconfigsDetailIdImport } from './routes/plugin_configs/detail.$id' +import { Route as GlobalrulesDetailIdImport } from './routes/global_rules/detail.$id' +import { Route as ConsumersDetailUsernameImport } from './routes/consumers/detail.$username' +import { Route as ConsumergroupsDetailIdImport } from './routes/consumer_groups/detail.$id' +import { Route as ServicesDetailIdIndexImport } from './routes/services/detail.$id/index' +import { Route as ConsumersDetailUsernameIndexImport } from './routes/consumers/detail.$username/index' +import { Route as SecretsDetailManagerIdImport } from './routes/secrets/detail.$manager.$id' +import { Route as ServicesDetailIdStreamroutesIndexImport } from './routes/services/detail.$id/stream_routes/index' +import { Route as ServicesDetailIdRoutesIndexImport } from './routes/services/detail.$id/routes/index' +import { Route as ConsumersDetailUsernameCredentialsIndexImport } from './routes/consumers/detail.$username/credentials/index' +import { Route as ServicesDetailIdStreamroutesAddImport } from './routes/services/detail.$id/stream_routes/add' +import { Route as ServicesDetailIdRoutesAddImport } from './routes/services/detail.$id/routes/add' +import { Route as ConsumersDetailUsernameCredentialsAddImport } from './routes/consumers/detail.$username/credentials/add' +import { Route as ServicesDetailIdStreamroutesDetailRouteIdImport } from './routes/services/detail.$id/stream_routes/detail.$routeId' +import { Route as ServicesDetailIdRoutesDetailRouteIdImport } from './routes/services/detail.$id/routes/detail.$routeId' +import { Route as ConsumersDetailUsernameCredentialsDetailIdImport } from './routes/consumers/detail.$username/credentials/detail.$id' + +// Create/Update Routes + +const IndexRoute = IndexImport.update({ id: '/', path: '/', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const UpstreamsIndexRoute = UpstreamsIndexRouteImport.update({ + +const UpstreamsIndexRoute = UpstreamsIndexImport.update({ id: '/upstreams/', path: '/upstreams/', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const Stream_routesIndexRoute = Stream_routesIndexRouteImport.update({ + +const StreamroutesIndexRoute = StreamroutesIndexImport.update({ id: '/stream_routes/', path: '/stream_routes/', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const SslsIndexRoute = SslsIndexRouteImport.update({ + +const SslsIndexRoute = SslsIndexImport.update({ id: '/ssls/', path: '/ssls/', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const ServicesIndexRoute = ServicesIndexRouteImport.update({ + +const ServicesIndexRoute = ServicesIndexImport.update({ id: '/services/', path: '/services/', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const SecretsIndexRoute = SecretsIndexRouteImport.update({ + +const SecretsIndexRoute = SecretsIndexImport.update({ id: '/secrets/', path: '/secrets/', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const RoutesIndexRoute = RoutesIndexRouteImport.update({ + +const RoutesIndexRoute = RoutesIndexImport.update({ id: '/routes/', path: '/routes/', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const ProtosIndexRoute = ProtosIndexRouteImport.update({ + +const ProtosIndexRoute = ProtosIndexImport.update({ id: '/protos/', path: '/protos/', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const Plugin_metadataIndexRoute = Plugin_metadataIndexRouteImport.update({ + +const PluginmetadataIndexRoute = PluginmetadataIndexImport.update({ id: '/plugin_metadata/', path: '/plugin_metadata/', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const Plugin_configsIndexRoute = Plugin_configsIndexRouteImport.update({ + +const PluginconfigsIndexRoute = PluginconfigsIndexImport.update({ id: '/plugin_configs/', path: '/plugin_configs/', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const Global_rulesIndexRoute = Global_rulesIndexRouteImport.update({ + +const GlobalrulesIndexRoute = GlobalrulesIndexImport.update({ id: '/global_rules/', path: '/global_rules/', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const ConsumersIndexRoute = ConsumersIndexRouteImport.update({ + +const ConsumersIndexRoute = ConsumersIndexImport.update({ id: '/consumers/', path: '/consumers/', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const Consumer_groupsIndexRoute = Consumer_groupsIndexRouteImport.update({ + +const ConsumergroupsIndexRoute = ConsumergroupsIndexImport.update({ id: '/consumer_groups/', path: '/consumer_groups/', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const UpstreamsAddRoute = UpstreamsAddRouteImport.update({ + +const UpstreamsAddRoute = UpstreamsAddImport.update({ id: '/upstreams/add', path: '/upstreams/add', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const Stream_routesAddRoute = Stream_routesAddRouteImport.update({ + +const StreamroutesAddRoute = StreamroutesAddImport.update({ id: '/stream_routes/add', path: '/stream_routes/add', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const SslsAddRoute = SslsAddRouteImport.update({ + +const SslsAddRoute = SslsAddImport.update({ id: '/ssls/add', path: '/ssls/add', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const ServicesAddRoute = ServicesAddRouteImport.update({ + +const ServicesAddRoute = ServicesAddImport.update({ id: '/services/add', path: '/services/add', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const SecretsAddRoute = SecretsAddRouteImport.update({ + +const SecretsAddRoute = SecretsAddImport.update({ id: '/secrets/add', path: '/secrets/add', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const RoutesAddRoute = RoutesAddRouteImport.update({ + +const RoutesAddRoute = RoutesAddImport.update({ id: '/routes/add', path: '/routes/add', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const ProtosAddRoute = ProtosAddRouteImport.update({ + +const ProtosAddRoute = ProtosAddImport.update({ id: '/protos/add', path: '/protos/add', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const Plugin_configsAddRoute = Plugin_configsAddRouteImport.update({ + +const PluginconfigsAddRoute = PluginconfigsAddImport.update({ id: '/plugin_configs/add', path: '/plugin_configs/add', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const Global_rulesAddRoute = Global_rulesAddRouteImport.update({ + +const GlobalrulesAddRoute = GlobalrulesAddImport.update({ id: '/global_rules/add', path: '/global_rules/add', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const ConsumersAddRoute = ConsumersAddRouteImport.update({ + +const ConsumersAddRoute = ConsumersAddImport.update({ id: '/consumers/add', path: '/consumers/add', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const Consumer_groupsAddRoute = Consumer_groupsAddRouteImport.update({ + +const ConsumergroupsAddRoute = ConsumergroupsAddImport.update({ id: '/consumer_groups/add', path: '/consumer_groups/add', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const UpstreamsDetailIdRoute = UpstreamsDetailIdRouteImport.update({ + +const UpstreamsDetailIdRoute = UpstreamsDetailIdImport.update({ id: '/upstreams/detail/$id', path: '/upstreams/detail/$id', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const Stream_routesDetailIdRoute = Stream_routesDetailIdRouteImport.update({ + +const StreamroutesDetailIdRoute = StreamroutesDetailIdImport.update({ id: '/stream_routes/detail/$id', path: '/stream_routes/detail/$id', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const SslsDetailIdRoute = SslsDetailIdRouteImport.update({ + +const SslsDetailIdRoute = SslsDetailIdImport.update({ id: '/ssls/detail/$id', path: '/ssls/detail/$id', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const ServicesDetailIdRoute = ServicesDetailIdRouteImport.update({ + +const ServicesDetailIdRoute = ServicesDetailIdImport.update({ id: '/services/detail/$id', path: '/services/detail/$id', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const RoutesDetailIdRoute = RoutesDetailIdRouteImport.update({ + +const RoutesDetailIdRoute = RoutesDetailIdImport.update({ id: '/routes/detail/$id', path: '/routes/detail/$id', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const ProtosDetailIdRoute = ProtosDetailIdRouteImport.update({ + +const ProtosDetailIdRoute = ProtosDetailIdImport.update({ id: '/protos/detail/$id', path: '/protos/detail/$id', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const Plugin_configsDetailIdRoute = Plugin_configsDetailIdRouteImport.update({ + +const PluginconfigsDetailIdRoute = PluginconfigsDetailIdImport.update({ id: '/plugin_configs/detail/$id', path: '/plugin_configs/detail/$id', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const Global_rulesDetailIdRoute = Global_rulesDetailIdRouteImport.update({ + +const GlobalrulesDetailIdRoute = GlobalrulesDetailIdImport.update({ id: '/global_rules/detail/$id', path: '/global_rules/detail/$id', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const ConsumersDetailUsernameRoute = ConsumersDetailUsernameRouteImport.update({ + +const ConsumersDetailUsernameRoute = ConsumersDetailUsernameImport.update({ id: '/consumers/detail/$username', path: '/consumers/detail/$username', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const Consumer_groupsDetailIdRoute = Consumer_groupsDetailIdRouteImport.update({ + +const ConsumergroupsDetailIdRoute = ConsumergroupsDetailIdImport.update({ id: '/consumer_groups/detail/$id', path: '/consumer_groups/detail/$id', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const ServicesDetailIdIndexRoute = ServicesDetailIdIndexRouteImport.update({ + +const ServicesDetailIdIndexRoute = ServicesDetailIdIndexImport.update({ id: '/', path: '/', getParentRoute: () => ServicesDetailIdRoute, } as any) + const ConsumersDetailUsernameIndexRoute = - ConsumersDetailUsernameIndexRouteImport.update({ + ConsumersDetailUsernameIndexImport.update({ id: '/', path: '/', getParentRoute: () => ConsumersDetailUsernameRoute, } as any) -const SecretsDetailManagerIdRoute = SecretsDetailManagerIdRouteImport.update({ + +const SecretsDetailManagerIdRoute = SecretsDetailManagerIdImport.update({ id: '/secrets/detail/$manager/$id', path: '/secrets/detail/$manager/$id', - getParentRoute: () => rootRouteImport, + getParentRoute: () => rootRoute, } as any) -const ServicesDetailIdStream_routesIndexRoute = - ServicesDetailIdStream_routesIndexRouteImport.update({ + +const ServicesDetailIdStreamroutesIndexRoute = + ServicesDetailIdStreamroutesIndexImport.update({ id: '/stream_routes/', path: '/stream_routes/', getParentRoute: () => ServicesDetailIdRoute, } as any) + const ServicesDetailIdRoutesIndexRoute = - ServicesDetailIdRoutesIndexRouteImport.update({ + ServicesDetailIdRoutesIndexImport.update({ id: '/routes/', path: '/routes/', getParentRoute: () => ServicesDetailIdRoute, } as any) + const ConsumersDetailUsernameCredentialsIndexRoute = - ConsumersDetailUsernameCredentialsIndexRouteImport.update({ + ConsumersDetailUsernameCredentialsIndexImport.update({ id: '/credentials/', path: '/credentials/', getParentRoute: () => ConsumersDetailUsernameRoute, } as any) -const ServicesDetailIdStream_routesAddRoute = - ServicesDetailIdStream_routesAddRouteImport.update({ + +const ServicesDetailIdStreamroutesAddRoute = + ServicesDetailIdStreamroutesAddImport.update({ id: '/stream_routes/add', path: '/stream_routes/add', getParentRoute: () => ServicesDetailIdRoute, } as any) -const ServicesDetailIdRoutesAddRoute = - ServicesDetailIdRoutesAddRouteImport.update({ - id: '/routes/add', - path: '/routes/add', - getParentRoute: () => ServicesDetailIdRoute, - } as any) + +const ServicesDetailIdRoutesAddRoute = ServicesDetailIdRoutesAddImport.update({ + id: '/routes/add', + path: '/routes/add', + getParentRoute: () => ServicesDetailIdRoute, +} as any) + const ConsumersDetailUsernameCredentialsAddRoute = - ConsumersDetailUsernameCredentialsAddRouteImport.update({ + ConsumersDetailUsernameCredentialsAddImport.update({ id: '/credentials/add', path: '/credentials/add', getParentRoute: () => ConsumersDetailUsernameRoute, } as any) -const ServicesDetailIdStream_routesDetailRouteIdRoute = - ServicesDetailIdStream_routesDetailRouteIdRouteImport.update({ + +const ServicesDetailIdStreamroutesDetailRouteIdRoute = + ServicesDetailIdStreamroutesDetailRouteIdImport.update({ id: '/stream_routes/detail/$routeId', path: '/stream_routes/detail/$routeId', getParentRoute: () => ServicesDetailIdRoute, } as any) + const ServicesDetailIdRoutesDetailRouteIdRoute = - ServicesDetailIdRoutesDetailRouteIdRouteImport.update({ + ServicesDetailIdRoutesDetailRouteIdImport.update({ id: '/routes/detail/$routeId', path: '/routes/detail/$routeId', getParentRoute: () => ServicesDetailIdRoute, } as any) + const ConsumersDetailUsernameCredentialsDetailIdRoute = - ConsumersDetailUsernameCredentialsDetailIdRouteImport.update({ + ConsumersDetailUsernameCredentialsDetailIdImport.update({ id: '/credentials/detail/$id', path: '/credentials/detail/$id', getParentRoute: () => ConsumersDetailUsernameRoute, } as any) -export interface FileRoutesByFullPath { - '/': typeof IndexRoute - '/consumer_groups/add': typeof Consumer_groupsAddRoute - '/consumers/add': typeof ConsumersAddRoute - '/global_rules/add': typeof Global_rulesAddRoute - '/plugin_configs/add': typeof Plugin_configsAddRoute - '/protos/add': typeof ProtosAddRoute - '/routes/add': typeof RoutesAddRoute - '/secrets/add': typeof SecretsAddRoute - '/services/add': typeof ServicesAddRoute - '/ssls/add': typeof SslsAddRoute - '/stream_routes/add': typeof Stream_routesAddRoute - '/upstreams/add': typeof UpstreamsAddRoute - '/consumer_groups': typeof Consumer_groupsIndexRoute - '/consumers': typeof ConsumersIndexRoute - '/global_rules': typeof Global_rulesIndexRoute - '/plugin_configs': typeof Plugin_configsIndexRoute - '/plugin_metadata': typeof Plugin_metadataIndexRoute - '/protos': typeof ProtosIndexRoute - '/routes': typeof RoutesIndexRoute - '/secrets': typeof SecretsIndexRoute - '/services': typeof ServicesIndexRoute - '/ssls': typeof SslsIndexRoute - '/stream_routes': typeof Stream_routesIndexRoute - '/upstreams': typeof UpstreamsIndexRoute - '/consumer_groups/detail/$id': typeof Consumer_groupsDetailIdRoute - '/consumers/detail/$username': typeof ConsumersDetailUsernameRouteWithChildren - '/global_rules/detail/$id': typeof Global_rulesDetailIdRoute - '/plugin_configs/detail/$id': typeof Plugin_configsDetailIdRoute - '/protos/detail/$id': typeof ProtosDetailIdRoute - '/routes/detail/$id': typeof RoutesDetailIdRoute - '/services/detail/$id': typeof ServicesDetailIdRouteWithChildren - '/ssls/detail/$id': typeof SslsDetailIdRoute - '/stream_routes/detail/$id': typeof Stream_routesDetailIdRoute - '/upstreams/detail/$id': typeof UpstreamsDetailIdRoute - '/secrets/detail/$manager/$id': typeof SecretsDetailManagerIdRoute - '/consumers/detail/$username/': typeof ConsumersDetailUsernameIndexRoute - '/services/detail/$id/': typeof ServicesDetailIdIndexRoute - '/consumers/detail/$username/credentials/add': typeof ConsumersDetailUsernameCredentialsAddRoute - '/services/detail/$id/routes/add': typeof ServicesDetailIdRoutesAddRoute - '/services/detail/$id/stream_routes/add': typeof ServicesDetailIdStream_routesAddRoute - '/consumers/detail/$username/credentials': typeof ConsumersDetailUsernameCredentialsIndexRoute - '/services/detail/$id/routes': typeof ServicesDetailIdRoutesIndexRoute - '/services/detail/$id/stream_routes': typeof ServicesDetailIdStream_routesIndexRoute - '/consumers/detail/$username/credentials/detail/$id': typeof ConsumersDetailUsernameCredentialsDetailIdRoute - '/services/detail/$id/routes/detail/$routeId': typeof ServicesDetailIdRoutesDetailRouteIdRoute - '/services/detail/$id/stream_routes/detail/$routeId': typeof ServicesDetailIdStream_routesDetailRouteIdRoute -} -export interface FileRoutesByTo { - '/': typeof IndexRoute - '/consumer_groups/add': typeof Consumer_groupsAddRoute - '/consumers/add': typeof ConsumersAddRoute - '/global_rules/add': typeof Global_rulesAddRoute - '/plugin_configs/add': typeof Plugin_configsAddRoute - '/protos/add': typeof ProtosAddRoute - '/routes/add': typeof RoutesAddRoute - '/secrets/add': typeof SecretsAddRoute - '/services/add': typeof ServicesAddRoute - '/ssls/add': typeof SslsAddRoute - '/stream_routes/add': typeof Stream_routesAddRoute - '/upstreams/add': typeof UpstreamsAddRoute - '/consumer_groups': typeof Consumer_groupsIndexRoute - '/consumers': typeof ConsumersIndexRoute - '/global_rules': typeof Global_rulesIndexRoute - '/plugin_configs': typeof Plugin_configsIndexRoute - '/plugin_metadata': typeof Plugin_metadataIndexRoute - '/protos': typeof ProtosIndexRoute - '/routes': typeof RoutesIndexRoute - '/secrets': typeof SecretsIndexRoute - '/services': typeof ServicesIndexRoute - '/ssls': typeof SslsIndexRoute - '/stream_routes': typeof Stream_routesIndexRoute - '/upstreams': typeof UpstreamsIndexRoute - '/consumer_groups/detail/$id': typeof Consumer_groupsDetailIdRoute - '/global_rules/detail/$id': typeof Global_rulesDetailIdRoute - '/plugin_configs/detail/$id': typeof Plugin_configsDetailIdRoute - '/protos/detail/$id': typeof ProtosDetailIdRoute - '/routes/detail/$id': typeof RoutesDetailIdRoute - '/ssls/detail/$id': typeof SslsDetailIdRoute - '/stream_routes/detail/$id': typeof Stream_routesDetailIdRoute - '/upstreams/detail/$id': typeof UpstreamsDetailIdRoute - '/secrets/detail/$manager/$id': typeof SecretsDetailManagerIdRoute - '/consumers/detail/$username': typeof ConsumersDetailUsernameIndexRoute - '/services/detail/$id': typeof ServicesDetailIdIndexRoute - '/consumers/detail/$username/credentials/add': typeof ConsumersDetailUsernameCredentialsAddRoute - '/services/detail/$id/routes/add': typeof ServicesDetailIdRoutesAddRoute - '/services/detail/$id/stream_routes/add': typeof ServicesDetailIdStream_routesAddRoute - '/consumers/detail/$username/credentials': typeof ConsumersDetailUsernameCredentialsIndexRoute - '/services/detail/$id/routes': typeof ServicesDetailIdRoutesIndexRoute - '/services/detail/$id/stream_routes': typeof ServicesDetailIdStream_routesIndexRoute - '/consumers/detail/$username/credentials/detail/$id': typeof ConsumersDetailUsernameCredentialsDetailIdRoute - '/services/detail/$id/routes/detail/$routeId': typeof ServicesDetailIdRoutesDetailRouteIdRoute - '/services/detail/$id/stream_routes/detail/$routeId': typeof ServicesDetailIdStream_routesDetailRouteIdRoute -} -export interface FileRoutesById { - __root__: typeof rootRouteImport - '/': typeof IndexRoute - '/consumer_groups/add': typeof Consumer_groupsAddRoute - '/consumers/add': typeof ConsumersAddRoute - '/global_rules/add': typeof Global_rulesAddRoute - '/plugin_configs/add': typeof Plugin_configsAddRoute - '/protos/add': typeof ProtosAddRoute - '/routes/add': typeof RoutesAddRoute - '/secrets/add': typeof SecretsAddRoute - '/services/add': typeof ServicesAddRoute - '/ssls/add': typeof SslsAddRoute - '/stream_routes/add': typeof Stream_routesAddRoute - '/upstreams/add': typeof UpstreamsAddRoute - '/consumer_groups/': typeof Consumer_groupsIndexRoute - '/consumers/': typeof ConsumersIndexRoute - '/global_rules/': typeof Global_rulesIndexRoute - '/plugin_configs/': typeof Plugin_configsIndexRoute - '/plugin_metadata/': typeof Plugin_metadataIndexRoute - '/protos/': typeof ProtosIndexRoute - '/routes/': typeof RoutesIndexRoute - '/secrets/': typeof SecretsIndexRoute - '/services/': typeof ServicesIndexRoute - '/ssls/': typeof SslsIndexRoute - '/stream_routes/': typeof Stream_routesIndexRoute - '/upstreams/': typeof UpstreamsIndexRoute - '/consumer_groups/detail/$id': typeof Consumer_groupsDetailIdRoute - '/consumers/detail/$username': typeof ConsumersDetailUsernameRouteWithChildren - '/global_rules/detail/$id': typeof Global_rulesDetailIdRoute - '/plugin_configs/detail/$id': typeof Plugin_configsDetailIdRoute - '/protos/detail/$id': typeof ProtosDetailIdRoute - '/routes/detail/$id': typeof RoutesDetailIdRoute - '/services/detail/$id': typeof ServicesDetailIdRouteWithChildren - '/ssls/detail/$id': typeof SslsDetailIdRoute - '/stream_routes/detail/$id': typeof Stream_routesDetailIdRoute - '/upstreams/detail/$id': typeof UpstreamsDetailIdRoute - '/secrets/detail/$manager/$id': typeof SecretsDetailManagerIdRoute - '/consumers/detail/$username/': typeof ConsumersDetailUsernameIndexRoute - '/services/detail/$id/': typeof ServicesDetailIdIndexRoute - '/consumers/detail/$username/credentials/add': typeof ConsumersDetailUsernameCredentialsAddRoute - '/services/detail/$id/routes/add': typeof ServicesDetailIdRoutesAddRoute - '/services/detail/$id/stream_routes/add': typeof ServicesDetailIdStream_routesAddRoute - '/consumers/detail/$username/credentials/': typeof ConsumersDetailUsernameCredentialsIndexRoute - '/services/detail/$id/routes/': typeof ServicesDetailIdRoutesIndexRoute - '/services/detail/$id/stream_routes/': typeof ServicesDetailIdStream_routesIndexRoute - '/consumers/detail/$username/credentials/detail/$id': typeof ConsumersDetailUsernameCredentialsDetailIdRoute - '/services/detail/$id/routes/detail/$routeId': typeof ServicesDetailIdRoutesDetailRouteIdRoute - '/services/detail/$id/stream_routes/detail/$routeId': typeof ServicesDetailIdStream_routesDetailRouteIdRoute -} -export interface FileRouteTypes { - fileRoutesByFullPath: FileRoutesByFullPath - fullPaths: - | '/' - | '/consumer_groups/add' - | '/consumers/add' - | '/global_rules/add' - | '/plugin_configs/add' - | '/protos/add' - | '/routes/add' - | '/secrets/add' - | '/services/add' - | '/ssls/add' - | '/stream_routes/add' - | '/upstreams/add' - | '/consumer_groups' - | '/consumers' - | '/global_rules' - | '/plugin_configs' - | '/plugin_metadata' - | '/protos' - | '/routes' - | '/secrets' - | '/services' - | '/ssls' - | '/stream_routes' - | '/upstreams' - | '/consumer_groups/detail/$id' - | '/consumers/detail/$username' - | '/global_rules/detail/$id' - | '/plugin_configs/detail/$id' - | '/protos/detail/$id' - | '/routes/detail/$id' - | '/services/detail/$id' - | '/ssls/detail/$id' - | '/stream_routes/detail/$id' - | '/upstreams/detail/$id' - | '/secrets/detail/$manager/$id' - | '/consumers/detail/$username/' - | '/services/detail/$id/' - | '/consumers/detail/$username/credentials/add' - | '/services/detail/$id/routes/add' - | '/services/detail/$id/stream_routes/add' - | '/consumers/detail/$username/credentials' - | '/services/detail/$id/routes' - | '/services/detail/$id/stream_routes' - | '/consumers/detail/$username/credentials/detail/$id' - | '/services/detail/$id/routes/detail/$routeId' - | '/services/detail/$id/stream_routes/detail/$routeId' - fileRoutesByTo: FileRoutesByTo - to: - | '/' - | '/consumer_groups/add' - | '/consumers/add' - | '/global_rules/add' - | '/plugin_configs/add' - | '/protos/add' - | '/routes/add' - | '/secrets/add' - | '/services/add' - | '/ssls/add' - | '/stream_routes/add' - | '/upstreams/add' - | '/consumer_groups' - | '/consumers' - | '/global_rules' - | '/plugin_configs' - | '/plugin_metadata' - | '/protos' - | '/routes' - | '/secrets' - | '/services' - | '/ssls' - | '/stream_routes' - | '/upstreams' - | '/consumer_groups/detail/$id' - | '/global_rules/detail/$id' - | '/plugin_configs/detail/$id' - | '/protos/detail/$id' - | '/routes/detail/$id' - | '/ssls/detail/$id' - | '/stream_routes/detail/$id' - | '/upstreams/detail/$id' - | '/secrets/detail/$manager/$id' - | '/consumers/detail/$username' - | '/services/detail/$id' - | '/consumers/detail/$username/credentials/add' - | '/services/detail/$id/routes/add' - | '/services/detail/$id/stream_routes/add' - | '/consumers/detail/$username/credentials' - | '/services/detail/$id/routes' - | '/services/detail/$id/stream_routes' - | '/consumers/detail/$username/credentials/detail/$id' - | '/services/detail/$id/routes/detail/$routeId' - | '/services/detail/$id/stream_routes/detail/$routeId' - id: - | '__root__' - | '/' - | '/consumer_groups/add' - | '/consumers/add' - | '/global_rules/add' - | '/plugin_configs/add' - | '/protos/add' - | '/routes/add' - | '/secrets/add' - | '/services/add' - | '/ssls/add' - | '/stream_routes/add' - | '/upstreams/add' - | '/consumer_groups/' - | '/consumers/' - | '/global_rules/' - | '/plugin_configs/' - | '/plugin_metadata/' - | '/protos/' - | '/routes/' - | '/secrets/' - | '/services/' - | '/ssls/' - | '/stream_routes/' - | '/upstreams/' - | '/consumer_groups/detail/$id' - | '/consumers/detail/$username' - | '/global_rules/detail/$id' - | '/plugin_configs/detail/$id' - | '/protos/detail/$id' - | '/routes/detail/$id' - | '/services/detail/$id' - | '/ssls/detail/$id' - | '/stream_routes/detail/$id' - | '/upstreams/detail/$id' - | '/secrets/detail/$manager/$id' - | '/consumers/detail/$username/' - | '/services/detail/$id/' - | '/consumers/detail/$username/credentials/add' - | '/services/detail/$id/routes/add' - | '/services/detail/$id/stream_routes/add' - | '/consumers/detail/$username/credentials/' - | '/services/detail/$id/routes/' - | '/services/detail/$id/stream_routes/' - | '/consumers/detail/$username/credentials/detail/$id' - | '/services/detail/$id/routes/detail/$routeId' - | '/services/detail/$id/stream_routes/detail/$routeId' - fileRoutesById: FileRoutesById -} -export interface RootRouteChildren { - IndexRoute: typeof IndexRoute - Consumer_groupsAddRoute: typeof Consumer_groupsAddRoute - ConsumersAddRoute: typeof ConsumersAddRoute - Global_rulesAddRoute: typeof Global_rulesAddRoute - Plugin_configsAddRoute: typeof Plugin_configsAddRoute - ProtosAddRoute: typeof ProtosAddRoute - RoutesAddRoute: typeof RoutesAddRoute - SecretsAddRoute: typeof SecretsAddRoute - ServicesAddRoute: typeof ServicesAddRoute - SslsAddRoute: typeof SslsAddRoute - Stream_routesAddRoute: typeof Stream_routesAddRoute - UpstreamsAddRoute: typeof UpstreamsAddRoute - Consumer_groupsIndexRoute: typeof Consumer_groupsIndexRoute - ConsumersIndexRoute: typeof ConsumersIndexRoute - Global_rulesIndexRoute: typeof Global_rulesIndexRoute - Plugin_configsIndexRoute: typeof Plugin_configsIndexRoute - Plugin_metadataIndexRoute: typeof Plugin_metadataIndexRoute - ProtosIndexRoute: typeof ProtosIndexRoute - RoutesIndexRoute: typeof RoutesIndexRoute - SecretsIndexRoute: typeof SecretsIndexRoute - ServicesIndexRoute: typeof ServicesIndexRoute - SslsIndexRoute: typeof SslsIndexRoute - Stream_routesIndexRoute: typeof Stream_routesIndexRoute - UpstreamsIndexRoute: typeof UpstreamsIndexRoute - Consumer_groupsDetailIdRoute: typeof Consumer_groupsDetailIdRoute - ConsumersDetailUsernameRoute: typeof ConsumersDetailUsernameRouteWithChildren - Global_rulesDetailIdRoute: typeof Global_rulesDetailIdRoute - Plugin_configsDetailIdRoute: typeof Plugin_configsDetailIdRoute - ProtosDetailIdRoute: typeof ProtosDetailIdRoute - RoutesDetailIdRoute: typeof RoutesDetailIdRoute - ServicesDetailIdRoute: typeof ServicesDetailIdRouteWithChildren - SslsDetailIdRoute: typeof SslsDetailIdRoute - Stream_routesDetailIdRoute: typeof Stream_routesDetailIdRoute - UpstreamsDetailIdRoute: typeof UpstreamsDetailIdRoute - SecretsDetailManagerIdRoute: typeof SecretsDetailManagerIdRoute -} +// Populate the FileRoutesByPath interface declare module '@tanstack/react-router' { interface FileRoutesByPath { @@ -629,327 +353,329 @@ declare module '@tanstack/react-router' { id: '/' path: '/' fullPath: '/' - preLoaderRoute: typeof IndexRouteImport - parentRoute: typeof rootRouteImport + preLoaderRoute: typeof IndexImport + parentRoute: typeof rootRoute } - '/upstreams/': { - id: '/upstreams/' - path: '/upstreams' - fullPath: '/upstreams' - preLoaderRoute: typeof UpstreamsIndexRouteImport - parentRoute: typeof rootRouteImport + '/consumer_groups/add': { + id: '/consumer_groups/add' + path: '/consumer_groups/add' + fullPath: '/consumer_groups/add' + preLoaderRoute: typeof ConsumergroupsAddImport + parentRoute: typeof rootRoute } - '/stream_routes/': { - id: '/stream_routes/' - path: '/stream_routes' - fullPath: '/stream_routes' - preLoaderRoute: typeof Stream_routesIndexRouteImport - parentRoute: typeof rootRouteImport + '/consumers/add': { + id: '/consumers/add' + path: '/consumers/add' + fullPath: '/consumers/add' + preLoaderRoute: typeof ConsumersAddImport + parentRoute: typeof rootRoute } - '/ssls/': { - id: '/ssls/' - path: '/ssls' - fullPath: '/ssls' - preLoaderRoute: typeof SslsIndexRouteImport - parentRoute: typeof rootRouteImport + '/global_rules/add': { + id: '/global_rules/add' + path: '/global_rules/add' + fullPath: '/global_rules/add' + preLoaderRoute: typeof GlobalrulesAddImport + parentRoute: typeof rootRoute } - '/services/': { - id: '/services/' - path: '/services' - fullPath: '/services' - preLoaderRoute: typeof ServicesIndexRouteImport - parentRoute: typeof rootRouteImport + '/plugin_configs/add': { + id: '/plugin_configs/add' + path: '/plugin_configs/add' + fullPath: '/plugin_configs/add' + preLoaderRoute: typeof PluginconfigsAddImport + parentRoute: typeof rootRoute } - '/secrets/': { - id: '/secrets/' - path: '/secrets' - fullPath: '/secrets' - preLoaderRoute: typeof SecretsIndexRouteImport - parentRoute: typeof rootRouteImport + '/protos/add': { + id: '/protos/add' + path: '/protos/add' + fullPath: '/protos/add' + preLoaderRoute: typeof ProtosAddImport + parentRoute: typeof rootRoute } - '/routes/': { - id: '/routes/' - path: '/routes' - fullPath: '/routes' - preLoaderRoute: typeof RoutesIndexRouteImport - parentRoute: typeof rootRouteImport + '/routes/add': { + id: '/routes/add' + path: '/routes/add' + fullPath: '/routes/add' + preLoaderRoute: typeof RoutesAddImport + parentRoute: typeof rootRoute } - '/protos/': { - id: '/protos/' - path: '/protos' - fullPath: '/protos' - preLoaderRoute: typeof ProtosIndexRouteImport - parentRoute: typeof rootRouteImport + '/secrets/add': { + id: '/secrets/add' + path: '/secrets/add' + fullPath: '/secrets/add' + preLoaderRoute: typeof SecretsAddImport + parentRoute: typeof rootRoute } - '/plugin_metadata/': { - id: '/plugin_metadata/' - path: '/plugin_metadata' - fullPath: '/plugin_metadata' - preLoaderRoute: typeof Plugin_metadataIndexRouteImport - parentRoute: typeof rootRouteImport + '/services/add': { + id: '/services/add' + path: '/services/add' + fullPath: '/services/add' + preLoaderRoute: typeof ServicesAddImport + parentRoute: typeof rootRoute } - '/plugin_configs/': { - id: '/plugin_configs/' - path: '/plugin_configs' - fullPath: '/plugin_configs' - preLoaderRoute: typeof Plugin_configsIndexRouteImport - parentRoute: typeof rootRouteImport + '/ssls/add': { + id: '/ssls/add' + path: '/ssls/add' + fullPath: '/ssls/add' + preLoaderRoute: typeof SslsAddImport + parentRoute: typeof rootRoute } - '/global_rules/': { - id: '/global_rules/' - path: '/global_rules' - fullPath: '/global_rules' - preLoaderRoute: typeof Global_rulesIndexRouteImport - parentRoute: typeof rootRouteImport + '/stream_routes/add': { + id: '/stream_routes/add' + path: '/stream_routes/add' + fullPath: '/stream_routes/add' + preLoaderRoute: typeof StreamroutesAddImport + parentRoute: typeof rootRoute } - '/consumers/': { - id: '/consumers/' - path: '/consumers' - fullPath: '/consumers' - preLoaderRoute: typeof ConsumersIndexRouteImport - parentRoute: typeof rootRouteImport + '/upstreams/add': { + id: '/upstreams/add' + path: '/upstreams/add' + fullPath: '/upstreams/add' + preLoaderRoute: typeof UpstreamsAddImport + parentRoute: typeof rootRoute } '/consumer_groups/': { id: '/consumer_groups/' path: '/consumer_groups' fullPath: '/consumer_groups' - preLoaderRoute: typeof Consumer_groupsIndexRouteImport - parentRoute: typeof rootRouteImport + preLoaderRoute: typeof ConsumergroupsIndexImport + parentRoute: typeof rootRoute } - '/upstreams/add': { - id: '/upstreams/add' - path: '/upstreams/add' - fullPath: '/upstreams/add' - preLoaderRoute: typeof UpstreamsAddRouteImport - parentRoute: typeof rootRouteImport + '/consumers/': { + id: '/consumers/' + path: '/consumers' + fullPath: '/consumers' + preLoaderRoute: typeof ConsumersIndexImport + parentRoute: typeof rootRoute } - '/stream_routes/add': { - id: '/stream_routes/add' - path: '/stream_routes/add' - fullPath: '/stream_routes/add' - preLoaderRoute: typeof Stream_routesAddRouteImport - parentRoute: typeof rootRouteImport + '/global_rules/': { + id: '/global_rules/' + path: '/global_rules' + fullPath: '/global_rules' + preLoaderRoute: typeof GlobalrulesIndexImport + parentRoute: typeof rootRoute } - '/ssls/add': { - id: '/ssls/add' - path: '/ssls/add' - fullPath: '/ssls/add' - preLoaderRoute: typeof SslsAddRouteImport - parentRoute: typeof rootRouteImport + '/plugin_configs/': { + id: '/plugin_configs/' + path: '/plugin_configs' + fullPath: '/plugin_configs' + preLoaderRoute: typeof PluginconfigsIndexImport + parentRoute: typeof rootRoute } - '/services/add': { - id: '/services/add' - path: '/services/add' - fullPath: '/services/add' - preLoaderRoute: typeof ServicesAddRouteImport - parentRoute: typeof rootRouteImport + '/plugin_metadata/': { + id: '/plugin_metadata/' + path: '/plugin_metadata' + fullPath: '/plugin_metadata' + preLoaderRoute: typeof PluginmetadataIndexImport + parentRoute: typeof rootRoute } - '/secrets/add': { - id: '/secrets/add' - path: '/secrets/add' - fullPath: '/secrets/add' - preLoaderRoute: typeof SecretsAddRouteImport - parentRoute: typeof rootRouteImport + '/protos/': { + id: '/protos/' + path: '/protos' + fullPath: '/protos' + preLoaderRoute: typeof ProtosIndexImport + parentRoute: typeof rootRoute } - '/routes/add': { - id: '/routes/add' - path: '/routes/add' - fullPath: '/routes/add' - preLoaderRoute: typeof RoutesAddRouteImport - parentRoute: typeof rootRouteImport + '/routes/': { + id: '/routes/' + path: '/routes' + fullPath: '/routes' + preLoaderRoute: typeof RoutesIndexImport + parentRoute: typeof rootRoute } - '/protos/add': { - id: '/protos/add' - path: '/protos/add' - fullPath: '/protos/add' - preLoaderRoute: typeof ProtosAddRouteImport - parentRoute: typeof rootRouteImport + '/secrets/': { + id: '/secrets/' + path: '/secrets' + fullPath: '/secrets' + preLoaderRoute: typeof SecretsIndexImport + parentRoute: typeof rootRoute } - '/plugin_configs/add': { - id: '/plugin_configs/add' - path: '/plugin_configs/add' - fullPath: '/plugin_configs/add' - preLoaderRoute: typeof Plugin_configsAddRouteImport - parentRoute: typeof rootRouteImport + '/services/': { + id: '/services/' + path: '/services' + fullPath: '/services' + preLoaderRoute: typeof ServicesIndexImport + parentRoute: typeof rootRoute } - '/global_rules/add': { - id: '/global_rules/add' - path: '/global_rules/add' - fullPath: '/global_rules/add' - preLoaderRoute: typeof Global_rulesAddRouteImport - parentRoute: typeof rootRouteImport + '/ssls/': { + id: '/ssls/' + path: '/ssls' + fullPath: '/ssls' + preLoaderRoute: typeof SslsIndexImport + parentRoute: typeof rootRoute } - '/consumers/add': { - id: '/consumers/add' - path: '/consumers/add' - fullPath: '/consumers/add' - preLoaderRoute: typeof ConsumersAddRouteImport - parentRoute: typeof rootRouteImport + '/stream_routes/': { + id: '/stream_routes/' + path: '/stream_routes' + fullPath: '/stream_routes' + preLoaderRoute: typeof StreamroutesIndexImport + parentRoute: typeof rootRoute } - '/consumer_groups/add': { - id: '/consumer_groups/add' - path: '/consumer_groups/add' - fullPath: '/consumer_groups/add' - preLoaderRoute: typeof Consumer_groupsAddRouteImport - parentRoute: typeof rootRouteImport + '/upstreams/': { + id: '/upstreams/' + path: '/upstreams' + fullPath: '/upstreams' + preLoaderRoute: typeof UpstreamsIndexImport + parentRoute: typeof rootRoute } - '/upstreams/detail/$id': { - id: '/upstreams/detail/$id' - path: '/upstreams/detail/$id' - fullPath: '/upstreams/detail/$id' - preLoaderRoute: typeof UpstreamsDetailIdRouteImport - parentRoute: typeof rootRouteImport + '/consumer_groups/detail/$id': { + id: '/consumer_groups/detail/$id' + path: '/consumer_groups/detail/$id' + fullPath: '/consumer_groups/detail/$id' + preLoaderRoute: typeof ConsumergroupsDetailIdImport + parentRoute: typeof rootRoute } - '/stream_routes/detail/$id': { - id: '/stream_routes/detail/$id' - path: '/stream_routes/detail/$id' - fullPath: '/stream_routes/detail/$id' - preLoaderRoute: typeof Stream_routesDetailIdRouteImport - parentRoute: typeof rootRouteImport + '/consumers/detail/$username': { + id: '/consumers/detail/$username' + path: '/consumers/detail/$username' + fullPath: '/consumers/detail/$username' + preLoaderRoute: typeof ConsumersDetailUsernameImport + parentRoute: typeof rootRoute } - '/ssls/detail/$id': { - id: '/ssls/detail/$id' - path: '/ssls/detail/$id' - fullPath: '/ssls/detail/$id' - preLoaderRoute: typeof SslsDetailIdRouteImport - parentRoute: typeof rootRouteImport - } - '/services/detail/$id': { - id: '/services/detail/$id' - path: '/services/detail/$id' - fullPath: '/services/detail/$id' - preLoaderRoute: typeof ServicesDetailIdRouteImport - parentRoute: typeof rootRouteImport + '/global_rules/detail/$id': { + id: '/global_rules/detail/$id' + path: '/global_rules/detail/$id' + fullPath: '/global_rules/detail/$id' + preLoaderRoute: typeof GlobalrulesDetailIdImport + parentRoute: typeof rootRoute } - '/routes/detail/$id': { - id: '/routes/detail/$id' - path: '/routes/detail/$id' - fullPath: '/routes/detail/$id' - preLoaderRoute: typeof RoutesDetailIdRouteImport - parentRoute: typeof rootRouteImport + '/plugin_configs/detail/$id': { + id: '/plugin_configs/detail/$id' + path: '/plugin_configs/detail/$id' + fullPath: '/plugin_configs/detail/$id' + preLoaderRoute: typeof PluginconfigsDetailIdImport + parentRoute: typeof rootRoute } '/protos/detail/$id': { id: '/protos/detail/$id' path: '/protos/detail/$id' fullPath: '/protos/detail/$id' - preLoaderRoute: typeof ProtosDetailIdRouteImport - parentRoute: typeof rootRouteImport + preLoaderRoute: typeof ProtosDetailIdImport + parentRoute: typeof rootRoute } - '/plugin_configs/detail/$id': { - id: '/plugin_configs/detail/$id' - path: '/plugin_configs/detail/$id' - fullPath: '/plugin_configs/detail/$id' - preLoaderRoute: typeof Plugin_configsDetailIdRouteImport - parentRoute: typeof rootRouteImport - } - '/global_rules/detail/$id': { - id: '/global_rules/detail/$id' - path: '/global_rules/detail/$id' - fullPath: '/global_rules/detail/$id' - preLoaderRoute: typeof Global_rulesDetailIdRouteImport - parentRoute: typeof rootRouteImport + '/routes/detail/$id': { + id: '/routes/detail/$id' + path: '/routes/detail/$id' + fullPath: '/routes/detail/$id' + preLoaderRoute: typeof RoutesDetailIdImport + parentRoute: typeof rootRoute } - '/consumers/detail/$username': { - id: '/consumers/detail/$username' - path: '/consumers/detail/$username' - fullPath: '/consumers/detail/$username' - preLoaderRoute: typeof ConsumersDetailUsernameRouteImport - parentRoute: typeof rootRouteImport + '/services/detail/$id': { + id: '/services/detail/$id' + path: '/services/detail/$id' + fullPath: '/services/detail/$id' + preLoaderRoute: typeof ServicesDetailIdImport + parentRoute: typeof rootRoute } - '/consumer_groups/detail/$id': { - id: '/consumer_groups/detail/$id' - path: '/consumer_groups/detail/$id' - fullPath: '/consumer_groups/detail/$id' - preLoaderRoute: typeof Consumer_groupsDetailIdRouteImport - parentRoute: typeof rootRouteImport + '/ssls/detail/$id': { + id: '/ssls/detail/$id' + path: '/ssls/detail/$id' + fullPath: '/ssls/detail/$id' + preLoaderRoute: typeof SslsDetailIdImport + parentRoute: typeof rootRoute } - '/services/detail/$id/': { - id: '/services/detail/$id/' - path: '/' - fullPath: '/services/detail/$id/' - preLoaderRoute: typeof ServicesDetailIdIndexRouteImport - parentRoute: typeof ServicesDetailIdRoute + '/stream_routes/detail/$id': { + id: '/stream_routes/detail/$id' + path: '/stream_routes/detail/$id' + fullPath: '/stream_routes/detail/$id' + preLoaderRoute: typeof StreamroutesDetailIdImport + parentRoute: typeof rootRoute } - '/consumers/detail/$username/': { - id: '/consumers/detail/$username/' - path: '/' - fullPath: '/consumers/detail/$username/' - preLoaderRoute: typeof ConsumersDetailUsernameIndexRouteImport - parentRoute: typeof ConsumersDetailUsernameRoute + '/upstreams/detail/$id': { + id: '/upstreams/detail/$id' + path: '/upstreams/detail/$id' + fullPath: '/upstreams/detail/$id' + preLoaderRoute: typeof UpstreamsDetailIdImport + parentRoute: typeof rootRoute } '/secrets/detail/$manager/$id': { id: '/secrets/detail/$manager/$id' path: '/secrets/detail/$manager/$id' fullPath: '/secrets/detail/$manager/$id' - preLoaderRoute: typeof SecretsDetailManagerIdRouteImport - parentRoute: typeof rootRouteImport + preLoaderRoute: typeof SecretsDetailManagerIdImport + parentRoute: typeof rootRoute } - '/services/detail/$id/stream_routes/': { - id: '/services/detail/$id/stream_routes/' - path: '/stream_routes' - fullPath: '/services/detail/$id/stream_routes' - preLoaderRoute: typeof ServicesDetailIdStream_routesIndexRouteImport - parentRoute: typeof ServicesDetailIdRoute + '/consumers/detail/$username/': { + id: '/consumers/detail/$username/' + path: '/' + fullPath: '/consumers/detail/$username/' + preLoaderRoute: typeof ConsumersDetailUsernameIndexImport + parentRoute: typeof ConsumersDetailUsernameImport } - '/services/detail/$id/routes/': { - id: '/services/detail/$id/routes/' - path: '/routes' - fullPath: '/services/detail/$id/routes' - preLoaderRoute: typeof ServicesDetailIdRoutesIndexRouteImport - parentRoute: typeof ServicesDetailIdRoute + '/services/detail/$id/': { + id: '/services/detail/$id/' + path: '/' + fullPath: '/services/detail/$id/' + preLoaderRoute: typeof ServicesDetailIdIndexImport + parentRoute: typeof ServicesDetailIdImport } - '/consumers/detail/$username/credentials/': { - id: '/consumers/detail/$username/credentials/' - path: '/credentials' - fullPath: '/consumers/detail/$username/credentials' - preLoaderRoute: typeof ConsumersDetailUsernameCredentialsIndexRouteImport - parentRoute: typeof ConsumersDetailUsernameRoute + '/consumers/detail/$username/credentials/add': { + id: '/consumers/detail/$username/credentials/add' + path: '/credentials/add' + fullPath: '/consumers/detail/$username/credentials/add' + preLoaderRoute: typeof ConsumersDetailUsernameCredentialsAddImport + parentRoute: typeof ConsumersDetailUsernameImport + } + '/services/detail/$id/routes/add': { + id: '/services/detail/$id/routes/add' + path: '/routes/add' + fullPath: '/services/detail/$id/routes/add' + preLoaderRoute: typeof ServicesDetailIdRoutesAddImport + parentRoute: typeof ServicesDetailIdImport } '/services/detail/$id/stream_routes/add': { id: '/services/detail/$id/stream_routes/add' path: '/stream_routes/add' fullPath: '/services/detail/$id/stream_routes/add' - preLoaderRoute: typeof ServicesDetailIdStream_routesAddRouteImport - parentRoute: typeof ServicesDetailIdRoute + preLoaderRoute: typeof ServicesDetailIdStreamroutesAddImport + parentRoute: typeof ServicesDetailIdImport } - '/services/detail/$id/routes/add': { - id: '/services/detail/$id/routes/add' - path: '/routes/add' - fullPath: '/services/detail/$id/routes/add' - preLoaderRoute: typeof ServicesDetailIdRoutesAddRouteImport - parentRoute: typeof ServicesDetailIdRoute + '/consumers/detail/$username/credentials/': { + id: '/consumers/detail/$username/credentials/' + path: '/credentials' + fullPath: '/consumers/detail/$username/credentials' + preLoaderRoute: typeof ConsumersDetailUsernameCredentialsIndexImport + parentRoute: typeof ConsumersDetailUsernameImport } - '/consumers/detail/$username/credentials/add': { - id: '/consumers/detail/$username/credentials/add' - path: '/credentials/add' - fullPath: '/consumers/detail/$username/credentials/add' - preLoaderRoute: typeof ConsumersDetailUsernameCredentialsAddRouteImport - parentRoute: typeof ConsumersDetailUsernameRoute + '/services/detail/$id/routes/': { + id: '/services/detail/$id/routes/' + path: '/routes' + fullPath: '/services/detail/$id/routes' + preLoaderRoute: typeof ServicesDetailIdRoutesIndexImport + parentRoute: typeof ServicesDetailIdImport } - '/services/detail/$id/stream_routes/detail/$routeId': { - id: '/services/detail/$id/stream_routes/detail/$routeId' - path: '/stream_routes/detail/$routeId' - fullPath: '/services/detail/$id/stream_routes/detail/$routeId' - preLoaderRoute: typeof ServicesDetailIdStream_routesDetailRouteIdRouteImport - parentRoute: typeof ServicesDetailIdRoute + '/services/detail/$id/stream_routes/': { + id: '/services/detail/$id/stream_routes/' + path: '/stream_routes' + fullPath: '/services/detail/$id/stream_routes' + preLoaderRoute: typeof ServicesDetailIdStreamroutesIndexImport + parentRoute: typeof ServicesDetailIdImport + } + '/consumers/detail/$username/credentials/detail/$id': { + id: '/consumers/detail/$username/credentials/detail/$id' + path: '/credentials/detail/$id' + fullPath: '/consumers/detail/$username/credentials/detail/$id' + preLoaderRoute: typeof ConsumersDetailUsernameCredentialsDetailIdImport + parentRoute: typeof ConsumersDetailUsernameImport } '/services/detail/$id/routes/detail/$routeId': { id: '/services/detail/$id/routes/detail/$routeId' path: '/routes/detail/$routeId' fullPath: '/services/detail/$id/routes/detail/$routeId' - preLoaderRoute: typeof ServicesDetailIdRoutesDetailRouteIdRouteImport - parentRoute: typeof ServicesDetailIdRoute + preLoaderRoute: typeof ServicesDetailIdRoutesDetailRouteIdImport + parentRoute: typeof ServicesDetailIdImport } - '/consumers/detail/$username/credentials/detail/$id': { - id: '/consumers/detail/$username/credentials/detail/$id' - path: '/credentials/detail/$id' - fullPath: '/consumers/detail/$username/credentials/detail/$id' - preLoaderRoute: typeof ConsumersDetailUsernameCredentialsDetailIdRouteImport - parentRoute: typeof ConsumersDetailUsernameRoute + '/services/detail/$id/stream_routes/detail/$routeId': { + id: '/services/detail/$id/stream_routes/detail/$routeId' + path: '/stream_routes/detail/$routeId' + fullPath: '/services/detail/$id/stream_routes/detail/$routeId' + preLoaderRoute: typeof ServicesDetailIdStreamroutesDetailRouteIdImport + parentRoute: typeof ServicesDetailIdImport } } } +// Create and export the route tree + interface ConsumersDetailUsernameRouteChildren { ConsumersDetailUsernameIndexRoute: typeof ConsumersDetailUsernameIndexRoute ConsumersDetailUsernameCredentialsAddRoute: typeof ConsumersDetailUsernameCredentialsAddRoute @@ -976,66 +702,608 @@ const ConsumersDetailUsernameRouteWithChildren = interface ServicesDetailIdRouteChildren { ServicesDetailIdIndexRoute: typeof ServicesDetailIdIndexRoute ServicesDetailIdRoutesAddRoute: typeof ServicesDetailIdRoutesAddRoute - ServicesDetailIdStream_routesAddRoute: typeof ServicesDetailIdStream_routesAddRoute + ServicesDetailIdStreamroutesAddRoute: typeof ServicesDetailIdStreamroutesAddRoute ServicesDetailIdRoutesIndexRoute: typeof ServicesDetailIdRoutesIndexRoute - ServicesDetailIdStream_routesIndexRoute: typeof ServicesDetailIdStream_routesIndexRoute + ServicesDetailIdStreamroutesIndexRoute: typeof ServicesDetailIdStreamroutesIndexRoute ServicesDetailIdRoutesDetailRouteIdRoute: typeof ServicesDetailIdRoutesDetailRouteIdRoute - ServicesDetailIdStream_routesDetailRouteIdRoute: typeof ServicesDetailIdStream_routesDetailRouteIdRoute + ServicesDetailIdStreamroutesDetailRouteIdRoute: typeof ServicesDetailIdStreamroutesDetailRouteIdRoute } const ServicesDetailIdRouteChildren: ServicesDetailIdRouteChildren = { ServicesDetailIdIndexRoute: ServicesDetailIdIndexRoute, ServicesDetailIdRoutesAddRoute: ServicesDetailIdRoutesAddRoute, - ServicesDetailIdStream_routesAddRoute: ServicesDetailIdStream_routesAddRoute, + ServicesDetailIdStreamroutesAddRoute: ServicesDetailIdStreamroutesAddRoute, ServicesDetailIdRoutesIndexRoute: ServicesDetailIdRoutesIndexRoute, - ServicesDetailIdStream_routesIndexRoute: - ServicesDetailIdStream_routesIndexRoute, + ServicesDetailIdStreamroutesIndexRoute: + ServicesDetailIdStreamroutesIndexRoute, ServicesDetailIdRoutesDetailRouteIdRoute: ServicesDetailIdRoutesDetailRouteIdRoute, - ServicesDetailIdStream_routesDetailRouteIdRoute: - ServicesDetailIdStream_routesDetailRouteIdRoute, + ServicesDetailIdStreamroutesDetailRouteIdRoute: + ServicesDetailIdStreamroutesDetailRouteIdRoute, } const ServicesDetailIdRouteWithChildren = ServicesDetailIdRoute._addFileChildren(ServicesDetailIdRouteChildren) +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '/consumer_groups/add': typeof ConsumergroupsAddRoute + '/consumers/add': typeof ConsumersAddRoute + '/global_rules/add': typeof GlobalrulesAddRoute + '/plugin_configs/add': typeof PluginconfigsAddRoute + '/protos/add': typeof ProtosAddRoute + '/routes/add': typeof RoutesAddRoute + '/secrets/add': typeof SecretsAddRoute + '/services/add': typeof ServicesAddRoute + '/ssls/add': typeof SslsAddRoute + '/stream_routes/add': typeof StreamroutesAddRoute + '/upstreams/add': typeof UpstreamsAddRoute + '/consumer_groups': typeof ConsumergroupsIndexRoute + '/consumers': typeof ConsumersIndexRoute + '/global_rules': typeof GlobalrulesIndexRoute + '/plugin_configs': typeof PluginconfigsIndexRoute + '/plugin_metadata': typeof PluginmetadataIndexRoute + '/protos': typeof ProtosIndexRoute + '/routes': typeof RoutesIndexRoute + '/secrets': typeof SecretsIndexRoute + '/services': typeof ServicesIndexRoute + '/ssls': typeof SslsIndexRoute + '/stream_routes': typeof StreamroutesIndexRoute + '/upstreams': typeof UpstreamsIndexRoute + '/consumer_groups/detail/$id': typeof ConsumergroupsDetailIdRoute + '/consumers/detail/$username': typeof ConsumersDetailUsernameRouteWithChildren + '/global_rules/detail/$id': typeof GlobalrulesDetailIdRoute + '/plugin_configs/detail/$id': typeof PluginconfigsDetailIdRoute + '/protos/detail/$id': typeof ProtosDetailIdRoute + '/routes/detail/$id': typeof RoutesDetailIdRoute + '/services/detail/$id': typeof ServicesDetailIdRouteWithChildren + '/ssls/detail/$id': typeof SslsDetailIdRoute + '/stream_routes/detail/$id': typeof StreamroutesDetailIdRoute + '/upstreams/detail/$id': typeof UpstreamsDetailIdRoute + '/secrets/detail/$manager/$id': typeof SecretsDetailManagerIdRoute + '/consumers/detail/$username/': typeof ConsumersDetailUsernameIndexRoute + '/services/detail/$id/': typeof ServicesDetailIdIndexRoute + '/consumers/detail/$username/credentials/add': typeof ConsumersDetailUsernameCredentialsAddRoute + '/services/detail/$id/routes/add': typeof ServicesDetailIdRoutesAddRoute + '/services/detail/$id/stream_routes/add': typeof ServicesDetailIdStreamroutesAddRoute + '/consumers/detail/$username/credentials': typeof ConsumersDetailUsernameCredentialsIndexRoute + '/services/detail/$id/routes': typeof ServicesDetailIdRoutesIndexRoute + '/services/detail/$id/stream_routes': typeof ServicesDetailIdStreamroutesIndexRoute + '/consumers/detail/$username/credentials/detail/$id': typeof ConsumersDetailUsernameCredentialsDetailIdRoute + '/services/detail/$id/routes/detail/$routeId': typeof ServicesDetailIdRoutesDetailRouteIdRoute + '/services/detail/$id/stream_routes/detail/$routeId': typeof ServicesDetailIdStreamroutesDetailRouteIdRoute +} + +export interface FileRoutesByTo { + '/': typeof IndexRoute + '/consumer_groups/add': typeof ConsumergroupsAddRoute + '/consumers/add': typeof ConsumersAddRoute + '/global_rules/add': typeof GlobalrulesAddRoute + '/plugin_configs/add': typeof PluginconfigsAddRoute + '/protos/add': typeof ProtosAddRoute + '/routes/add': typeof RoutesAddRoute + '/secrets/add': typeof SecretsAddRoute + '/services/add': typeof ServicesAddRoute + '/ssls/add': typeof SslsAddRoute + '/stream_routes/add': typeof StreamroutesAddRoute + '/upstreams/add': typeof UpstreamsAddRoute + '/consumer_groups': typeof ConsumergroupsIndexRoute + '/consumers': typeof ConsumersIndexRoute + '/global_rules': typeof GlobalrulesIndexRoute + '/plugin_configs': typeof PluginconfigsIndexRoute + '/plugin_metadata': typeof PluginmetadataIndexRoute + '/protos': typeof ProtosIndexRoute + '/routes': typeof RoutesIndexRoute + '/secrets': typeof SecretsIndexRoute + '/services': typeof ServicesIndexRoute + '/ssls': typeof SslsIndexRoute + '/stream_routes': typeof StreamroutesIndexRoute + '/upstreams': typeof UpstreamsIndexRoute + '/consumer_groups/detail/$id': typeof ConsumergroupsDetailIdRoute + '/global_rules/detail/$id': typeof GlobalrulesDetailIdRoute + '/plugin_configs/detail/$id': typeof PluginconfigsDetailIdRoute + '/protos/detail/$id': typeof ProtosDetailIdRoute + '/routes/detail/$id': typeof RoutesDetailIdRoute + '/ssls/detail/$id': typeof SslsDetailIdRoute + '/stream_routes/detail/$id': typeof StreamroutesDetailIdRoute + '/upstreams/detail/$id': typeof UpstreamsDetailIdRoute + '/secrets/detail/$manager/$id': typeof SecretsDetailManagerIdRoute + '/consumers/detail/$username': typeof ConsumersDetailUsernameIndexRoute + '/services/detail/$id': typeof ServicesDetailIdIndexRoute + '/consumers/detail/$username/credentials/add': typeof ConsumersDetailUsernameCredentialsAddRoute + '/services/detail/$id/routes/add': typeof ServicesDetailIdRoutesAddRoute + '/services/detail/$id/stream_routes/add': typeof ServicesDetailIdStreamroutesAddRoute + '/consumers/detail/$username/credentials': typeof ConsumersDetailUsernameCredentialsIndexRoute + '/services/detail/$id/routes': typeof ServicesDetailIdRoutesIndexRoute + '/services/detail/$id/stream_routes': typeof ServicesDetailIdStreamroutesIndexRoute + '/consumers/detail/$username/credentials/detail/$id': typeof ConsumersDetailUsernameCredentialsDetailIdRoute + '/services/detail/$id/routes/detail/$routeId': typeof ServicesDetailIdRoutesDetailRouteIdRoute + '/services/detail/$id/stream_routes/detail/$routeId': typeof ServicesDetailIdStreamroutesDetailRouteIdRoute +} + +export interface FileRoutesById { + __root__: typeof rootRoute + '/': typeof IndexRoute + '/consumer_groups/add': typeof ConsumergroupsAddRoute + '/consumers/add': typeof ConsumersAddRoute + '/global_rules/add': typeof GlobalrulesAddRoute + '/plugin_configs/add': typeof PluginconfigsAddRoute + '/protos/add': typeof ProtosAddRoute + '/routes/add': typeof RoutesAddRoute + '/secrets/add': typeof SecretsAddRoute + '/services/add': typeof ServicesAddRoute + '/ssls/add': typeof SslsAddRoute + '/stream_routes/add': typeof StreamroutesAddRoute + '/upstreams/add': typeof UpstreamsAddRoute + '/consumer_groups/': typeof ConsumergroupsIndexRoute + '/consumers/': typeof ConsumersIndexRoute + '/global_rules/': typeof GlobalrulesIndexRoute + '/plugin_configs/': typeof PluginconfigsIndexRoute + '/plugin_metadata/': typeof PluginmetadataIndexRoute + '/protos/': typeof ProtosIndexRoute + '/routes/': typeof RoutesIndexRoute + '/secrets/': typeof SecretsIndexRoute + '/services/': typeof ServicesIndexRoute + '/ssls/': typeof SslsIndexRoute + '/stream_routes/': typeof StreamroutesIndexRoute + '/upstreams/': typeof UpstreamsIndexRoute + '/consumer_groups/detail/$id': typeof ConsumergroupsDetailIdRoute + '/consumers/detail/$username': typeof ConsumersDetailUsernameRouteWithChildren + '/global_rules/detail/$id': typeof GlobalrulesDetailIdRoute + '/plugin_configs/detail/$id': typeof PluginconfigsDetailIdRoute + '/protos/detail/$id': typeof ProtosDetailIdRoute + '/routes/detail/$id': typeof RoutesDetailIdRoute + '/services/detail/$id': typeof ServicesDetailIdRouteWithChildren + '/ssls/detail/$id': typeof SslsDetailIdRoute + '/stream_routes/detail/$id': typeof StreamroutesDetailIdRoute + '/upstreams/detail/$id': typeof UpstreamsDetailIdRoute + '/secrets/detail/$manager/$id': typeof SecretsDetailManagerIdRoute + '/consumers/detail/$username/': typeof ConsumersDetailUsernameIndexRoute + '/services/detail/$id/': typeof ServicesDetailIdIndexRoute + '/consumers/detail/$username/credentials/add': typeof ConsumersDetailUsernameCredentialsAddRoute + '/services/detail/$id/routes/add': typeof ServicesDetailIdRoutesAddRoute + '/services/detail/$id/stream_routes/add': typeof ServicesDetailIdStreamroutesAddRoute + '/consumers/detail/$username/credentials/': typeof ConsumersDetailUsernameCredentialsIndexRoute + '/services/detail/$id/routes/': typeof ServicesDetailIdRoutesIndexRoute + '/services/detail/$id/stream_routes/': typeof ServicesDetailIdStreamroutesIndexRoute + '/consumers/detail/$username/credentials/detail/$id': typeof ConsumersDetailUsernameCredentialsDetailIdRoute + '/services/detail/$id/routes/detail/$routeId': typeof ServicesDetailIdRoutesDetailRouteIdRoute + '/services/detail/$id/stream_routes/detail/$routeId': typeof ServicesDetailIdStreamroutesDetailRouteIdRoute +} + +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: + | '/' + | '/consumer_groups/add' + | '/consumers/add' + | '/global_rules/add' + | '/plugin_configs/add' + | '/protos/add' + | '/routes/add' + | '/secrets/add' + | '/services/add' + | '/ssls/add' + | '/stream_routes/add' + | '/upstreams/add' + | '/consumer_groups' + | '/consumers' + | '/global_rules' + | '/plugin_configs' + | '/plugin_metadata' + | '/protos' + | '/routes' + | '/secrets' + | '/services' + | '/ssls' + | '/stream_routes' + | '/upstreams' + | '/consumer_groups/detail/$id' + | '/consumers/detail/$username' + | '/global_rules/detail/$id' + | '/plugin_configs/detail/$id' + | '/protos/detail/$id' + | '/routes/detail/$id' + | '/services/detail/$id' + | '/ssls/detail/$id' + | '/stream_routes/detail/$id' + | '/upstreams/detail/$id' + | '/secrets/detail/$manager/$id' + | '/consumers/detail/$username/' + | '/services/detail/$id/' + | '/consumers/detail/$username/credentials/add' + | '/services/detail/$id/routes/add' + | '/services/detail/$id/stream_routes/add' + | '/consumers/detail/$username/credentials' + | '/services/detail/$id/routes' + | '/services/detail/$id/stream_routes' + | '/consumers/detail/$username/credentials/detail/$id' + | '/services/detail/$id/routes/detail/$routeId' + | '/services/detail/$id/stream_routes/detail/$routeId' + fileRoutesByTo: FileRoutesByTo + to: + | '/' + | '/consumer_groups/add' + | '/consumers/add' + | '/global_rules/add' + | '/plugin_configs/add' + | '/protos/add' + | '/routes/add' + | '/secrets/add' + | '/services/add' + | '/ssls/add' + | '/stream_routes/add' + | '/upstreams/add' + | '/consumer_groups' + | '/consumers' + | '/global_rules' + | '/plugin_configs' + | '/plugin_metadata' + | '/protos' + | '/routes' + | '/secrets' + | '/services' + | '/ssls' + | '/stream_routes' + | '/upstreams' + | '/consumer_groups/detail/$id' + | '/global_rules/detail/$id' + | '/plugin_configs/detail/$id' + | '/protos/detail/$id' + | '/routes/detail/$id' + | '/ssls/detail/$id' + | '/stream_routes/detail/$id' + | '/upstreams/detail/$id' + | '/secrets/detail/$manager/$id' + | '/consumers/detail/$username' + | '/services/detail/$id' + | '/consumers/detail/$username/credentials/add' + | '/services/detail/$id/routes/add' + | '/services/detail/$id/stream_routes/add' + | '/consumers/detail/$username/credentials' + | '/services/detail/$id/routes' + | '/services/detail/$id/stream_routes' + | '/consumers/detail/$username/credentials/detail/$id' + | '/services/detail/$id/routes/detail/$routeId' + | '/services/detail/$id/stream_routes/detail/$routeId' + id: + | '__root__' + | '/' + | '/consumer_groups/add' + | '/consumers/add' + | '/global_rules/add' + | '/plugin_configs/add' + | '/protos/add' + | '/routes/add' + | '/secrets/add' + | '/services/add' + | '/ssls/add' + | '/stream_routes/add' + | '/upstreams/add' + | '/consumer_groups/' + | '/consumers/' + | '/global_rules/' + | '/plugin_configs/' + | '/plugin_metadata/' + | '/protos/' + | '/routes/' + | '/secrets/' + | '/services/' + | '/ssls/' + | '/stream_routes/' + | '/upstreams/' + | '/consumer_groups/detail/$id' + | '/consumers/detail/$username' + | '/global_rules/detail/$id' + | '/plugin_configs/detail/$id' + | '/protos/detail/$id' + | '/routes/detail/$id' + | '/services/detail/$id' + | '/ssls/detail/$id' + | '/stream_routes/detail/$id' + | '/upstreams/detail/$id' + | '/secrets/detail/$manager/$id' + | '/consumers/detail/$username/' + | '/services/detail/$id/' + | '/consumers/detail/$username/credentials/add' + | '/services/detail/$id/routes/add' + | '/services/detail/$id/stream_routes/add' + | '/consumers/detail/$username/credentials/' + | '/services/detail/$id/routes/' + | '/services/detail/$id/stream_routes/' + | '/consumers/detail/$username/credentials/detail/$id' + | '/services/detail/$id/routes/detail/$routeId' + | '/services/detail/$id/stream_routes/detail/$routeId' + fileRoutesById: FileRoutesById +} + +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + ConsumergroupsAddRoute: typeof ConsumergroupsAddRoute + ConsumersAddRoute: typeof ConsumersAddRoute + GlobalrulesAddRoute: typeof GlobalrulesAddRoute + PluginconfigsAddRoute: typeof PluginconfigsAddRoute + ProtosAddRoute: typeof ProtosAddRoute + RoutesAddRoute: typeof RoutesAddRoute + SecretsAddRoute: typeof SecretsAddRoute + ServicesAddRoute: typeof ServicesAddRoute + SslsAddRoute: typeof SslsAddRoute + StreamroutesAddRoute: typeof StreamroutesAddRoute + UpstreamsAddRoute: typeof UpstreamsAddRoute + ConsumergroupsIndexRoute: typeof ConsumergroupsIndexRoute + ConsumersIndexRoute: typeof ConsumersIndexRoute + GlobalrulesIndexRoute: typeof GlobalrulesIndexRoute + PluginconfigsIndexRoute: typeof PluginconfigsIndexRoute + PluginmetadataIndexRoute: typeof PluginmetadataIndexRoute + ProtosIndexRoute: typeof ProtosIndexRoute + RoutesIndexRoute: typeof RoutesIndexRoute + SecretsIndexRoute: typeof SecretsIndexRoute + ServicesIndexRoute: typeof ServicesIndexRoute + SslsIndexRoute: typeof SslsIndexRoute + StreamroutesIndexRoute: typeof StreamroutesIndexRoute + UpstreamsIndexRoute: typeof UpstreamsIndexRoute + ConsumergroupsDetailIdRoute: typeof ConsumergroupsDetailIdRoute + ConsumersDetailUsernameRoute: typeof ConsumersDetailUsernameRouteWithChildren + GlobalrulesDetailIdRoute: typeof GlobalrulesDetailIdRoute + PluginconfigsDetailIdRoute: typeof PluginconfigsDetailIdRoute + ProtosDetailIdRoute: typeof ProtosDetailIdRoute + RoutesDetailIdRoute: typeof RoutesDetailIdRoute + ServicesDetailIdRoute: typeof ServicesDetailIdRouteWithChildren + SslsDetailIdRoute: typeof SslsDetailIdRoute + StreamroutesDetailIdRoute: typeof StreamroutesDetailIdRoute + UpstreamsDetailIdRoute: typeof UpstreamsDetailIdRoute + SecretsDetailManagerIdRoute: typeof SecretsDetailManagerIdRoute +} + const rootRouteChildren: RootRouteChildren = { IndexRoute: IndexRoute, - Consumer_groupsAddRoute: Consumer_groupsAddRoute, + ConsumergroupsAddRoute: ConsumergroupsAddRoute, ConsumersAddRoute: ConsumersAddRoute, - Global_rulesAddRoute: Global_rulesAddRoute, - Plugin_configsAddRoute: Plugin_configsAddRoute, + GlobalrulesAddRoute: GlobalrulesAddRoute, + PluginconfigsAddRoute: PluginconfigsAddRoute, ProtosAddRoute: ProtosAddRoute, RoutesAddRoute: RoutesAddRoute, SecretsAddRoute: SecretsAddRoute, ServicesAddRoute: ServicesAddRoute, SslsAddRoute: SslsAddRoute, - Stream_routesAddRoute: Stream_routesAddRoute, + StreamroutesAddRoute: StreamroutesAddRoute, UpstreamsAddRoute: UpstreamsAddRoute, - Consumer_groupsIndexRoute: Consumer_groupsIndexRoute, + ConsumergroupsIndexRoute: ConsumergroupsIndexRoute, ConsumersIndexRoute: ConsumersIndexRoute, - Global_rulesIndexRoute: Global_rulesIndexRoute, - Plugin_configsIndexRoute: Plugin_configsIndexRoute, - Plugin_metadataIndexRoute: Plugin_metadataIndexRoute, + GlobalrulesIndexRoute: GlobalrulesIndexRoute, + PluginconfigsIndexRoute: PluginconfigsIndexRoute, + PluginmetadataIndexRoute: PluginmetadataIndexRoute, ProtosIndexRoute: ProtosIndexRoute, RoutesIndexRoute: RoutesIndexRoute, SecretsIndexRoute: SecretsIndexRoute, ServicesIndexRoute: ServicesIndexRoute, SslsIndexRoute: SslsIndexRoute, - Stream_routesIndexRoute: Stream_routesIndexRoute, + StreamroutesIndexRoute: StreamroutesIndexRoute, UpstreamsIndexRoute: UpstreamsIndexRoute, - Consumer_groupsDetailIdRoute: Consumer_groupsDetailIdRoute, + ConsumergroupsDetailIdRoute: ConsumergroupsDetailIdRoute, ConsumersDetailUsernameRoute: ConsumersDetailUsernameRouteWithChildren, - Global_rulesDetailIdRoute: Global_rulesDetailIdRoute, - Plugin_configsDetailIdRoute: Plugin_configsDetailIdRoute, + GlobalrulesDetailIdRoute: GlobalrulesDetailIdRoute, + PluginconfigsDetailIdRoute: PluginconfigsDetailIdRoute, ProtosDetailIdRoute: ProtosDetailIdRoute, RoutesDetailIdRoute: RoutesDetailIdRoute, ServicesDetailIdRoute: ServicesDetailIdRouteWithChildren, SslsDetailIdRoute: SslsDetailIdRoute, - Stream_routesDetailIdRoute: Stream_routesDetailIdRoute, + StreamroutesDetailIdRoute: StreamroutesDetailIdRoute, UpstreamsDetailIdRoute: UpstreamsDetailIdRoute, SecretsDetailManagerIdRoute: SecretsDetailManagerIdRoute, } -export const routeTree = rootRouteImport + +export const routeTree = rootRoute ._addFileChildren(rootRouteChildren) ._addFileTypes() + +/* ROUTE_MANIFEST_START +{ + "routes": { + "__root__": { + "filePath": "__root.tsx", + "children": [ + "/", + "/consumer_groups/add", + "/consumers/add", + "/global_rules/add", + "/plugin_configs/add", + "/protos/add", + "/routes/add", + "/secrets/add", + "/services/add", + "/ssls/add", + "/stream_routes/add", + "/upstreams/add", + "/consumer_groups/", + "/consumers/", + "/global_rules/", + "/plugin_configs/", + "/plugin_metadata/", + "/protos/", + "/routes/", + "/secrets/", + "/services/", + "/ssls/", + "/stream_routes/", + "/upstreams/", + "/consumer_groups/detail/$id", + "/consumers/detail/$username", + "/global_rules/detail/$id", + "/plugin_configs/detail/$id", + "/protos/detail/$id", + "/routes/detail/$id", + "/services/detail/$id", + "/ssls/detail/$id", + "/stream_routes/detail/$id", + "/upstreams/detail/$id", + "/secrets/detail/$manager/$id" + ] + }, + "/": { + "filePath": "index.tsx" + }, + "/consumer_groups/add": { + "filePath": "consumer_groups/add.tsx" + }, + "/consumers/add": { + "filePath": "consumers/add.tsx" + }, + "/global_rules/add": { + "filePath": "global_rules/add.tsx" + }, + "/plugin_configs/add": { + "filePath": "plugin_configs/add.tsx" + }, + "/protos/add": { + "filePath": "protos/add.tsx" + }, + "/routes/add": { + "filePath": "routes/add.tsx" + }, + "/secrets/add": { + "filePath": "secrets/add.tsx" + }, + "/services/add": { + "filePath": "services/add.tsx" + }, + "/ssls/add": { + "filePath": "ssls/add.tsx" + }, + "/stream_routes/add": { + "filePath": "stream_routes/add.tsx" + }, + "/upstreams/add": { + "filePath": "upstreams/add.tsx" + }, + "/consumer_groups/": { + "filePath": "consumer_groups/index.tsx" + }, + "/consumers/": { + "filePath": "consumers/index.tsx" + }, + "/global_rules/": { + "filePath": "global_rules/index.tsx" + }, + "/plugin_configs/": { + "filePath": "plugin_configs/index.tsx" + }, + "/plugin_metadata/": { + "filePath": "plugin_metadata/index.tsx" + }, + "/protos/": { + "filePath": "protos/index.tsx" + }, + "/routes/": { + "filePath": "routes/index.tsx" + }, + "/secrets/": { + "filePath": "secrets/index.tsx" + }, + "/services/": { + "filePath": "services/index.tsx" + }, + "/ssls/": { + "filePath": "ssls/index.tsx" + }, + "/stream_routes/": { + "filePath": "stream_routes/index.tsx" + }, + "/upstreams/": { + "filePath": "upstreams/index.tsx" + }, + "/consumer_groups/detail/$id": { + "filePath": "consumer_groups/detail.$id.tsx" + }, + "/consumers/detail/$username": { + "filePath": "consumers/detail.$username.tsx", + "children": [ + "/consumers/detail/$username/", + "/consumers/detail/$username/credentials/add", + "/consumers/detail/$username/credentials/", + "/consumers/detail/$username/credentials/detail/$id" + ] + }, + "/global_rules/detail/$id": { + "filePath": "global_rules/detail.$id.tsx" + }, + "/plugin_configs/detail/$id": { + "filePath": "plugin_configs/detail.$id.tsx" + }, + "/protos/detail/$id": { + "filePath": "protos/detail.$id.tsx" + }, + "/routes/detail/$id": { + "filePath": "routes/detail.$id.tsx" + }, + "/services/detail/$id": { + "filePath": "services/detail.$id.tsx", + "children": [ + "/services/detail/$id/", + "/services/detail/$id/routes/add", + "/services/detail/$id/stream_routes/add", + "/services/detail/$id/routes/", + "/services/detail/$id/stream_routes/", + "/services/detail/$id/routes/detail/$routeId", + "/services/detail/$id/stream_routes/detail/$routeId" + ] + }, + "/ssls/detail/$id": { + "filePath": "ssls/detail.$id.tsx" + }, + "/stream_routes/detail/$id": { + "filePath": "stream_routes/detail.$id.tsx" + }, + "/upstreams/detail/$id": { + "filePath": "upstreams/detail.$id.tsx" + }, + "/secrets/detail/$manager/$id": { + "filePath": "secrets/detail.$manager.$id.tsx" + }, + "/consumers/detail/$username/": { + "filePath": "consumers/detail.$username/index.tsx", + "parent": "/consumers/detail/$username" + }, + "/services/detail/$id/": { + "filePath": "services/detail.$id/index.tsx", + "parent": "/services/detail/$id" + }, + "/consumers/detail/$username/credentials/add": { + "filePath": "consumers/detail.$username/credentials/add.tsx", + "parent": "/consumers/detail/$username" + }, + "/services/detail/$id/routes/add": { + "filePath": "services/detail.$id/routes/add.tsx", + "parent": "/services/detail/$id" + }, + "/services/detail/$id/stream_routes/add": { + "filePath": "services/detail.$id/stream_routes/add.tsx", + "parent": "/services/detail/$id" + }, + "/consumers/detail/$username/credentials/": { + "filePath": "consumers/detail.$username/credentials/index.tsx", + "parent": "/consumers/detail/$username" + }, + "/services/detail/$id/routes/": { + "filePath": "services/detail.$id/routes/index.tsx", + "parent": "/services/detail/$id" + }, + "/services/detail/$id/stream_routes/": { + "filePath": "services/detail.$id/stream_routes/index.tsx", + "parent": "/services/detail/$id" + }, + "/consumers/detail/$username/credentials/detail/$id": { + "filePath": "consumers/detail.$username/credentials/detail.$id.tsx", + "parent": "/consumers/detail/$username" + }, + "/services/detail/$id/routes/detail/$routeId": { + "filePath": "services/detail.$id/routes/detail.$routeId.tsx", + "parent": "/services/detail/$id" + }, + "/services/detail/$id/stream_routes/detail/$routeId": { + "filePath": "services/detail.$id/stream_routes/detail.$routeId.tsx", + "parent": "/services/detail/$id" + } + } +} +ROUTE_MANIFEST_END */ From a5461c05f9a7d2fcd40c17476390c3b6d0a5fac1 Mon Sep 17 00:00:00 2001 From: Deep Shekhar Singh Date: Wed, 4 Feb 2026 00:29:56 +0530 Subject: [PATCH 03/20] chore: ensure route tree matches current environment --- src/routeTree.gen.ts | 1446 +++++++++++++++++------------------------- 1 file changed, 589 insertions(+), 857 deletions(-) diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts index 09bb7be2cc..bb344f0269 100644 --- a/src/routeTree.gen.ts +++ b/src/routeTree.gen.ts @@ -8,869 +8,438 @@ // You should NOT make any changes in this file as it will be overwritten. // Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. -// Import Routes - -import { Route as rootRoute } from './routes/__root' -import { Route as IndexImport } from './routes/index' -import { Route as UpstreamsIndexImport } from './routes/upstreams/index' -import { Route as StreamroutesIndexImport } from './routes/stream_routes/index' -import { Route as SslsIndexImport } from './routes/ssls/index' -import { Route as ServicesIndexImport } from './routes/services/index' -import { Route as SecretsIndexImport } from './routes/secrets/index' -import { Route as RoutesIndexImport } from './routes/routes/index' -import { Route as ProtosIndexImport } from './routes/protos/index' -import { Route as PluginmetadataIndexImport } from './routes/plugin_metadata/index' -import { Route as PluginconfigsIndexImport } from './routes/plugin_configs/index' -import { Route as GlobalrulesIndexImport } from './routes/global_rules/index' -import { Route as ConsumersIndexImport } from './routes/consumers/index' -import { Route as ConsumergroupsIndexImport } from './routes/consumer_groups/index' -import { Route as UpstreamsAddImport } from './routes/upstreams/add' -import { Route as StreamroutesAddImport } from './routes/stream_routes/add' -import { Route as SslsAddImport } from './routes/ssls/add' -import { Route as ServicesAddImport } from './routes/services/add' -import { Route as SecretsAddImport } from './routes/secrets/add' -import { Route as RoutesAddImport } from './routes/routes/add' -import { Route as ProtosAddImport } from './routes/protos/add' -import { Route as PluginconfigsAddImport } from './routes/plugin_configs/add' -import { Route as GlobalrulesAddImport } from './routes/global_rules/add' -import { Route as ConsumersAddImport } from './routes/consumers/add' -import { Route as ConsumergroupsAddImport } from './routes/consumer_groups/add' -import { Route as UpstreamsDetailIdImport } from './routes/upstreams/detail.$id' -import { Route as StreamroutesDetailIdImport } from './routes/stream_routes/detail.$id' -import { Route as SslsDetailIdImport } from './routes/ssls/detail.$id' -import { Route as ServicesDetailIdImport } from './routes/services/detail.$id' -import { Route as RoutesDetailIdImport } from './routes/routes/detail.$id' -import { Route as ProtosDetailIdImport } from './routes/protos/detail.$id' -import { Route as PluginconfigsDetailIdImport } from './routes/plugin_configs/detail.$id' -import { Route as GlobalrulesDetailIdImport } from './routes/global_rules/detail.$id' -import { Route as ConsumersDetailUsernameImport } from './routes/consumers/detail.$username' -import { Route as ConsumergroupsDetailIdImport } from './routes/consumer_groups/detail.$id' -import { Route as ServicesDetailIdIndexImport } from './routes/services/detail.$id/index' -import { Route as ConsumersDetailUsernameIndexImport } from './routes/consumers/detail.$username/index' -import { Route as SecretsDetailManagerIdImport } from './routes/secrets/detail.$manager.$id' -import { Route as ServicesDetailIdStreamroutesIndexImport } from './routes/services/detail.$id/stream_routes/index' -import { Route as ServicesDetailIdRoutesIndexImport } from './routes/services/detail.$id/routes/index' -import { Route as ConsumersDetailUsernameCredentialsIndexImport } from './routes/consumers/detail.$username/credentials/index' -import { Route as ServicesDetailIdStreamroutesAddImport } from './routes/services/detail.$id/stream_routes/add' -import { Route as ServicesDetailIdRoutesAddImport } from './routes/services/detail.$id/routes/add' -import { Route as ConsumersDetailUsernameCredentialsAddImport } from './routes/consumers/detail.$username/credentials/add' -import { Route as ServicesDetailIdStreamroutesDetailRouteIdImport } from './routes/services/detail.$id/stream_routes/detail.$routeId' -import { Route as ServicesDetailIdRoutesDetailRouteIdImport } from './routes/services/detail.$id/routes/detail.$routeId' -import { Route as ConsumersDetailUsernameCredentialsDetailIdImport } from './routes/consumers/detail.$username/credentials/detail.$id' - -// Create/Update Routes - -const IndexRoute = IndexImport.update({ +import { Route as rootRouteImport } from './routes/__root' +import { Route as IndexRouteImport } from './routes/index' +import { Route as UpstreamsIndexRouteImport } from './routes/upstreams/index' +import { Route as Stream_routesIndexRouteImport } from './routes/stream_routes/index' +import { Route as SslsIndexRouteImport } from './routes/ssls/index' +import { Route as ServicesIndexRouteImport } from './routes/services/index' +import { Route as SecretsIndexRouteImport } from './routes/secrets/index' +import { Route as RoutesIndexRouteImport } from './routes/routes/index' +import { Route as ProtosIndexRouteImport } from './routes/protos/index' +import { Route as Plugin_metadataIndexRouteImport } from './routes/plugin_metadata/index' +import { Route as Plugin_configsIndexRouteImport } from './routes/plugin_configs/index' +import { Route as Global_rulesIndexRouteImport } from './routes/global_rules/index' +import { Route as ConsumersIndexRouteImport } from './routes/consumers/index' +import { Route as Consumer_groupsIndexRouteImport } from './routes/consumer_groups/index' +import { Route as UpstreamsAddRouteImport } from './routes/upstreams/add' +import { Route as Stream_routesAddRouteImport } from './routes/stream_routes/add' +import { Route as SslsAddRouteImport } from './routes/ssls/add' +import { Route as ServicesAddRouteImport } from './routes/services/add' +import { Route as SecretsAddRouteImport } from './routes/secrets/add' +import { Route as RoutesAddRouteImport } from './routes/routes/add' +import { Route as ProtosAddRouteImport } from './routes/protos/add' +import { Route as Plugin_configsAddRouteImport } from './routes/plugin_configs/add' +import { Route as Global_rulesAddRouteImport } from './routes/global_rules/add' +import { Route as ConsumersAddRouteImport } from './routes/consumers/add' +import { Route as Consumer_groupsAddRouteImport } from './routes/consumer_groups/add' +import { Route as UpstreamsDetailIdRouteImport } from './routes/upstreams/detail.$id' +import { Route as Stream_routesDetailIdRouteImport } from './routes/stream_routes/detail.$id' +import { Route as SslsDetailIdRouteImport } from './routes/ssls/detail.$id' +import { Route as ServicesDetailIdRouteImport } from './routes/services/detail.$id' +import { Route as RoutesDetailIdRouteImport } from './routes/routes/detail.$id' +import { Route as ProtosDetailIdRouteImport } from './routes/protos/detail.$id' +import { Route as Plugin_configsDetailIdRouteImport } from './routes/plugin_configs/detail.$id' +import { Route as Global_rulesDetailIdRouteImport } from './routes/global_rules/detail.$id' +import { Route as ConsumersDetailUsernameRouteImport } from './routes/consumers/detail.$username' +import { Route as Consumer_groupsDetailIdRouteImport } from './routes/consumer_groups/detail.$id' +import { Route as ServicesDetailIdIndexRouteImport } from './routes/services/detail.$id/index' +import { Route as ConsumersDetailUsernameIndexRouteImport } from './routes/consumers/detail.$username/index' +import { Route as SecretsDetailManagerIdRouteImport } from './routes/secrets/detail.$manager.$id' +import { Route as ServicesDetailIdStream_routesIndexRouteImport } from './routes/services/detail.$id/stream_routes/index' +import { Route as ServicesDetailIdRoutesIndexRouteImport } from './routes/services/detail.$id/routes/index' +import { Route as ConsumersDetailUsernameCredentialsIndexRouteImport } from './routes/consumers/detail.$username/credentials/index' +import { Route as ServicesDetailIdStream_routesAddRouteImport } from './routes/services/detail.$id/stream_routes/add' +import { Route as ServicesDetailIdRoutesAddRouteImport } from './routes/services/detail.$id/routes/add' +import { Route as ConsumersDetailUsernameCredentialsAddRouteImport } from './routes/consumers/detail.$username/credentials/add' +import { Route as ServicesDetailIdStream_routesDetailRouteIdRouteImport } from './routes/services/detail.$id/stream_routes/detail.$routeId' +import { Route as ServicesDetailIdRoutesDetailRouteIdRouteImport } from './routes/services/detail.$id/routes/detail.$routeId' +import { Route as ConsumersDetailUsernameCredentialsDetailIdRouteImport } from './routes/consumers/detail.$username/credentials/detail.$id' + +const IndexRoute = IndexRouteImport.update({ id: '/', path: '/', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const UpstreamsIndexRoute = UpstreamsIndexImport.update({ +const UpstreamsIndexRoute = UpstreamsIndexRouteImport.update({ id: '/upstreams/', path: '/upstreams/', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const StreamroutesIndexRoute = StreamroutesIndexImport.update({ +const Stream_routesIndexRoute = Stream_routesIndexRouteImport.update({ id: '/stream_routes/', path: '/stream_routes/', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const SslsIndexRoute = SslsIndexImport.update({ +const SslsIndexRoute = SslsIndexRouteImport.update({ id: '/ssls/', path: '/ssls/', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const ServicesIndexRoute = ServicesIndexImport.update({ +const ServicesIndexRoute = ServicesIndexRouteImport.update({ id: '/services/', path: '/services/', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const SecretsIndexRoute = SecretsIndexImport.update({ +const SecretsIndexRoute = SecretsIndexRouteImport.update({ id: '/secrets/', path: '/secrets/', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const RoutesIndexRoute = RoutesIndexImport.update({ +const RoutesIndexRoute = RoutesIndexRouteImport.update({ id: '/routes/', path: '/routes/', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const ProtosIndexRoute = ProtosIndexImport.update({ +const ProtosIndexRoute = ProtosIndexRouteImport.update({ id: '/protos/', path: '/protos/', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const PluginmetadataIndexRoute = PluginmetadataIndexImport.update({ +const Plugin_metadataIndexRoute = Plugin_metadataIndexRouteImport.update({ id: '/plugin_metadata/', path: '/plugin_metadata/', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const PluginconfigsIndexRoute = PluginconfigsIndexImport.update({ +const Plugin_configsIndexRoute = Plugin_configsIndexRouteImport.update({ id: '/plugin_configs/', path: '/plugin_configs/', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const GlobalrulesIndexRoute = GlobalrulesIndexImport.update({ +const Global_rulesIndexRoute = Global_rulesIndexRouteImport.update({ id: '/global_rules/', path: '/global_rules/', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const ConsumersIndexRoute = ConsumersIndexImport.update({ +const ConsumersIndexRoute = ConsumersIndexRouteImport.update({ id: '/consumers/', path: '/consumers/', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const ConsumergroupsIndexRoute = ConsumergroupsIndexImport.update({ +const Consumer_groupsIndexRoute = Consumer_groupsIndexRouteImport.update({ id: '/consumer_groups/', path: '/consumer_groups/', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const UpstreamsAddRoute = UpstreamsAddImport.update({ +const UpstreamsAddRoute = UpstreamsAddRouteImport.update({ id: '/upstreams/add', path: '/upstreams/add', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const StreamroutesAddRoute = StreamroutesAddImport.update({ +const Stream_routesAddRoute = Stream_routesAddRouteImport.update({ id: '/stream_routes/add', path: '/stream_routes/add', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const SslsAddRoute = SslsAddImport.update({ +const SslsAddRoute = SslsAddRouteImport.update({ id: '/ssls/add', path: '/ssls/add', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const ServicesAddRoute = ServicesAddImport.update({ +const ServicesAddRoute = ServicesAddRouteImport.update({ id: '/services/add', path: '/services/add', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const SecretsAddRoute = SecretsAddImport.update({ +const SecretsAddRoute = SecretsAddRouteImport.update({ id: '/secrets/add', path: '/secrets/add', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const RoutesAddRoute = RoutesAddImport.update({ +const RoutesAddRoute = RoutesAddRouteImport.update({ id: '/routes/add', path: '/routes/add', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const ProtosAddRoute = ProtosAddImport.update({ +const ProtosAddRoute = ProtosAddRouteImport.update({ id: '/protos/add', path: '/protos/add', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const PluginconfigsAddRoute = PluginconfigsAddImport.update({ +const Plugin_configsAddRoute = Plugin_configsAddRouteImport.update({ id: '/plugin_configs/add', path: '/plugin_configs/add', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const GlobalrulesAddRoute = GlobalrulesAddImport.update({ +const Global_rulesAddRoute = Global_rulesAddRouteImport.update({ id: '/global_rules/add', path: '/global_rules/add', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const ConsumersAddRoute = ConsumersAddImport.update({ +const ConsumersAddRoute = ConsumersAddRouteImport.update({ id: '/consumers/add', path: '/consumers/add', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const ConsumergroupsAddRoute = ConsumergroupsAddImport.update({ +const Consumer_groupsAddRoute = Consumer_groupsAddRouteImport.update({ id: '/consumer_groups/add', path: '/consumer_groups/add', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const UpstreamsDetailIdRoute = UpstreamsDetailIdImport.update({ +const UpstreamsDetailIdRoute = UpstreamsDetailIdRouteImport.update({ id: '/upstreams/detail/$id', path: '/upstreams/detail/$id', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const StreamroutesDetailIdRoute = StreamroutesDetailIdImport.update({ +const Stream_routesDetailIdRoute = Stream_routesDetailIdRouteImport.update({ id: '/stream_routes/detail/$id', path: '/stream_routes/detail/$id', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const SslsDetailIdRoute = SslsDetailIdImport.update({ +const SslsDetailIdRoute = SslsDetailIdRouteImport.update({ id: '/ssls/detail/$id', path: '/ssls/detail/$id', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const ServicesDetailIdRoute = ServicesDetailIdImport.update({ +const ServicesDetailIdRoute = ServicesDetailIdRouteImport.update({ id: '/services/detail/$id', path: '/services/detail/$id', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const RoutesDetailIdRoute = RoutesDetailIdImport.update({ +const RoutesDetailIdRoute = RoutesDetailIdRouteImport.update({ id: '/routes/detail/$id', path: '/routes/detail/$id', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const ProtosDetailIdRoute = ProtosDetailIdImport.update({ +const ProtosDetailIdRoute = ProtosDetailIdRouteImport.update({ id: '/protos/detail/$id', path: '/protos/detail/$id', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const PluginconfigsDetailIdRoute = PluginconfigsDetailIdImport.update({ +const Plugin_configsDetailIdRoute = Plugin_configsDetailIdRouteImport.update({ id: '/plugin_configs/detail/$id', path: '/plugin_configs/detail/$id', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const GlobalrulesDetailIdRoute = GlobalrulesDetailIdImport.update({ +const Global_rulesDetailIdRoute = Global_rulesDetailIdRouteImport.update({ id: '/global_rules/detail/$id', path: '/global_rules/detail/$id', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const ConsumersDetailUsernameRoute = ConsumersDetailUsernameImport.update({ +const ConsumersDetailUsernameRoute = ConsumersDetailUsernameRouteImport.update({ id: '/consumers/detail/$username', path: '/consumers/detail/$username', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const ConsumergroupsDetailIdRoute = ConsumergroupsDetailIdImport.update({ +const Consumer_groupsDetailIdRoute = Consumer_groupsDetailIdRouteImport.update({ id: '/consumer_groups/detail/$id', path: '/consumer_groups/detail/$id', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const ServicesDetailIdIndexRoute = ServicesDetailIdIndexImport.update({ +const ServicesDetailIdIndexRoute = ServicesDetailIdIndexRouteImport.update({ id: '/', path: '/', getParentRoute: () => ServicesDetailIdRoute, } as any) - const ConsumersDetailUsernameIndexRoute = - ConsumersDetailUsernameIndexImport.update({ + ConsumersDetailUsernameIndexRouteImport.update({ id: '/', path: '/', getParentRoute: () => ConsumersDetailUsernameRoute, } as any) - -const SecretsDetailManagerIdRoute = SecretsDetailManagerIdImport.update({ +const SecretsDetailManagerIdRoute = SecretsDetailManagerIdRouteImport.update({ id: '/secrets/detail/$manager/$id', path: '/secrets/detail/$manager/$id', - getParentRoute: () => rootRoute, + getParentRoute: () => rootRouteImport, } as any) - -const ServicesDetailIdStreamroutesIndexRoute = - ServicesDetailIdStreamroutesIndexImport.update({ +const ServicesDetailIdStream_routesIndexRoute = + ServicesDetailIdStream_routesIndexRouteImport.update({ id: '/stream_routes/', path: '/stream_routes/', getParentRoute: () => ServicesDetailIdRoute, } as any) - const ServicesDetailIdRoutesIndexRoute = - ServicesDetailIdRoutesIndexImport.update({ + ServicesDetailIdRoutesIndexRouteImport.update({ id: '/routes/', path: '/routes/', getParentRoute: () => ServicesDetailIdRoute, } as any) - const ConsumersDetailUsernameCredentialsIndexRoute = - ConsumersDetailUsernameCredentialsIndexImport.update({ + ConsumersDetailUsernameCredentialsIndexRouteImport.update({ id: '/credentials/', path: '/credentials/', getParentRoute: () => ConsumersDetailUsernameRoute, } as any) - -const ServicesDetailIdStreamroutesAddRoute = - ServicesDetailIdStreamroutesAddImport.update({ +const ServicesDetailIdStream_routesAddRoute = + ServicesDetailIdStream_routesAddRouteImport.update({ id: '/stream_routes/add', path: '/stream_routes/add', getParentRoute: () => ServicesDetailIdRoute, } as any) - -const ServicesDetailIdRoutesAddRoute = ServicesDetailIdRoutesAddImport.update({ - id: '/routes/add', - path: '/routes/add', - getParentRoute: () => ServicesDetailIdRoute, -} as any) - +const ServicesDetailIdRoutesAddRoute = + ServicesDetailIdRoutesAddRouteImport.update({ + id: '/routes/add', + path: '/routes/add', + getParentRoute: () => ServicesDetailIdRoute, + } as any) const ConsumersDetailUsernameCredentialsAddRoute = - ConsumersDetailUsernameCredentialsAddImport.update({ + ConsumersDetailUsernameCredentialsAddRouteImport.update({ id: '/credentials/add', path: '/credentials/add', getParentRoute: () => ConsumersDetailUsernameRoute, } as any) - -const ServicesDetailIdStreamroutesDetailRouteIdRoute = - ServicesDetailIdStreamroutesDetailRouteIdImport.update({ +const ServicesDetailIdStream_routesDetailRouteIdRoute = + ServicesDetailIdStream_routesDetailRouteIdRouteImport.update({ id: '/stream_routes/detail/$routeId', path: '/stream_routes/detail/$routeId', getParentRoute: () => ServicesDetailIdRoute, } as any) - const ServicesDetailIdRoutesDetailRouteIdRoute = - ServicesDetailIdRoutesDetailRouteIdImport.update({ + ServicesDetailIdRoutesDetailRouteIdRouteImport.update({ id: '/routes/detail/$routeId', path: '/routes/detail/$routeId', getParentRoute: () => ServicesDetailIdRoute, } as any) - const ConsumersDetailUsernameCredentialsDetailIdRoute = - ConsumersDetailUsernameCredentialsDetailIdImport.update({ + ConsumersDetailUsernameCredentialsDetailIdRouteImport.update({ id: '/credentials/detail/$id', path: '/credentials/detail/$id', getParentRoute: () => ConsumersDetailUsernameRoute, } as any) -// Populate the FileRoutesByPath interface - -declare module '@tanstack/react-router' { - interface FileRoutesByPath { - '/': { - id: '/' - path: '/' - fullPath: '/' - preLoaderRoute: typeof IndexImport - parentRoute: typeof rootRoute - } - '/consumer_groups/add': { - id: '/consumer_groups/add' - path: '/consumer_groups/add' - fullPath: '/consumer_groups/add' - preLoaderRoute: typeof ConsumergroupsAddImport - parentRoute: typeof rootRoute - } - '/consumers/add': { - id: '/consumers/add' - path: '/consumers/add' - fullPath: '/consumers/add' - preLoaderRoute: typeof ConsumersAddImport - parentRoute: typeof rootRoute - } - '/global_rules/add': { - id: '/global_rules/add' - path: '/global_rules/add' - fullPath: '/global_rules/add' - preLoaderRoute: typeof GlobalrulesAddImport - parentRoute: typeof rootRoute - } - '/plugin_configs/add': { - id: '/plugin_configs/add' - path: '/plugin_configs/add' - fullPath: '/plugin_configs/add' - preLoaderRoute: typeof PluginconfigsAddImport - parentRoute: typeof rootRoute - } - '/protos/add': { - id: '/protos/add' - path: '/protos/add' - fullPath: '/protos/add' - preLoaderRoute: typeof ProtosAddImport - parentRoute: typeof rootRoute - } - '/routes/add': { - id: '/routes/add' - path: '/routes/add' - fullPath: '/routes/add' - preLoaderRoute: typeof RoutesAddImport - parentRoute: typeof rootRoute - } - '/secrets/add': { - id: '/secrets/add' - path: '/secrets/add' - fullPath: '/secrets/add' - preLoaderRoute: typeof SecretsAddImport - parentRoute: typeof rootRoute - } - '/services/add': { - id: '/services/add' - path: '/services/add' - fullPath: '/services/add' - preLoaderRoute: typeof ServicesAddImport - parentRoute: typeof rootRoute - } - '/ssls/add': { - id: '/ssls/add' - path: '/ssls/add' - fullPath: '/ssls/add' - preLoaderRoute: typeof SslsAddImport - parentRoute: typeof rootRoute - } - '/stream_routes/add': { - id: '/stream_routes/add' - path: '/stream_routes/add' - fullPath: '/stream_routes/add' - preLoaderRoute: typeof StreamroutesAddImport - parentRoute: typeof rootRoute - } - '/upstreams/add': { - id: '/upstreams/add' - path: '/upstreams/add' - fullPath: '/upstreams/add' - preLoaderRoute: typeof UpstreamsAddImport - parentRoute: typeof rootRoute - } - '/consumer_groups/': { - id: '/consumer_groups/' - path: '/consumer_groups' - fullPath: '/consumer_groups' - preLoaderRoute: typeof ConsumergroupsIndexImport - parentRoute: typeof rootRoute - } - '/consumers/': { - id: '/consumers/' - path: '/consumers' - fullPath: '/consumers' - preLoaderRoute: typeof ConsumersIndexImport - parentRoute: typeof rootRoute - } - '/global_rules/': { - id: '/global_rules/' - path: '/global_rules' - fullPath: '/global_rules' - preLoaderRoute: typeof GlobalrulesIndexImport - parentRoute: typeof rootRoute - } - '/plugin_configs/': { - id: '/plugin_configs/' - path: '/plugin_configs' - fullPath: '/plugin_configs' - preLoaderRoute: typeof PluginconfigsIndexImport - parentRoute: typeof rootRoute - } - '/plugin_metadata/': { - id: '/plugin_metadata/' - path: '/plugin_metadata' - fullPath: '/plugin_metadata' - preLoaderRoute: typeof PluginmetadataIndexImport - parentRoute: typeof rootRoute - } - '/protos/': { - id: '/protos/' - path: '/protos' - fullPath: '/protos' - preLoaderRoute: typeof ProtosIndexImport - parentRoute: typeof rootRoute - } - '/routes/': { - id: '/routes/' - path: '/routes' - fullPath: '/routes' - preLoaderRoute: typeof RoutesIndexImport - parentRoute: typeof rootRoute - } - '/secrets/': { - id: '/secrets/' - path: '/secrets' - fullPath: '/secrets' - preLoaderRoute: typeof SecretsIndexImport - parentRoute: typeof rootRoute - } - '/services/': { - id: '/services/' - path: '/services' - fullPath: '/services' - preLoaderRoute: typeof ServicesIndexImport - parentRoute: typeof rootRoute - } - '/ssls/': { - id: '/ssls/' - path: '/ssls' - fullPath: '/ssls' - preLoaderRoute: typeof SslsIndexImport - parentRoute: typeof rootRoute - } - '/stream_routes/': { - id: '/stream_routes/' - path: '/stream_routes' - fullPath: '/stream_routes' - preLoaderRoute: typeof StreamroutesIndexImport - parentRoute: typeof rootRoute - } - '/upstreams/': { - id: '/upstreams/' - path: '/upstreams' - fullPath: '/upstreams' - preLoaderRoute: typeof UpstreamsIndexImport - parentRoute: typeof rootRoute - } - '/consumer_groups/detail/$id': { - id: '/consumer_groups/detail/$id' - path: '/consumer_groups/detail/$id' - fullPath: '/consumer_groups/detail/$id' - preLoaderRoute: typeof ConsumergroupsDetailIdImport - parentRoute: typeof rootRoute - } - '/consumers/detail/$username': { - id: '/consumers/detail/$username' - path: '/consumers/detail/$username' - fullPath: '/consumers/detail/$username' - preLoaderRoute: typeof ConsumersDetailUsernameImport - parentRoute: typeof rootRoute - } - '/global_rules/detail/$id': { - id: '/global_rules/detail/$id' - path: '/global_rules/detail/$id' - fullPath: '/global_rules/detail/$id' - preLoaderRoute: typeof GlobalrulesDetailIdImport - parentRoute: typeof rootRoute - } - '/plugin_configs/detail/$id': { - id: '/plugin_configs/detail/$id' - path: '/plugin_configs/detail/$id' - fullPath: '/plugin_configs/detail/$id' - preLoaderRoute: typeof PluginconfigsDetailIdImport - parentRoute: typeof rootRoute - } - '/protos/detail/$id': { - id: '/protos/detail/$id' - path: '/protos/detail/$id' - fullPath: '/protos/detail/$id' - preLoaderRoute: typeof ProtosDetailIdImport - parentRoute: typeof rootRoute - } - '/routes/detail/$id': { - id: '/routes/detail/$id' - path: '/routes/detail/$id' - fullPath: '/routes/detail/$id' - preLoaderRoute: typeof RoutesDetailIdImport - parentRoute: typeof rootRoute - } - '/services/detail/$id': { - id: '/services/detail/$id' - path: '/services/detail/$id' - fullPath: '/services/detail/$id' - preLoaderRoute: typeof ServicesDetailIdImport - parentRoute: typeof rootRoute - } - '/ssls/detail/$id': { - id: '/ssls/detail/$id' - path: '/ssls/detail/$id' - fullPath: '/ssls/detail/$id' - preLoaderRoute: typeof SslsDetailIdImport - parentRoute: typeof rootRoute - } - '/stream_routes/detail/$id': { - id: '/stream_routes/detail/$id' - path: '/stream_routes/detail/$id' - fullPath: '/stream_routes/detail/$id' - preLoaderRoute: typeof StreamroutesDetailIdImport - parentRoute: typeof rootRoute - } - '/upstreams/detail/$id': { - id: '/upstreams/detail/$id' - path: '/upstreams/detail/$id' - fullPath: '/upstreams/detail/$id' - preLoaderRoute: typeof UpstreamsDetailIdImport - parentRoute: typeof rootRoute - } - '/secrets/detail/$manager/$id': { - id: '/secrets/detail/$manager/$id' - path: '/secrets/detail/$manager/$id' - fullPath: '/secrets/detail/$manager/$id' - preLoaderRoute: typeof SecretsDetailManagerIdImport - parentRoute: typeof rootRoute - } - '/consumers/detail/$username/': { - id: '/consumers/detail/$username/' - path: '/' - fullPath: '/consumers/detail/$username/' - preLoaderRoute: typeof ConsumersDetailUsernameIndexImport - parentRoute: typeof ConsumersDetailUsernameImport - } - '/services/detail/$id/': { - id: '/services/detail/$id/' - path: '/' - fullPath: '/services/detail/$id/' - preLoaderRoute: typeof ServicesDetailIdIndexImport - parentRoute: typeof ServicesDetailIdImport - } - '/consumers/detail/$username/credentials/add': { - id: '/consumers/detail/$username/credentials/add' - path: '/credentials/add' - fullPath: '/consumers/detail/$username/credentials/add' - preLoaderRoute: typeof ConsumersDetailUsernameCredentialsAddImport - parentRoute: typeof ConsumersDetailUsernameImport - } - '/services/detail/$id/routes/add': { - id: '/services/detail/$id/routes/add' - path: '/routes/add' - fullPath: '/services/detail/$id/routes/add' - preLoaderRoute: typeof ServicesDetailIdRoutesAddImport - parentRoute: typeof ServicesDetailIdImport - } - '/services/detail/$id/stream_routes/add': { - id: '/services/detail/$id/stream_routes/add' - path: '/stream_routes/add' - fullPath: '/services/detail/$id/stream_routes/add' - preLoaderRoute: typeof ServicesDetailIdStreamroutesAddImport - parentRoute: typeof ServicesDetailIdImport - } - '/consumers/detail/$username/credentials/': { - id: '/consumers/detail/$username/credentials/' - path: '/credentials' - fullPath: '/consumers/detail/$username/credentials' - preLoaderRoute: typeof ConsumersDetailUsernameCredentialsIndexImport - parentRoute: typeof ConsumersDetailUsernameImport - } - '/services/detail/$id/routes/': { - id: '/services/detail/$id/routes/' - path: '/routes' - fullPath: '/services/detail/$id/routes' - preLoaderRoute: typeof ServicesDetailIdRoutesIndexImport - parentRoute: typeof ServicesDetailIdImport - } - '/services/detail/$id/stream_routes/': { - id: '/services/detail/$id/stream_routes/' - path: '/stream_routes' - fullPath: '/services/detail/$id/stream_routes' - preLoaderRoute: typeof ServicesDetailIdStreamroutesIndexImport - parentRoute: typeof ServicesDetailIdImport - } - '/consumers/detail/$username/credentials/detail/$id': { - id: '/consumers/detail/$username/credentials/detail/$id' - path: '/credentials/detail/$id' - fullPath: '/consumers/detail/$username/credentials/detail/$id' - preLoaderRoute: typeof ConsumersDetailUsernameCredentialsDetailIdImport - parentRoute: typeof ConsumersDetailUsernameImport - } - '/services/detail/$id/routes/detail/$routeId': { - id: '/services/detail/$id/routes/detail/$routeId' - path: '/routes/detail/$routeId' - fullPath: '/services/detail/$id/routes/detail/$routeId' - preLoaderRoute: typeof ServicesDetailIdRoutesDetailRouteIdImport - parentRoute: typeof ServicesDetailIdImport - } - '/services/detail/$id/stream_routes/detail/$routeId': { - id: '/services/detail/$id/stream_routes/detail/$routeId' - path: '/stream_routes/detail/$routeId' - fullPath: '/services/detail/$id/stream_routes/detail/$routeId' - preLoaderRoute: typeof ServicesDetailIdStreamroutesDetailRouteIdImport - parentRoute: typeof ServicesDetailIdImport - } - } -} - -// Create and export the route tree - -interface ConsumersDetailUsernameRouteChildren { - ConsumersDetailUsernameIndexRoute: typeof ConsumersDetailUsernameIndexRoute - ConsumersDetailUsernameCredentialsAddRoute: typeof ConsumersDetailUsernameCredentialsAddRoute - ConsumersDetailUsernameCredentialsIndexRoute: typeof ConsumersDetailUsernameCredentialsIndexRoute - ConsumersDetailUsernameCredentialsDetailIdRoute: typeof ConsumersDetailUsernameCredentialsDetailIdRoute -} - -const ConsumersDetailUsernameRouteChildren: ConsumersDetailUsernameRouteChildren = - { - ConsumersDetailUsernameIndexRoute: ConsumersDetailUsernameIndexRoute, - ConsumersDetailUsernameCredentialsAddRoute: - ConsumersDetailUsernameCredentialsAddRoute, - ConsumersDetailUsernameCredentialsIndexRoute: - ConsumersDetailUsernameCredentialsIndexRoute, - ConsumersDetailUsernameCredentialsDetailIdRoute: - ConsumersDetailUsernameCredentialsDetailIdRoute, - } - -const ConsumersDetailUsernameRouteWithChildren = - ConsumersDetailUsernameRoute._addFileChildren( - ConsumersDetailUsernameRouteChildren, - ) - -interface ServicesDetailIdRouteChildren { - ServicesDetailIdIndexRoute: typeof ServicesDetailIdIndexRoute - ServicesDetailIdRoutesAddRoute: typeof ServicesDetailIdRoutesAddRoute - ServicesDetailIdStreamroutesAddRoute: typeof ServicesDetailIdStreamroutesAddRoute - ServicesDetailIdRoutesIndexRoute: typeof ServicesDetailIdRoutesIndexRoute - ServicesDetailIdStreamroutesIndexRoute: typeof ServicesDetailIdStreamroutesIndexRoute - ServicesDetailIdRoutesDetailRouteIdRoute: typeof ServicesDetailIdRoutesDetailRouteIdRoute - ServicesDetailIdStreamroutesDetailRouteIdRoute: typeof ServicesDetailIdStreamroutesDetailRouteIdRoute -} - -const ServicesDetailIdRouteChildren: ServicesDetailIdRouteChildren = { - ServicesDetailIdIndexRoute: ServicesDetailIdIndexRoute, - ServicesDetailIdRoutesAddRoute: ServicesDetailIdRoutesAddRoute, - ServicesDetailIdStreamroutesAddRoute: ServicesDetailIdStreamroutesAddRoute, - ServicesDetailIdRoutesIndexRoute: ServicesDetailIdRoutesIndexRoute, - ServicesDetailIdStreamroutesIndexRoute: - ServicesDetailIdStreamroutesIndexRoute, - ServicesDetailIdRoutesDetailRouteIdRoute: - ServicesDetailIdRoutesDetailRouteIdRoute, - ServicesDetailIdStreamroutesDetailRouteIdRoute: - ServicesDetailIdStreamroutesDetailRouteIdRoute, -} - -const ServicesDetailIdRouteWithChildren = - ServicesDetailIdRoute._addFileChildren(ServicesDetailIdRouteChildren) - export interface FileRoutesByFullPath { '/': typeof IndexRoute - '/consumer_groups/add': typeof ConsumergroupsAddRoute + '/consumer_groups/add': typeof Consumer_groupsAddRoute '/consumers/add': typeof ConsumersAddRoute - '/global_rules/add': typeof GlobalrulesAddRoute - '/plugin_configs/add': typeof PluginconfigsAddRoute + '/global_rules/add': typeof Global_rulesAddRoute + '/plugin_configs/add': typeof Plugin_configsAddRoute '/protos/add': typeof ProtosAddRoute '/routes/add': typeof RoutesAddRoute '/secrets/add': typeof SecretsAddRoute '/services/add': typeof ServicesAddRoute '/ssls/add': typeof SslsAddRoute - '/stream_routes/add': typeof StreamroutesAddRoute + '/stream_routes/add': typeof Stream_routesAddRoute '/upstreams/add': typeof UpstreamsAddRoute - '/consumer_groups': typeof ConsumergroupsIndexRoute + '/consumer_groups': typeof Consumer_groupsIndexRoute '/consumers': typeof ConsumersIndexRoute - '/global_rules': typeof GlobalrulesIndexRoute - '/plugin_configs': typeof PluginconfigsIndexRoute - '/plugin_metadata': typeof PluginmetadataIndexRoute + '/global_rules': typeof Global_rulesIndexRoute + '/plugin_configs': typeof Plugin_configsIndexRoute + '/plugin_metadata': typeof Plugin_metadataIndexRoute '/protos': typeof ProtosIndexRoute '/routes': typeof RoutesIndexRoute '/secrets': typeof SecretsIndexRoute '/services': typeof ServicesIndexRoute '/ssls': typeof SslsIndexRoute - '/stream_routes': typeof StreamroutesIndexRoute + '/stream_routes': typeof Stream_routesIndexRoute '/upstreams': typeof UpstreamsIndexRoute - '/consumer_groups/detail/$id': typeof ConsumergroupsDetailIdRoute + '/consumer_groups/detail/$id': typeof Consumer_groupsDetailIdRoute '/consumers/detail/$username': typeof ConsumersDetailUsernameRouteWithChildren - '/global_rules/detail/$id': typeof GlobalrulesDetailIdRoute - '/plugin_configs/detail/$id': typeof PluginconfigsDetailIdRoute + '/global_rules/detail/$id': typeof Global_rulesDetailIdRoute + '/plugin_configs/detail/$id': typeof Plugin_configsDetailIdRoute '/protos/detail/$id': typeof ProtosDetailIdRoute '/routes/detail/$id': typeof RoutesDetailIdRoute '/services/detail/$id': typeof ServicesDetailIdRouteWithChildren '/ssls/detail/$id': typeof SslsDetailIdRoute - '/stream_routes/detail/$id': typeof StreamroutesDetailIdRoute + '/stream_routes/detail/$id': typeof Stream_routesDetailIdRoute '/upstreams/detail/$id': typeof UpstreamsDetailIdRoute '/secrets/detail/$manager/$id': typeof SecretsDetailManagerIdRoute '/consumers/detail/$username/': typeof ConsumersDetailUsernameIndexRoute '/services/detail/$id/': typeof ServicesDetailIdIndexRoute '/consumers/detail/$username/credentials/add': typeof ConsumersDetailUsernameCredentialsAddRoute '/services/detail/$id/routes/add': typeof ServicesDetailIdRoutesAddRoute - '/services/detail/$id/stream_routes/add': typeof ServicesDetailIdStreamroutesAddRoute + '/services/detail/$id/stream_routes/add': typeof ServicesDetailIdStream_routesAddRoute '/consumers/detail/$username/credentials': typeof ConsumersDetailUsernameCredentialsIndexRoute '/services/detail/$id/routes': typeof ServicesDetailIdRoutesIndexRoute - '/services/detail/$id/stream_routes': typeof ServicesDetailIdStreamroutesIndexRoute + '/services/detail/$id/stream_routes': typeof ServicesDetailIdStream_routesIndexRoute '/consumers/detail/$username/credentials/detail/$id': typeof ConsumersDetailUsernameCredentialsDetailIdRoute '/services/detail/$id/routes/detail/$routeId': typeof ServicesDetailIdRoutesDetailRouteIdRoute - '/services/detail/$id/stream_routes/detail/$routeId': typeof ServicesDetailIdStreamroutesDetailRouteIdRoute + '/services/detail/$id/stream_routes/detail/$routeId': typeof ServicesDetailIdStream_routesDetailRouteIdRoute } - export interface FileRoutesByTo { '/': typeof IndexRoute - '/consumer_groups/add': typeof ConsumergroupsAddRoute + '/consumer_groups/add': typeof Consumer_groupsAddRoute '/consumers/add': typeof ConsumersAddRoute - '/global_rules/add': typeof GlobalrulesAddRoute - '/plugin_configs/add': typeof PluginconfigsAddRoute + '/global_rules/add': typeof Global_rulesAddRoute + '/plugin_configs/add': typeof Plugin_configsAddRoute '/protos/add': typeof ProtosAddRoute '/routes/add': typeof RoutesAddRoute '/secrets/add': typeof SecretsAddRoute '/services/add': typeof ServicesAddRoute '/ssls/add': typeof SslsAddRoute - '/stream_routes/add': typeof StreamroutesAddRoute + '/stream_routes/add': typeof Stream_routesAddRoute '/upstreams/add': typeof UpstreamsAddRoute - '/consumer_groups': typeof ConsumergroupsIndexRoute + '/consumer_groups': typeof Consumer_groupsIndexRoute '/consumers': typeof ConsumersIndexRoute - '/global_rules': typeof GlobalrulesIndexRoute - '/plugin_configs': typeof PluginconfigsIndexRoute - '/plugin_metadata': typeof PluginmetadataIndexRoute + '/global_rules': typeof Global_rulesIndexRoute + '/plugin_configs': typeof Plugin_configsIndexRoute + '/plugin_metadata': typeof Plugin_metadataIndexRoute '/protos': typeof ProtosIndexRoute '/routes': typeof RoutesIndexRoute '/secrets': typeof SecretsIndexRoute '/services': typeof ServicesIndexRoute '/ssls': typeof SslsIndexRoute - '/stream_routes': typeof StreamroutesIndexRoute + '/stream_routes': typeof Stream_routesIndexRoute '/upstreams': typeof UpstreamsIndexRoute - '/consumer_groups/detail/$id': typeof ConsumergroupsDetailIdRoute - '/global_rules/detail/$id': typeof GlobalrulesDetailIdRoute - '/plugin_configs/detail/$id': typeof PluginconfigsDetailIdRoute + '/consumer_groups/detail/$id': typeof Consumer_groupsDetailIdRoute + '/global_rules/detail/$id': typeof Global_rulesDetailIdRoute + '/plugin_configs/detail/$id': typeof Plugin_configsDetailIdRoute '/protos/detail/$id': typeof ProtosDetailIdRoute '/routes/detail/$id': typeof RoutesDetailIdRoute '/ssls/detail/$id': typeof SslsDetailIdRoute - '/stream_routes/detail/$id': typeof StreamroutesDetailIdRoute + '/stream_routes/detail/$id': typeof Stream_routesDetailIdRoute '/upstreams/detail/$id': typeof UpstreamsDetailIdRoute '/secrets/detail/$manager/$id': typeof SecretsDetailManagerIdRoute '/consumers/detail/$username': typeof ConsumersDetailUsernameIndexRoute '/services/detail/$id': typeof ServicesDetailIdIndexRoute '/consumers/detail/$username/credentials/add': typeof ConsumersDetailUsernameCredentialsAddRoute '/services/detail/$id/routes/add': typeof ServicesDetailIdRoutesAddRoute - '/services/detail/$id/stream_routes/add': typeof ServicesDetailIdStreamroutesAddRoute + '/services/detail/$id/stream_routes/add': typeof ServicesDetailIdStream_routesAddRoute '/consumers/detail/$username/credentials': typeof ConsumersDetailUsernameCredentialsIndexRoute '/services/detail/$id/routes': typeof ServicesDetailIdRoutesIndexRoute - '/services/detail/$id/stream_routes': typeof ServicesDetailIdStreamroutesIndexRoute + '/services/detail/$id/stream_routes': typeof ServicesDetailIdStream_routesIndexRoute '/consumers/detail/$username/credentials/detail/$id': typeof ConsumersDetailUsernameCredentialsDetailIdRoute '/services/detail/$id/routes/detail/$routeId': typeof ServicesDetailIdRoutesDetailRouteIdRoute - '/services/detail/$id/stream_routes/detail/$routeId': typeof ServicesDetailIdStreamroutesDetailRouteIdRoute + '/services/detail/$id/stream_routes/detail/$routeId': typeof ServicesDetailIdStream_routesDetailRouteIdRoute } - export interface FileRoutesById { - __root__: typeof rootRoute + __root__: typeof rootRouteImport '/': typeof IndexRoute - '/consumer_groups/add': typeof ConsumergroupsAddRoute + '/consumer_groups/add': typeof Consumer_groupsAddRoute '/consumers/add': typeof ConsumersAddRoute - '/global_rules/add': typeof GlobalrulesAddRoute - '/plugin_configs/add': typeof PluginconfigsAddRoute + '/global_rules/add': typeof Global_rulesAddRoute + '/plugin_configs/add': typeof Plugin_configsAddRoute '/protos/add': typeof ProtosAddRoute '/routes/add': typeof RoutesAddRoute '/secrets/add': typeof SecretsAddRoute '/services/add': typeof ServicesAddRoute '/ssls/add': typeof SslsAddRoute - '/stream_routes/add': typeof StreamroutesAddRoute + '/stream_routes/add': typeof Stream_routesAddRoute '/upstreams/add': typeof UpstreamsAddRoute - '/consumer_groups/': typeof ConsumergroupsIndexRoute + '/consumer_groups/': typeof Consumer_groupsIndexRoute '/consumers/': typeof ConsumersIndexRoute - '/global_rules/': typeof GlobalrulesIndexRoute - '/plugin_configs/': typeof PluginconfigsIndexRoute - '/plugin_metadata/': typeof PluginmetadataIndexRoute + '/global_rules/': typeof Global_rulesIndexRoute + '/plugin_configs/': typeof Plugin_configsIndexRoute + '/plugin_metadata/': typeof Plugin_metadataIndexRoute '/protos/': typeof ProtosIndexRoute '/routes/': typeof RoutesIndexRoute '/secrets/': typeof SecretsIndexRoute '/services/': typeof ServicesIndexRoute '/ssls/': typeof SslsIndexRoute - '/stream_routes/': typeof StreamroutesIndexRoute + '/stream_routes/': typeof Stream_routesIndexRoute '/upstreams/': typeof UpstreamsIndexRoute - '/consumer_groups/detail/$id': typeof ConsumergroupsDetailIdRoute + '/consumer_groups/detail/$id': typeof Consumer_groupsDetailIdRoute '/consumers/detail/$username': typeof ConsumersDetailUsernameRouteWithChildren - '/global_rules/detail/$id': typeof GlobalrulesDetailIdRoute - '/plugin_configs/detail/$id': typeof PluginconfigsDetailIdRoute + '/global_rules/detail/$id': typeof Global_rulesDetailIdRoute + '/plugin_configs/detail/$id': typeof Plugin_configsDetailIdRoute '/protos/detail/$id': typeof ProtosDetailIdRoute '/routes/detail/$id': typeof RoutesDetailIdRoute '/services/detail/$id': typeof ServicesDetailIdRouteWithChildren '/ssls/detail/$id': typeof SslsDetailIdRoute - '/stream_routes/detail/$id': typeof StreamroutesDetailIdRoute + '/stream_routes/detail/$id': typeof Stream_routesDetailIdRoute '/upstreams/detail/$id': typeof UpstreamsDetailIdRoute '/secrets/detail/$manager/$id': typeof SecretsDetailManagerIdRoute '/consumers/detail/$username/': typeof ConsumersDetailUsernameIndexRoute '/services/detail/$id/': typeof ServicesDetailIdIndexRoute '/consumers/detail/$username/credentials/add': typeof ConsumersDetailUsernameCredentialsAddRoute '/services/detail/$id/routes/add': typeof ServicesDetailIdRoutesAddRoute - '/services/detail/$id/stream_routes/add': typeof ServicesDetailIdStreamroutesAddRoute + '/services/detail/$id/stream_routes/add': typeof ServicesDetailIdStream_routesAddRoute '/consumers/detail/$username/credentials/': typeof ConsumersDetailUsernameCredentialsIndexRoute '/services/detail/$id/routes/': typeof ServicesDetailIdRoutesIndexRoute - '/services/detail/$id/stream_routes/': typeof ServicesDetailIdStreamroutesIndexRoute + '/services/detail/$id/stream_routes/': typeof ServicesDetailIdStream_routesIndexRoute '/consumers/detail/$username/credentials/detail/$id': typeof ConsumersDetailUsernameCredentialsDetailIdRoute '/services/detail/$id/routes/detail/$routeId': typeof ServicesDetailIdRoutesDetailRouteIdRoute - '/services/detail/$id/stream_routes/detail/$routeId': typeof ServicesDetailIdStreamroutesDetailRouteIdRoute + '/services/detail/$id/stream_routes/detail/$routeId': typeof ServicesDetailIdStream_routesDetailRouteIdRoute } - export interface FileRouteTypes { fileRoutesByFullPath: FileRoutesByFullPath fullPaths: @@ -1016,294 +585,457 @@ export interface FileRouteTypes { | '/services/detail/$id/stream_routes/detail/$routeId' fileRoutesById: FileRoutesById } - export interface RootRouteChildren { IndexRoute: typeof IndexRoute - ConsumergroupsAddRoute: typeof ConsumergroupsAddRoute + Consumer_groupsAddRoute: typeof Consumer_groupsAddRoute ConsumersAddRoute: typeof ConsumersAddRoute - GlobalrulesAddRoute: typeof GlobalrulesAddRoute - PluginconfigsAddRoute: typeof PluginconfigsAddRoute + Global_rulesAddRoute: typeof Global_rulesAddRoute + Plugin_configsAddRoute: typeof Plugin_configsAddRoute ProtosAddRoute: typeof ProtosAddRoute RoutesAddRoute: typeof RoutesAddRoute SecretsAddRoute: typeof SecretsAddRoute ServicesAddRoute: typeof ServicesAddRoute SslsAddRoute: typeof SslsAddRoute - StreamroutesAddRoute: typeof StreamroutesAddRoute + Stream_routesAddRoute: typeof Stream_routesAddRoute UpstreamsAddRoute: typeof UpstreamsAddRoute - ConsumergroupsIndexRoute: typeof ConsumergroupsIndexRoute + Consumer_groupsIndexRoute: typeof Consumer_groupsIndexRoute ConsumersIndexRoute: typeof ConsumersIndexRoute - GlobalrulesIndexRoute: typeof GlobalrulesIndexRoute - PluginconfigsIndexRoute: typeof PluginconfigsIndexRoute - PluginmetadataIndexRoute: typeof PluginmetadataIndexRoute + Global_rulesIndexRoute: typeof Global_rulesIndexRoute + Plugin_configsIndexRoute: typeof Plugin_configsIndexRoute + Plugin_metadataIndexRoute: typeof Plugin_metadataIndexRoute ProtosIndexRoute: typeof ProtosIndexRoute RoutesIndexRoute: typeof RoutesIndexRoute SecretsIndexRoute: typeof SecretsIndexRoute ServicesIndexRoute: typeof ServicesIndexRoute SslsIndexRoute: typeof SslsIndexRoute - StreamroutesIndexRoute: typeof StreamroutesIndexRoute + Stream_routesIndexRoute: typeof Stream_routesIndexRoute UpstreamsIndexRoute: typeof UpstreamsIndexRoute - ConsumergroupsDetailIdRoute: typeof ConsumergroupsDetailIdRoute + Consumer_groupsDetailIdRoute: typeof Consumer_groupsDetailIdRoute ConsumersDetailUsernameRoute: typeof ConsumersDetailUsernameRouteWithChildren - GlobalrulesDetailIdRoute: typeof GlobalrulesDetailIdRoute - PluginconfigsDetailIdRoute: typeof PluginconfigsDetailIdRoute + Global_rulesDetailIdRoute: typeof Global_rulesDetailIdRoute + Plugin_configsDetailIdRoute: typeof Plugin_configsDetailIdRoute ProtosDetailIdRoute: typeof ProtosDetailIdRoute RoutesDetailIdRoute: typeof RoutesDetailIdRoute ServicesDetailIdRoute: typeof ServicesDetailIdRouteWithChildren SslsDetailIdRoute: typeof SslsDetailIdRoute - StreamroutesDetailIdRoute: typeof StreamroutesDetailIdRoute + Stream_routesDetailIdRoute: typeof Stream_routesDetailIdRoute UpstreamsDetailIdRoute: typeof UpstreamsDetailIdRoute SecretsDetailManagerIdRoute: typeof SecretsDetailManagerIdRoute } +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexRouteImport + parentRoute: typeof rootRouteImport + } + '/upstreams/': { + id: '/upstreams/' + path: '/upstreams' + fullPath: '/upstreams' + preLoaderRoute: typeof UpstreamsIndexRouteImport + parentRoute: typeof rootRouteImport + } + '/stream_routes/': { + id: '/stream_routes/' + path: '/stream_routes' + fullPath: '/stream_routes' + preLoaderRoute: typeof Stream_routesIndexRouteImport + parentRoute: typeof rootRouteImport + } + '/ssls/': { + id: '/ssls/' + path: '/ssls' + fullPath: '/ssls' + preLoaderRoute: typeof SslsIndexRouteImport + parentRoute: typeof rootRouteImport + } + '/services/': { + id: '/services/' + path: '/services' + fullPath: '/services' + preLoaderRoute: typeof ServicesIndexRouteImport + parentRoute: typeof rootRouteImport + } + '/secrets/': { + id: '/secrets/' + path: '/secrets' + fullPath: '/secrets' + preLoaderRoute: typeof SecretsIndexRouteImport + parentRoute: typeof rootRouteImport + } + '/routes/': { + id: '/routes/' + path: '/routes' + fullPath: '/routes' + preLoaderRoute: typeof RoutesIndexRouteImport + parentRoute: typeof rootRouteImport + } + '/protos/': { + id: '/protos/' + path: '/protos' + fullPath: '/protos' + preLoaderRoute: typeof ProtosIndexRouteImport + parentRoute: typeof rootRouteImport + } + '/plugin_metadata/': { + id: '/plugin_metadata/' + path: '/plugin_metadata' + fullPath: '/plugin_metadata' + preLoaderRoute: typeof Plugin_metadataIndexRouteImport + parentRoute: typeof rootRouteImport + } + '/plugin_configs/': { + id: '/plugin_configs/' + path: '/plugin_configs' + fullPath: '/plugin_configs' + preLoaderRoute: typeof Plugin_configsIndexRouteImport + parentRoute: typeof rootRouteImport + } + '/global_rules/': { + id: '/global_rules/' + path: '/global_rules' + fullPath: '/global_rules' + preLoaderRoute: typeof Global_rulesIndexRouteImport + parentRoute: typeof rootRouteImport + } + '/consumers/': { + id: '/consumers/' + path: '/consumers' + fullPath: '/consumers' + preLoaderRoute: typeof ConsumersIndexRouteImport + parentRoute: typeof rootRouteImport + } + '/consumer_groups/': { + id: '/consumer_groups/' + path: '/consumer_groups' + fullPath: '/consumer_groups' + preLoaderRoute: typeof Consumer_groupsIndexRouteImport + parentRoute: typeof rootRouteImport + } + '/upstreams/add': { + id: '/upstreams/add' + path: '/upstreams/add' + fullPath: '/upstreams/add' + preLoaderRoute: typeof UpstreamsAddRouteImport + parentRoute: typeof rootRouteImport + } + '/stream_routes/add': { + id: '/stream_routes/add' + path: '/stream_routes/add' + fullPath: '/stream_routes/add' + preLoaderRoute: typeof Stream_routesAddRouteImport + parentRoute: typeof rootRouteImport + } + '/ssls/add': { + id: '/ssls/add' + path: '/ssls/add' + fullPath: '/ssls/add' + preLoaderRoute: typeof SslsAddRouteImport + parentRoute: typeof rootRouteImport + } + '/services/add': { + id: '/services/add' + path: '/services/add' + fullPath: '/services/add' + preLoaderRoute: typeof ServicesAddRouteImport + parentRoute: typeof rootRouteImport + } + '/secrets/add': { + id: '/secrets/add' + path: '/secrets/add' + fullPath: '/secrets/add' + preLoaderRoute: typeof SecretsAddRouteImport + parentRoute: typeof rootRouteImport + } + '/routes/add': { + id: '/routes/add' + path: '/routes/add' + fullPath: '/routes/add' + preLoaderRoute: typeof RoutesAddRouteImport + parentRoute: typeof rootRouteImport + } + '/protos/add': { + id: '/protos/add' + path: '/protos/add' + fullPath: '/protos/add' + preLoaderRoute: typeof ProtosAddRouteImport + parentRoute: typeof rootRouteImport + } + '/plugin_configs/add': { + id: '/plugin_configs/add' + path: '/plugin_configs/add' + fullPath: '/plugin_configs/add' + preLoaderRoute: typeof Plugin_configsAddRouteImport + parentRoute: typeof rootRouteImport + } + '/global_rules/add': { + id: '/global_rules/add' + path: '/global_rules/add' + fullPath: '/global_rules/add' + preLoaderRoute: typeof Global_rulesAddRouteImport + parentRoute: typeof rootRouteImport + } + '/consumers/add': { + id: '/consumers/add' + path: '/consumers/add' + fullPath: '/consumers/add' + preLoaderRoute: typeof ConsumersAddRouteImport + parentRoute: typeof rootRouteImport + } + '/consumer_groups/add': { + id: '/consumer_groups/add' + path: '/consumer_groups/add' + fullPath: '/consumer_groups/add' + preLoaderRoute: typeof Consumer_groupsAddRouteImport + parentRoute: typeof rootRouteImport + } + '/upstreams/detail/$id': { + id: '/upstreams/detail/$id' + path: '/upstreams/detail/$id' + fullPath: '/upstreams/detail/$id' + preLoaderRoute: typeof UpstreamsDetailIdRouteImport + parentRoute: typeof rootRouteImport + } + '/stream_routes/detail/$id': { + id: '/stream_routes/detail/$id' + path: '/stream_routes/detail/$id' + fullPath: '/stream_routes/detail/$id' + preLoaderRoute: typeof Stream_routesDetailIdRouteImport + parentRoute: typeof rootRouteImport + } + '/ssls/detail/$id': { + id: '/ssls/detail/$id' + path: '/ssls/detail/$id' + fullPath: '/ssls/detail/$id' + preLoaderRoute: typeof SslsDetailIdRouteImport + parentRoute: typeof rootRouteImport + } + '/services/detail/$id': { + id: '/services/detail/$id' + path: '/services/detail/$id' + fullPath: '/services/detail/$id' + preLoaderRoute: typeof ServicesDetailIdRouteImport + parentRoute: typeof rootRouteImport + } + '/routes/detail/$id': { + id: '/routes/detail/$id' + path: '/routes/detail/$id' + fullPath: '/routes/detail/$id' + preLoaderRoute: typeof RoutesDetailIdRouteImport + parentRoute: typeof rootRouteImport + } + '/protos/detail/$id': { + id: '/protos/detail/$id' + path: '/protos/detail/$id' + fullPath: '/protos/detail/$id' + preLoaderRoute: typeof ProtosDetailIdRouteImport + parentRoute: typeof rootRouteImport + } + '/plugin_configs/detail/$id': { + id: '/plugin_configs/detail/$id' + path: '/plugin_configs/detail/$id' + fullPath: '/plugin_configs/detail/$id' + preLoaderRoute: typeof Plugin_configsDetailIdRouteImport + parentRoute: typeof rootRouteImport + } + '/global_rules/detail/$id': { + id: '/global_rules/detail/$id' + path: '/global_rules/detail/$id' + fullPath: '/global_rules/detail/$id' + preLoaderRoute: typeof Global_rulesDetailIdRouteImport + parentRoute: typeof rootRouteImport + } + '/consumers/detail/$username': { + id: '/consumers/detail/$username' + path: '/consumers/detail/$username' + fullPath: '/consumers/detail/$username' + preLoaderRoute: typeof ConsumersDetailUsernameRouteImport + parentRoute: typeof rootRouteImport + } + '/consumer_groups/detail/$id': { + id: '/consumer_groups/detail/$id' + path: '/consumer_groups/detail/$id' + fullPath: '/consumer_groups/detail/$id' + preLoaderRoute: typeof Consumer_groupsDetailIdRouteImport + parentRoute: typeof rootRouteImport + } + '/services/detail/$id/': { + id: '/services/detail/$id/' + path: '/' + fullPath: '/services/detail/$id/' + preLoaderRoute: typeof ServicesDetailIdIndexRouteImport + parentRoute: typeof ServicesDetailIdRoute + } + '/consumers/detail/$username/': { + id: '/consumers/detail/$username/' + path: '/' + fullPath: '/consumers/detail/$username/' + preLoaderRoute: typeof ConsumersDetailUsernameIndexRouteImport + parentRoute: typeof ConsumersDetailUsernameRoute + } + '/secrets/detail/$manager/$id': { + id: '/secrets/detail/$manager/$id' + path: '/secrets/detail/$manager/$id' + fullPath: '/secrets/detail/$manager/$id' + preLoaderRoute: typeof SecretsDetailManagerIdRouteImport + parentRoute: typeof rootRouteImport + } + '/services/detail/$id/stream_routes/': { + id: '/services/detail/$id/stream_routes/' + path: '/stream_routes' + fullPath: '/services/detail/$id/stream_routes' + preLoaderRoute: typeof ServicesDetailIdStream_routesIndexRouteImport + parentRoute: typeof ServicesDetailIdRoute + } + '/services/detail/$id/routes/': { + id: '/services/detail/$id/routes/' + path: '/routes' + fullPath: '/services/detail/$id/routes' + preLoaderRoute: typeof ServicesDetailIdRoutesIndexRouteImport + parentRoute: typeof ServicesDetailIdRoute + } + '/consumers/detail/$username/credentials/': { + id: '/consumers/detail/$username/credentials/' + path: '/credentials' + fullPath: '/consumers/detail/$username/credentials' + preLoaderRoute: typeof ConsumersDetailUsernameCredentialsIndexRouteImport + parentRoute: typeof ConsumersDetailUsernameRoute + } + '/services/detail/$id/stream_routes/add': { + id: '/services/detail/$id/stream_routes/add' + path: '/stream_routes/add' + fullPath: '/services/detail/$id/stream_routes/add' + preLoaderRoute: typeof ServicesDetailIdStream_routesAddRouteImport + parentRoute: typeof ServicesDetailIdRoute + } + '/services/detail/$id/routes/add': { + id: '/services/detail/$id/routes/add' + path: '/routes/add' + fullPath: '/services/detail/$id/routes/add' + preLoaderRoute: typeof ServicesDetailIdRoutesAddRouteImport + parentRoute: typeof ServicesDetailIdRoute + } + '/consumers/detail/$username/credentials/add': { + id: '/consumers/detail/$username/credentials/add' + path: '/credentials/add' + fullPath: '/consumers/detail/$username/credentials/add' + preLoaderRoute: typeof ConsumersDetailUsernameCredentialsAddRouteImport + parentRoute: typeof ConsumersDetailUsernameRoute + } + '/services/detail/$id/stream_routes/detail/$routeId': { + id: '/services/detail/$id/stream_routes/detail/$routeId' + path: '/stream_routes/detail/$routeId' + fullPath: '/services/detail/$id/stream_routes/detail/$routeId' + preLoaderRoute: typeof ServicesDetailIdStream_routesDetailRouteIdRouteImport + parentRoute: typeof ServicesDetailIdRoute + } + '/services/detail/$id/routes/detail/$routeId': { + id: '/services/detail/$id/routes/detail/$routeId' + path: '/routes/detail/$routeId' + fullPath: '/services/detail/$id/routes/detail/$routeId' + preLoaderRoute: typeof ServicesDetailIdRoutesDetailRouteIdRouteImport + parentRoute: typeof ServicesDetailIdRoute + } + '/consumers/detail/$username/credentials/detail/$id': { + id: '/consumers/detail/$username/credentials/detail/$id' + path: '/credentials/detail/$id' + fullPath: '/consumers/detail/$username/credentials/detail/$id' + preLoaderRoute: typeof ConsumersDetailUsernameCredentialsDetailIdRouteImport + parentRoute: typeof ConsumersDetailUsernameRoute + } + } +} + +interface ConsumersDetailUsernameRouteChildren { + ConsumersDetailUsernameIndexRoute: typeof ConsumersDetailUsernameIndexRoute + ConsumersDetailUsernameCredentialsAddRoute: typeof ConsumersDetailUsernameCredentialsAddRoute + ConsumersDetailUsernameCredentialsIndexRoute: typeof ConsumersDetailUsernameCredentialsIndexRoute + ConsumersDetailUsernameCredentialsDetailIdRoute: typeof ConsumersDetailUsernameCredentialsDetailIdRoute +} + +const ConsumersDetailUsernameRouteChildren: ConsumersDetailUsernameRouteChildren = + { + ConsumersDetailUsernameIndexRoute: ConsumersDetailUsernameIndexRoute, + ConsumersDetailUsernameCredentialsAddRoute: + ConsumersDetailUsernameCredentialsAddRoute, + ConsumersDetailUsernameCredentialsIndexRoute: + ConsumersDetailUsernameCredentialsIndexRoute, + ConsumersDetailUsernameCredentialsDetailIdRoute: + ConsumersDetailUsernameCredentialsDetailIdRoute, + } + +const ConsumersDetailUsernameRouteWithChildren = + ConsumersDetailUsernameRoute._addFileChildren( + ConsumersDetailUsernameRouteChildren, + ) + +interface ServicesDetailIdRouteChildren { + ServicesDetailIdIndexRoute: typeof ServicesDetailIdIndexRoute + ServicesDetailIdRoutesAddRoute: typeof ServicesDetailIdRoutesAddRoute + ServicesDetailIdStream_routesAddRoute: typeof ServicesDetailIdStream_routesAddRoute + ServicesDetailIdRoutesIndexRoute: typeof ServicesDetailIdRoutesIndexRoute + ServicesDetailIdStream_routesIndexRoute: typeof ServicesDetailIdStream_routesIndexRoute + ServicesDetailIdRoutesDetailRouteIdRoute: typeof ServicesDetailIdRoutesDetailRouteIdRoute + ServicesDetailIdStream_routesDetailRouteIdRoute: typeof ServicesDetailIdStream_routesDetailRouteIdRoute +} + +const ServicesDetailIdRouteChildren: ServicesDetailIdRouteChildren = { + ServicesDetailIdIndexRoute: ServicesDetailIdIndexRoute, + ServicesDetailIdRoutesAddRoute: ServicesDetailIdRoutesAddRoute, + ServicesDetailIdStream_routesAddRoute: ServicesDetailIdStream_routesAddRoute, + ServicesDetailIdRoutesIndexRoute: ServicesDetailIdRoutesIndexRoute, + ServicesDetailIdStream_routesIndexRoute: + ServicesDetailIdStream_routesIndexRoute, + ServicesDetailIdRoutesDetailRouteIdRoute: + ServicesDetailIdRoutesDetailRouteIdRoute, + ServicesDetailIdStream_routesDetailRouteIdRoute: + ServicesDetailIdStream_routesDetailRouteIdRoute, +} + +const ServicesDetailIdRouteWithChildren = + ServicesDetailIdRoute._addFileChildren(ServicesDetailIdRouteChildren) + const rootRouteChildren: RootRouteChildren = { IndexRoute: IndexRoute, - ConsumergroupsAddRoute: ConsumergroupsAddRoute, + Consumer_groupsAddRoute: Consumer_groupsAddRoute, ConsumersAddRoute: ConsumersAddRoute, - GlobalrulesAddRoute: GlobalrulesAddRoute, - PluginconfigsAddRoute: PluginconfigsAddRoute, + Global_rulesAddRoute: Global_rulesAddRoute, + Plugin_configsAddRoute: Plugin_configsAddRoute, ProtosAddRoute: ProtosAddRoute, RoutesAddRoute: RoutesAddRoute, SecretsAddRoute: SecretsAddRoute, ServicesAddRoute: ServicesAddRoute, SslsAddRoute: SslsAddRoute, - StreamroutesAddRoute: StreamroutesAddRoute, + Stream_routesAddRoute: Stream_routesAddRoute, UpstreamsAddRoute: UpstreamsAddRoute, - ConsumergroupsIndexRoute: ConsumergroupsIndexRoute, + Consumer_groupsIndexRoute: Consumer_groupsIndexRoute, ConsumersIndexRoute: ConsumersIndexRoute, - GlobalrulesIndexRoute: GlobalrulesIndexRoute, - PluginconfigsIndexRoute: PluginconfigsIndexRoute, - PluginmetadataIndexRoute: PluginmetadataIndexRoute, + Global_rulesIndexRoute: Global_rulesIndexRoute, + Plugin_configsIndexRoute: Plugin_configsIndexRoute, + Plugin_metadataIndexRoute: Plugin_metadataIndexRoute, ProtosIndexRoute: ProtosIndexRoute, RoutesIndexRoute: RoutesIndexRoute, SecretsIndexRoute: SecretsIndexRoute, ServicesIndexRoute: ServicesIndexRoute, SslsIndexRoute: SslsIndexRoute, - StreamroutesIndexRoute: StreamroutesIndexRoute, + Stream_routesIndexRoute: Stream_routesIndexRoute, UpstreamsIndexRoute: UpstreamsIndexRoute, - ConsumergroupsDetailIdRoute: ConsumergroupsDetailIdRoute, + Consumer_groupsDetailIdRoute: Consumer_groupsDetailIdRoute, ConsumersDetailUsernameRoute: ConsumersDetailUsernameRouteWithChildren, - GlobalrulesDetailIdRoute: GlobalrulesDetailIdRoute, - PluginconfigsDetailIdRoute: PluginconfigsDetailIdRoute, + Global_rulesDetailIdRoute: Global_rulesDetailIdRoute, + Plugin_configsDetailIdRoute: Plugin_configsDetailIdRoute, ProtosDetailIdRoute: ProtosDetailIdRoute, RoutesDetailIdRoute: RoutesDetailIdRoute, ServicesDetailIdRoute: ServicesDetailIdRouteWithChildren, SslsDetailIdRoute: SslsDetailIdRoute, - StreamroutesDetailIdRoute: StreamroutesDetailIdRoute, + Stream_routesDetailIdRoute: Stream_routesDetailIdRoute, UpstreamsDetailIdRoute: UpstreamsDetailIdRoute, SecretsDetailManagerIdRoute: SecretsDetailManagerIdRoute, } - -export const routeTree = rootRoute +export const routeTree = rootRouteImport ._addFileChildren(rootRouteChildren) ._addFileTypes() - -/* ROUTE_MANIFEST_START -{ - "routes": { - "__root__": { - "filePath": "__root.tsx", - "children": [ - "/", - "/consumer_groups/add", - "/consumers/add", - "/global_rules/add", - "/plugin_configs/add", - "/protos/add", - "/routes/add", - "/secrets/add", - "/services/add", - "/ssls/add", - "/stream_routes/add", - "/upstreams/add", - "/consumer_groups/", - "/consumers/", - "/global_rules/", - "/plugin_configs/", - "/plugin_metadata/", - "/protos/", - "/routes/", - "/secrets/", - "/services/", - "/ssls/", - "/stream_routes/", - "/upstreams/", - "/consumer_groups/detail/$id", - "/consumers/detail/$username", - "/global_rules/detail/$id", - "/plugin_configs/detail/$id", - "/protos/detail/$id", - "/routes/detail/$id", - "/services/detail/$id", - "/ssls/detail/$id", - "/stream_routes/detail/$id", - "/upstreams/detail/$id", - "/secrets/detail/$manager/$id" - ] - }, - "/": { - "filePath": "index.tsx" - }, - "/consumer_groups/add": { - "filePath": "consumer_groups/add.tsx" - }, - "/consumers/add": { - "filePath": "consumers/add.tsx" - }, - "/global_rules/add": { - "filePath": "global_rules/add.tsx" - }, - "/plugin_configs/add": { - "filePath": "plugin_configs/add.tsx" - }, - "/protos/add": { - "filePath": "protos/add.tsx" - }, - "/routes/add": { - "filePath": "routes/add.tsx" - }, - "/secrets/add": { - "filePath": "secrets/add.tsx" - }, - "/services/add": { - "filePath": "services/add.tsx" - }, - "/ssls/add": { - "filePath": "ssls/add.tsx" - }, - "/stream_routes/add": { - "filePath": "stream_routes/add.tsx" - }, - "/upstreams/add": { - "filePath": "upstreams/add.tsx" - }, - "/consumer_groups/": { - "filePath": "consumer_groups/index.tsx" - }, - "/consumers/": { - "filePath": "consumers/index.tsx" - }, - "/global_rules/": { - "filePath": "global_rules/index.tsx" - }, - "/plugin_configs/": { - "filePath": "plugin_configs/index.tsx" - }, - "/plugin_metadata/": { - "filePath": "plugin_metadata/index.tsx" - }, - "/protos/": { - "filePath": "protos/index.tsx" - }, - "/routes/": { - "filePath": "routes/index.tsx" - }, - "/secrets/": { - "filePath": "secrets/index.tsx" - }, - "/services/": { - "filePath": "services/index.tsx" - }, - "/ssls/": { - "filePath": "ssls/index.tsx" - }, - "/stream_routes/": { - "filePath": "stream_routes/index.tsx" - }, - "/upstreams/": { - "filePath": "upstreams/index.tsx" - }, - "/consumer_groups/detail/$id": { - "filePath": "consumer_groups/detail.$id.tsx" - }, - "/consumers/detail/$username": { - "filePath": "consumers/detail.$username.tsx", - "children": [ - "/consumers/detail/$username/", - "/consumers/detail/$username/credentials/add", - "/consumers/detail/$username/credentials/", - "/consumers/detail/$username/credentials/detail/$id" - ] - }, - "/global_rules/detail/$id": { - "filePath": "global_rules/detail.$id.tsx" - }, - "/plugin_configs/detail/$id": { - "filePath": "plugin_configs/detail.$id.tsx" - }, - "/protos/detail/$id": { - "filePath": "protos/detail.$id.tsx" - }, - "/routes/detail/$id": { - "filePath": "routes/detail.$id.tsx" - }, - "/services/detail/$id": { - "filePath": "services/detail.$id.tsx", - "children": [ - "/services/detail/$id/", - "/services/detail/$id/routes/add", - "/services/detail/$id/stream_routes/add", - "/services/detail/$id/routes/", - "/services/detail/$id/stream_routes/", - "/services/detail/$id/routes/detail/$routeId", - "/services/detail/$id/stream_routes/detail/$routeId" - ] - }, - "/ssls/detail/$id": { - "filePath": "ssls/detail.$id.tsx" - }, - "/stream_routes/detail/$id": { - "filePath": "stream_routes/detail.$id.tsx" - }, - "/upstreams/detail/$id": { - "filePath": "upstreams/detail.$id.tsx" - }, - "/secrets/detail/$manager/$id": { - "filePath": "secrets/detail.$manager.$id.tsx" - }, - "/consumers/detail/$username/": { - "filePath": "consumers/detail.$username/index.tsx", - "parent": "/consumers/detail/$username" - }, - "/services/detail/$id/": { - "filePath": "services/detail.$id/index.tsx", - "parent": "/services/detail/$id" - }, - "/consumers/detail/$username/credentials/add": { - "filePath": "consumers/detail.$username/credentials/add.tsx", - "parent": "/consumers/detail/$username" - }, - "/services/detail/$id/routes/add": { - "filePath": "services/detail.$id/routes/add.tsx", - "parent": "/services/detail/$id" - }, - "/services/detail/$id/stream_routes/add": { - "filePath": "services/detail.$id/stream_routes/add.tsx", - "parent": "/services/detail/$id" - }, - "/consumers/detail/$username/credentials/": { - "filePath": "consumers/detail.$username/credentials/index.tsx", - "parent": "/consumers/detail/$username" - }, - "/services/detail/$id/routes/": { - "filePath": "services/detail.$id/routes/index.tsx", - "parent": "/services/detail/$id" - }, - "/services/detail/$id/stream_routes/": { - "filePath": "services/detail.$id/stream_routes/index.tsx", - "parent": "/services/detail/$id" - }, - "/consumers/detail/$username/credentials/detail/$id": { - "filePath": "consumers/detail.$username/credentials/detail.$id.tsx", - "parent": "/consumers/detail/$username" - }, - "/services/detail/$id/routes/detail/$routeId": { - "filePath": "services/detail.$id/routes/detail.$routeId.tsx", - "parent": "/services/detail/$id" - }, - "/services/detail/$id/stream_routes/detail/$routeId": { - "filePath": "services/detail.$id/stream_routes/detail.$routeId.tsx", - "parent": "/services/detail/$id" - } - } -} -ROUTE_MANIFEST_END */ From c3aec7bb3cf19a42fc86909390612961bf1536d6 Mon Sep 17 00:00:00 2001 From: Deep Shekhar Singh Date: Sun, 15 Feb 2026 23:49:17 +0530 Subject: [PATCH 04/20] fix: update test files to ensure proper functionality and add type safety in upstream form --- e2e/tests/consumer_groups.list.spec.ts | 1 + e2e/tests/consumers.list.spec.ts | 1 + e2e/tests/hot-path.upstream-service-route.spec.ts | 3 +++ e2e/tests/plugin_configs.list.spec.ts | 1 + e2e/tests/protos.list.spec.ts | 1 + e2e/tests/routes.list.spec.ts | 1 + e2e/tests/services.crud-required-fields.spec.ts | 1 + e2e/tests/services.list.spec.ts | 1 + e2e/tests/stream_routes.list.spec.ts | 1 + e2e/tests/upstreams.list.spec.ts | 1 + .../form-slice/FormPartUpstream/schema.ts | 4 ++-- src/routes/upstreams/detail.$id.tsx | 14 +++++++++----- 12 files changed, 23 insertions(+), 7 deletions(-) diff --git a/e2e/tests/consumer_groups.list.spec.ts b/e2e/tests/consumer_groups.list.spec.ts index a9dd217b83..b2ff734453 100644 --- a/e2e/tests/consumer_groups.list.spec.ts +++ b/e2e/tests/consumer_groups.list.spec.ts @@ -47,6 +47,7 @@ const consumerGroups: APISIXType['ConsumerGroupPut'][] = Array.from( test.describe('page and page_size should work correctly', () => { test.describe.configure({ mode: 'serial' }); + test.beforeAll(async () => { await deleteAllConsumerGroups(e2eReq); await Promise.all( diff --git a/e2e/tests/consumers.list.spec.ts b/e2e/tests/consumers.list.spec.ts index 43ff5ce9b5..685a770861 100644 --- a/e2e/tests/consumers.list.spec.ts +++ b/e2e/tests/consumers.list.spec.ts @@ -49,6 +49,7 @@ const consumers: APISIXType['ConsumerPut'][] = Array.from({ length: 11 }, (_, i) test.describe('page and page_size should work correctly', () => { test.describe.configure({ mode: 'serial' }); + test.beforeAll(async () => { await deleteAllConsumers(e2eReq); await Promise.all(consumers.map((d) => putConsumerReq(e2eReq, d))); diff --git a/e2e/tests/hot-path.upstream-service-route.spec.ts b/e2e/tests/hot-path.upstream-service-route.spec.ts index 60521f3bcd..811c870cf4 100644 --- a/e2e/tests/hot-path.upstream-service-route.spec.ts +++ b/e2e/tests/hot-path.upstream-service-route.spec.ts @@ -61,6 +61,7 @@ test('can create upstream -> service -> route', async ({ page }) => { scheme: 'https', nodes: [{ host: 'httpbin.org', port: 443 }], }; + await test.step('create upstream', async () => { // Navigate to the upstream list page await upstreamsPom.toIndex(page); @@ -158,6 +159,7 @@ test('can create upstream -> service -> route', async ({ page }) => { }, }, } satisfies Partial; + await test.step('create service', async () => { // upstream id should be set expect(service.upstream_id).not.toBeUndefined(); @@ -275,6 +277,7 @@ test('can create upstream -> service -> route', async ({ page }) => { }, }, }; + await test.step('create route', async () => { // service id should be set expect(route.service_id).not.toBeUndefined(); diff --git a/e2e/tests/plugin_configs.list.spec.ts b/e2e/tests/plugin_configs.list.spec.ts index f4a67a396b..2806b042d4 100644 --- a/e2e/tests/plugin_configs.list.spec.ts +++ b/e2e/tests/plugin_configs.list.spec.ts @@ -67,6 +67,7 @@ const pluginConfigs: APISIXType['PluginConfigPut'][] = Array.from( test.describe('page and page_size should work correctly', () => { test.describe.configure({ mode: 'serial' }); + test.beforeAll(async () => { await deleteAllPluginConfigs(e2eReq); await Promise.all(pluginConfigs.map((d) => putPluginConfigReq(e2eReq, d))); diff --git a/e2e/tests/protos.list.spec.ts b/e2e/tests/protos.list.spec.ts index 2f17897e08..cf9222e34b 100644 --- a/e2e/tests/protos.list.spec.ts +++ b/e2e/tests/protos.list.spec.ts @@ -55,6 +55,7 @@ message TestMessage${i + 1} { test.describe('page and page_size should work correctly', () => { test.describe.configure({ mode: 'serial' }); + test.beforeAll(async () => { // Delete all existing protos const existingProtos = await e2eReq diff --git a/e2e/tests/routes.list.spec.ts b/e2e/tests/routes.list.spec.ts index b6f171d920..7a999cd12d 100644 --- a/e2e/tests/routes.list.spec.ts +++ b/e2e/tests/routes.list.spec.ts @@ -63,6 +63,7 @@ const routes: APISIXType['Route'][] = Array.from({ length: 11 }, (_, i) => ({ test.describe('page and page_size should work correctly', () => { test.describe.configure({ mode: 'serial' }); + test.beforeAll(async () => { await deleteAllRoutes(e2eReq); await Promise.all(routes.map((d) => putRouteReq(e2eReq, d))); diff --git a/e2e/tests/services.crud-required-fields.spec.ts b/e2e/tests/services.crud-required-fields.spec.ts index f0f17b3eec..ede2ac2c6b 100644 --- a/e2e/tests/services.crud-required-fields.spec.ts +++ b/e2e/tests/services.crud-required-fields.spec.ts @@ -41,6 +41,7 @@ test('should CRUD service with required fields', async ({ page }) => { await servicesPom.getAddServiceBtn(page).click(); await servicesPom.isAddPage(page); + await test.step('submit with required fields', async () => { await uiFillServiceRequiredFields(page, { name: serviceName, diff --git a/e2e/tests/services.list.spec.ts b/e2e/tests/services.list.spec.ts index ceb3972951..ef45cba464 100644 --- a/e2e/tests/services.list.spec.ts +++ b/e2e/tests/services.list.spec.ts @@ -55,6 +55,7 @@ const services: APISIXType['Service'][] = Array.from({ length: 11 }, (_, i) => ( test.describe('page and page_size should work correctly', () => { test.describe.configure({ mode: 'serial' }); + test.beforeAll(async () => { await deleteAllServices(e2eReq); await Promise.all( diff --git a/e2e/tests/stream_routes.list.spec.ts b/e2e/tests/stream_routes.list.spec.ts index 5363b6fe53..28f9c5cc28 100644 --- a/e2e/tests/stream_routes.list.spec.ts +++ b/e2e/tests/stream_routes.list.spec.ts @@ -58,6 +58,7 @@ const streamRoutes: APISIXType['StreamRoute'][] = Array.from( test.describe('page and page_size should work correctly', () => { test.describe.configure({ mode: 'serial' }); + test.beforeAll(async () => { await deleteAllStreamRoutes(e2eReq); await Promise.all( diff --git a/e2e/tests/upstreams.list.spec.ts b/e2e/tests/upstreams.list.spec.ts index 4119da66d1..99a252ef0c 100644 --- a/e2e/tests/upstreams.list.spec.ts +++ b/e2e/tests/upstreams.list.spec.ts @@ -60,6 +60,7 @@ const upstreams: APISIXType['Upstream'][] = Array.from( test.describe('page and page_size should work correctly', () => { test.describe.configure({ mode: 'serial' }); + test.beforeAll(async () => { await deleteAllUpstreams(e2eReq); await Promise.all(upstreams.map((d) => putUpstreamReq(e2eReq, d))); diff --git a/src/components/form-slice/FormPartUpstream/schema.ts b/src/components/form-slice/FormPartUpstream/schema.ts index 1e9c62692f..7b962222f8 100644 --- a/src/components/form-slice/FormPartUpstream/schema.ts +++ b/src/components/form-slice/FormPartUpstream/schema.ts @@ -20,8 +20,8 @@ import { APISIX } from '@/types/schema/apisix'; // We don't omit id now, as we need it for detail view export const FormPartUpstreamSchema = APISIX.Upstream.extend({ - __checksEnabled: z.boolean().optional().default(false), - __checksPassiveEnabled: z.boolean().optional().default(false), + __checksEnabled: z.boolean().default(false), + __checksPassiveEnabled: z.boolean().default(false), }); export type FormPartUpstreamType = z.infer; diff --git a/src/routes/upstreams/detail.$id.tsx b/src/routes/upstreams/detail.$id.tsx index a042592721..f58958f09b 100644 --- a/src/routes/upstreams/detail.$id.tsx +++ b/src/routes/upstreams/detail.$id.tsx @@ -35,7 +35,10 @@ import { useBoolean } from 'react-use'; import { getUpstreamReq, putUpstreamReq } from '@/apis/upstreams'; import { FormSubmitBtn } from '@/components/form/Btn'; import { FormPartUpstream } from '@/components/form-slice/FormPartUpstream'; -import { FormPartUpstreamSchema } from '@/components/form-slice/FormPartUpstream/schema'; +import { + FormPartUpstreamSchema, + type FormPartUpstreamType, +} from '@/components/form-slice/FormPartUpstream/schema'; import { produceToUpstreamForm } from '@/components/form-slice/FormPartUpstream/util'; import { FormTOCBox } from '@/components/form-slice/FormSection'; import { FormSectionGeneral } from '@/components/form-slice/FormSectionGeneral'; @@ -68,9 +71,10 @@ const UpstreamDetailForm = ( refetch, } = useSuspenseQuery(getUpstreamQueryOptions(id)); - const formDefaults = produceToUpstreamForm(upstreamData); - const form = useForm({ - resolver: zodResolver(FormPartUpstreamSchema), + const formDefaults = produceToUpstreamForm(upstreamData) as FormPartUpstreamType; + const form = useForm({ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + resolver: zodResolver(FormPartUpstreamSchema) as any, shouldUnregister: true, mode: 'all', disabled: readOnly, @@ -103,7 +107,7 @@ const UpstreamDetailForm = (
{ + onSubmit={form.handleSubmit((d: FormPartUpstreamType) => { putUpstream.mutateAsync(pipeProduce()(d)); })} > From fe7ce2369244aa7c5ec6478250f7dee628d538f7 Mon Sep 17 00:00:00 2001 From: Deep Shekhar Singh Date: Wed, 18 Mar 2026 21:16:31 +0530 Subject: [PATCH 05/20] fix: refactor route detail forms to use useSuspenseQuery and improve cleanup logic --- e2e/tests/routes.clear-upstream-field.spec.ts | 47 +++++++++++++------ src/routes/routes/detail.$id.tsx | 34 +++++--------- src/routes/stream_routes/detail.$id.tsx | 20 +++----- src/routes/upstreams/detail.$id.tsx | 9 ++-- 4 files changed, 57 insertions(+), 53 deletions(-) diff --git a/e2e/tests/routes.clear-upstream-field.spec.ts b/e2e/tests/routes.clear-upstream-field.spec.ts index 599a91d1fb..501078aa8d 100644 --- a/e2e/tests/routes.clear-upstream-field.spec.ts +++ b/e2e/tests/routes.clear-upstream-field.spec.ts @@ -23,11 +23,14 @@ import { uiDeleteRoute } from '@e2e/utils/ui/routes'; import { uiFillUpstreamRequiredFields } from '@e2e/utils/ui/upstreams'; import { expect, type Page } from '@playwright/test'; -import { deleteAllRoutes, getRouteReq } from '@/apis/routes'; -import { deleteAllServices, postServiceReq } from '@/apis/services'; -import { deleteAllUpstreams, postUpstreamReq } from '@/apis/upstreams'; +import { getRouteReq } from '@/apis/routes'; +import { postServiceReq } from '@/apis/services'; +import { postUpstreamReq } from '@/apis/upstreams'; +import { API_ROUTES, API_SERVICES, API_UPSTREAMS } from '@/config/constant'; import type { APISIXType } from '@/types/schema/apisix'; +test.describe.configure({ mode: 'serial' }); + const upstreamName = randomId('test-upstream'); const serviceName = randomId('test-service'); const routeNameForUpstreamId = randomId('test-route-upstream-id'); @@ -42,6 +45,7 @@ const upstreamNodes: APISIXType['UpstreamNode'][] = [ let testUpstreamId: string; let testServiceId: string; +const createdRouteIds = new Set(); // Common helper functions async function fillBasicRouteFields( @@ -130,11 +134,6 @@ async function editRouteAndAddUpstream( } test.beforeAll(async () => { - // Clean up existing resources - await deleteAllRoutes(e2eReq); - await deleteAllServices(e2eReq); - await deleteAllUpstreams(e2eReq); - // Create a test upstream for testing upstream_id scenario const upstreamResponse = await postUpstreamReq(e2eReq, { name: upstreamName, @@ -150,10 +149,24 @@ test.beforeAll(async () => { testServiceId = serviceResponse.data.value.id; }); +test.afterEach(async () => { + await Promise.all( + Array.from(createdRouteIds).map((routeId) => + e2eReq.delete(`${API_ROUTES}/${routeId}`).catch(() => { + // Ignore cleanup errors so tests can proceed; route may already be deleted. + }) + ) + ); + createdRouteIds.clear(); +}); + test.afterAll(async () => { - await deleteAllRoutes(e2eReq); - await deleteAllServices(e2eReq); - await deleteAllUpstreams(e2eReq); + await e2eReq.delete(`${API_SERVICES}/${testServiceId}`).catch(() => { + // Ignore cleanup errors; resource may already be deleted. + }); + await e2eReq.delete(`${API_UPSTREAMS}/${testUpstreamId}`).catch(() => { + // Ignore cleanup errors; resource may already be deleted. + }); }); test('should clear upstream field when upstream_id exists (create and edit)', async ({ @@ -189,7 +202,8 @@ test('should clear upstream field when upstream_id exists (create and edit)', as }); await test.step('verify upstream field is cleared after creation', async () => { - await verifyRouteData(page, 'upstream_id', testUpstreamId); + const routeId = await verifyRouteData(page, 'upstream_id', testUpstreamId); + createdRouteIds.add(routeId); }); await test.step('edit route and add upstream configuration again', async () => { @@ -201,7 +215,8 @@ test('should clear upstream field when upstream_id exists (create and edit)', as }); await test.step('verify upstream field is still cleared after editing', async () => { - await verifyRouteData(page, 'upstream_id', testUpstreamId); + const routeId = await verifyRouteData(page, 'upstream_id', testUpstreamId); + createdRouteIds.add(routeId); await uiDeleteRoute(page); }); }); @@ -240,7 +255,8 @@ test('should clear upstream field when service_id exists (create and edit)', asy }); await test.step('verify upstream field is cleared after creation', async () => { - await verifyRouteData(page, 'service_id', testServiceId); + const routeId = await verifyRouteData(page, 'service_id', testServiceId); + createdRouteIds.add(routeId); }); await test.step('edit route and add upstream configuration again', async () => { @@ -252,7 +268,8 @@ test('should clear upstream field when service_id exists (create and edit)', asy }); await test.step('verify upstream field is still cleared after editing', async () => { - await verifyRouteData(page, 'service_id', testServiceId); + const routeId = await verifyRouteData(page, 'service_id', testServiceId); + createdRouteIds.add(routeId); await uiDeleteRoute(page); }); }); diff --git a/src/routes/routes/detail.$id.tsx b/src/routes/routes/detail.$id.tsx index 3f24266f83..d4b1401351 100644 --- a/src/routes/routes/detail.$id.tsx +++ b/src/routes/routes/detail.$id.tsx @@ -15,9 +15,9 @@ * limitations under the License. */ import { zodResolver } from '@hookform/resolvers/zod'; -import { Button, Group, Skeleton } from '@mantine/core'; +import { Button, Group } from '@mantine/core'; import { notifications } from '@mantine/notifications'; -import { useMutation, useQuery } from '@tanstack/react-query'; +import { useMutation, useSuspenseQuery } from '@tanstack/react-query'; import { createFileRoute, useNavigate, @@ -59,15 +59,13 @@ const RouteDetailForm = (props: Props) => { const { readOnly, setReadOnly, id } = props; const { t } = useTranslation(); - const routeQuery = useQuery(getRouteQueryOptions(id)); - const { data: routeData, isLoading, refetch } = routeQuery; + const routeQuery = useSuspenseQuery(getRouteQueryOptions(id)); + const { data: routeData, refetch } = routeQuery; // Compute initial form values from route data - const formDefaults = routeData?.value - ? produceVarsToForm( - produceToUpstreamForm(routeData.value.upstream || {}, routeData.value) - ) - : undefined; + const formDefaults = produceVarsToForm( + produceToUpstreamForm(routeData.value.upstream || {}, routeData.value) + ); const form = useForm({ resolver: zodResolver(RoutePutSchema), @@ -79,14 +77,12 @@ const RouteDetailForm = (props: Props) => { }); useEffect(() => { - if (routeData?.value && !isLoading) { - const upstreamProduced = produceToUpstreamForm( - routeData.value.upstream || {}, - routeData.value - ); - form.reset(produceVarsToForm(upstreamProduced)); - } - }, [routeData, form, isLoading]); + const upstreamProduced = produceToUpstreamForm( + routeData.value.upstream || {}, + routeData.value + ); + form.reset(produceVarsToForm(upstreamProduced)); + }, [routeData, form]); const putRoute = useMutation({ mutationFn: (d: RoutePutType) => @@ -101,10 +97,6 @@ const RouteDetailForm = (props: Props) => { }, }); - if (isLoading) { - return ; - } - return ( putRoute.mutateAsync(d))}> diff --git a/src/routes/stream_routes/detail.$id.tsx b/src/routes/stream_routes/detail.$id.tsx index 11c69a49b9..35fc4bfa79 100644 --- a/src/routes/stream_routes/detail.$id.tsx +++ b/src/routes/stream_routes/detail.$id.tsx @@ -15,9 +15,9 @@ * limitations under the License. */ import { zodResolver } from '@hookform/resolvers/zod'; -import { Button, Group,Skeleton } from '@mantine/core'; +import { Button, Group } from '@mantine/core'; import { notifications } from '@mantine/notifications'; -import { useMutation, useQuery } from '@tanstack/react-query'; +import { useMutation, useSuspenseQuery } from '@tanstack/react-query'; import { createFileRoute, useNavigate, @@ -52,8 +52,8 @@ const StreamRouteDetailForm = (props: Props) => { const { readOnly, setReadOnly, id } = props; const { t } = useTranslation(); - const streamRouteQuery = useQuery(getStreamRouteQueryOptions(id)); - const { data: streamRouteData, isLoading, refetch } = streamRouteQuery; + const streamRouteQuery = useSuspenseQuery(getStreamRouteQueryOptions(id)); + const { data: streamRouteData, refetch } = streamRouteQuery; const form = useForm({ resolver: zodResolver(APISIX.StreamRoute), @@ -61,14 +61,12 @@ const StreamRouteDetailForm = (props: Props) => { shouldFocusError: true, mode: 'all', disabled: readOnly, - defaultValues: streamRouteData?.value, + defaultValues: streamRouteData.value, }); useEffect(() => { - if (streamRouteData?.value && !isLoading) { - form.reset(streamRouteData.value); - } - }, [streamRouteData, form, isLoading]); + form.reset(streamRouteData.value); + }, [streamRouteData, form]); const putStreamRoute = useMutation({ mutationFn: (d: APISIXType['StreamRoute']) => @@ -83,10 +81,6 @@ const StreamRouteDetailForm = (props: Props) => { }, }); - if (isLoading) { - return ; - } - return ( putStreamRoute.mutateAsync(d))}> diff --git a/src/routes/upstreams/detail.$id.tsx b/src/routes/upstreams/detail.$id.tsx index f58958f09b..bdb638e907 100644 --- a/src/routes/upstreams/detail.$id.tsx +++ b/src/routes/upstreams/detail.$id.tsx @@ -15,7 +15,7 @@ * limitations under the License. */ import { zodResolver } from '@hookform/resolvers/zod'; -import { Button, Group,Skeleton } from '@mantine/core'; +import { Button, Group, Skeleton } from '@mantine/core'; import { notifications } from '@mantine/notifications'; import { queryOptions, @@ -31,6 +31,7 @@ import { useEffect } from 'react'; import { FormProvider, useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { useBoolean } from 'react-use'; +import type { z } from 'zod'; import { getUpstreamReq, putUpstreamReq } from '@/apis/upstreams'; import { FormSubmitBtn } from '@/components/form/Btn'; @@ -72,9 +73,9 @@ const UpstreamDetailForm = ( } = useSuspenseQuery(getUpstreamQueryOptions(id)); const formDefaults = produceToUpstreamForm(upstreamData) as FormPartUpstreamType; - const form = useForm({ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - resolver: zodResolver(FormPartUpstreamSchema) as any, + type FormPartUpstreamInput = z.input; + const form = useForm({ + resolver: zodResolver(FormPartUpstreamSchema), shouldUnregister: true, mode: 'all', disabled: readOnly, From c1c29d202461e1952d70bb58941aa0347c30d621 Mon Sep 17 00:00:00 2001 From: Deep Shekhar Singh Date: Wed, 18 Mar 2026 21:27:47 +0530 Subject: [PATCH 06/20] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- e2e/tests/upstreams.pass-host-reset.spec.ts | 104 ++++++++++---------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/e2e/tests/upstreams.pass-host-reset.spec.ts b/e2e/tests/upstreams.pass-host-reset.spec.ts index 9332ffcead..90e65dd69b 100644 --- a/e2e/tests/upstreams.pass-host-reset.spec.ts +++ b/e2e/tests/upstreams.pass-host-reset.spec.ts @@ -24,7 +24,7 @@ import { expect } from '@playwright/test'; import { deleteAllUpstreams } from '@/apis/upstreams'; test.beforeAll(async () => { - await deleteAllUpstreams(e2eReq); + await deleteAllUpstreams(e2eReq); }); /** @@ -33,63 +33,63 @@ test.beforeAll(async () => { * @see https://github.com/apache/apisix-dashboard/issues/3294 */ test('should preserve pass_host value when editing upstream nodes', async ({ - page, + page, }) => { - const upstreamName = randomId('test-pass-host'); - - // Navigate to upstream add page - await upstreamsPom.toIndex(page); - await upstreamsPom.isIndexPage(page); - await upstreamsPom.getAddUpstreamBtn(page).click(); - await upstreamsPom.isAddPage(page); - - await test.step('create upstream with pass_host=node via UI', async () => { - // Fill in the Name field - await page.getByLabel('Name', { exact: true }).fill(upstreamName); - - // Add a node - const nodesSection = page.getByRole('group', { name: 'Nodes' }); - const addNodeBtn = page.getByRole('button', { name: 'Add a Node' }); - - await addNodeBtn.click(); - const rows = nodesSection.locator('tr.ant-table-row'); - const firstRow = rows.first(); - await expect(firstRow).toBeVisible(); - - const hostInput = firstRow.locator('input').first(); - await hostInput.click(); - await hostInput.fill('my-service.my-namespace.svc'); - - // Click outside to trigger update - await nodesSection.click(); - - // Set pass_host to "node" - const passHostSection = page.getByRole('group', { name: 'Pass Host' }); - await passHostSection.getByRole('textbox', { name: 'Pass Host' }).click(); - await page.getByRole('option', { name: 'node' }).click(); - - // Submit the form - await upstreamsPom.getAddBtn(page).click(); - await uiHasToastMsg(page, { - hasText: 'Add Upstream Successfully', - }); + const upstreamName = randomId('test-pass-host'); + + // Navigate to upstream add page + await upstreamsPom.toIndex(page); + await upstreamsPom.isIndexPage(page); + await upstreamsPom.getAddUpstreamBtn(page).click(); + await upstreamsPom.isAddPage(page); + + await test.step('create upstream with pass_host=node via UI', async () => { + // Fill in the Name field + await page.getByLabel('Name', { exact: true }).fill(upstreamName); + + // Add a node + const nodesSection = page.getByRole('group', { name: 'Nodes' }); + const addNodeBtn = page.getByRole('button', { name: 'Add a Node' }); + + await addNodeBtn.click(); + const rows = nodesSection.locator('tr.ant-table-row'); + const firstRow = rows.first(); + await expect(firstRow).toBeVisible(); + + const hostInput = firstRow.locator('input').first(); + await hostInput.click(); + await hostInput.fill('my-service.my-namespace.svc'); + + // Click outside to trigger update + await nodesSection.click(); + + // Set pass_host to "node" + const passHostSection = page.getByRole('group', { name: 'Pass Host' }); + await passHostSection.getByRole('textbox', { name: 'Pass Host' }).click(); + await page.getByRole('option', { name: 'node' }).click(); + + // Submit the form + await upstreamsPom.getAddBtn(page).click(); + await uiHasToastMsg(page, { + hasText: 'Add Upstream Successfully', }); + }); - await test.step('verify auto navigate to detail page', async () => { - await upstreamsPom.isDetailPage(page); - }); + await test.step('verify auto navigate to detail page', async () => { + await upstreamsPom.isDetailPage(page); + }); - await test.step('verify initial pass_host value is "node"', async () => { - const passHostSection = page.getByRole('group', { name: 'Pass Host' }); - const passHostField = passHostSection.getByRole('textbox', { - name: 'Pass Host', - exact: true, - }); - await expect(passHostField).toHaveValue('node'); - await expect(passHostField).toBeDisabled(); + await test.step('verify initial pass_host value is "node"', async () => { + const passHostSection = page.getByRole('group', { name: 'Pass Host' }); + const passHostField = passHostSection.getByRole('textbox', { + name: 'Pass Host', + exact: true, }); + await expect(passHostField).toHaveValue('node'); + await expect(passHostField).toBeDisabled(); + }); - await test.step('click edit and add a new node', async () => { + await test.step('click edit and add a new node', async () => { await page.getByRole('button', { name: 'Edit' }).click(); const nodesSection = page.getByRole('group', { name: 'Nodes' }); From bf859db43f0d04d5d453799ffe491d200a1b093d Mon Sep 17 00:00:00 2001 From: Deep Shekhar Singh Date: Wed, 18 Mar 2026 21:33:16 +0530 Subject: [PATCH 07/20] fix: add loading skeleton to RouteDetailForm and improve service data handling --- src/routes/routes/detail.$id.tsx | 26 ++++++++++++++++-------- src/routes/services/detail.$id/index.tsx | 16 +++++---------- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/routes/routes/detail.$id.tsx b/src/routes/routes/detail.$id.tsx index d4b1401351..a010d4e9a0 100644 --- a/src/routes/routes/detail.$id.tsx +++ b/src/routes/routes/detail.$id.tsx @@ -15,7 +15,7 @@ * limitations under the License. */ import { zodResolver } from '@hookform/resolvers/zod'; -import { Button, Group } from '@mantine/core'; +import { Button, Group, Skeleton } from '@mantine/core'; import { notifications } from '@mantine/notifications'; import { useMutation, useSuspenseQuery } from '@tanstack/react-query'; import { @@ -23,7 +23,7 @@ import { useNavigate, useParams, } from '@tanstack/react-router'; -import { useEffect } from 'react'; +import { Suspense, useEffect } from 'react'; import { FormProvider, useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { useBoolean } from 'react-use'; @@ -149,13 +149,21 @@ export const RouteDetail = (props: RouteDetailProps) => { ), })} /> - - - + + + + } + > + + + + ); }; diff --git a/src/routes/services/detail.$id/index.tsx b/src/routes/services/detail.$id/index.tsx index 11261a9ad7..0460343463 100644 --- a/src/routes/services/detail.$id/index.tsx +++ b/src/routes/services/detail.$id/index.tsx @@ -15,7 +15,7 @@ * limitations under the License. */ import { zodResolver } from '@hookform/resolvers/zod'; -import { Button, Group, Skeleton } from '@mantine/core'; +import { Button, Group } from '@mantine/core'; import { notifications } from '@mantine/notifications'; import { useMutation, useSuspenseQuery } from '@tanstack/react-query'; import { @@ -53,7 +53,7 @@ const ServiceDetailForm = (props: Props) => { const { id } = useParams({ from: '/services/detail/$id' }); const serviceQuery = useSuspenseQuery(getServiceQueryOptions(id)); - const { data: serviceData, isLoading, refetch } = serviceQuery; + const { data: serviceData, refetch } = serviceQuery; const form = useForm({ resolver: zodResolver(APISIX.Service), @@ -61,14 +61,12 @@ const ServiceDetailForm = (props: Props) => { shouldFocusError: true, mode: 'all', disabled: readOnly, - defaultValues: serviceData?.value, + defaultValues: serviceData.value, }); useEffect(() => { - if (serviceData?.value && !isLoading) { - form.reset(serviceData.value); - } - }, [serviceData, form, isLoading]); + form.reset(serviceData.value); + }, [serviceData, form]); const putService = useMutation({ mutationFn: (d: APISIXType['Service']) => @@ -86,10 +84,6 @@ const ServiceDetailForm = (props: Props) => { }, }); - if (isLoading) { - return ; - } - return ( putService.mutateAsync(d))}> From 62a045d9cb6480227a083f5ef85884ba5a4c6eda Mon Sep 17 00:00:00 2001 From: Deep Shekhar Singh Date: Wed, 18 Mar 2026 22:27:19 +0530 Subject: [PATCH 08/20] Replaced useQuery with useSuspenseQuery & Added Suspense with Skeleton --- src/routes/stream_routes/detail.$id.tsx | 26 ++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/routes/stream_routes/detail.$id.tsx b/src/routes/stream_routes/detail.$id.tsx index 35fc4bfa79..9c980dbebc 100644 --- a/src/routes/stream_routes/detail.$id.tsx +++ b/src/routes/stream_routes/detail.$id.tsx @@ -15,7 +15,7 @@ * limitations under the License. */ import { zodResolver } from '@hookform/resolvers/zod'; -import { Button, Group } from '@mantine/core'; +import { Button, Group, Skeleton } from '@mantine/core'; import { notifications } from '@mantine/notifications'; import { useMutation, useSuspenseQuery } from '@tanstack/react-query'; import { @@ -23,7 +23,7 @@ import { useNavigate, useParams, } from '@tanstack/react-router'; -import { useEffect } from 'react'; +import { Suspense, useEffect } from 'react'; import { FormProvider, useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { useBoolean } from 'react-use'; @@ -134,13 +134,21 @@ export const StreamRouteDetail = (props: StreamRouteDetailProps) => { ), })} /> - - - + + + + } + > + + + + ); }; From 4d8d919fb415be35421840a397041b595d0d0c9b Mon Sep 17 00:00:00 2001 From: Deep Shekhar Singh Date: Wed, 18 Mar 2026 22:34:27 +0530 Subject: [PATCH 09/20] Improved readibility --- e2e/tests/upstreams.pass-host-reset.spec.ts | 340 ++++++++++---------- src/routes/stream_routes/detail.$id.tsx | 40 ++- 2 files changed, 193 insertions(+), 187 deletions(-) diff --git a/e2e/tests/upstreams.pass-host-reset.spec.ts b/e2e/tests/upstreams.pass-host-reset.spec.ts index 90e65dd69b..c63deb5dc8 100644 --- a/e2e/tests/upstreams.pass-host-reset.spec.ts +++ b/e2e/tests/upstreams.pass-host-reset.spec.ts @@ -90,223 +90,223 @@ test('should preserve pass_host value when editing upstream nodes', async ({ }); await test.step('click edit and add a new node', async () => { - await page.getByRole('button', { name: 'Edit' }).click(); + await page.getByRole('button', { name: 'Edit' }).click(); - const nodesSection = page.getByRole('group', { name: 'Nodes' }); - const addNodeBtn = page.getByRole('button', { name: 'Add a Node' }); + const nodesSection = page.getByRole('group', { name: 'Nodes' }); + const addNodeBtn = page.getByRole('button', { name: 'Add a Node' }); - // Add a new node - await addNodeBtn.click(); + // Add a new node + await addNodeBtn.click(); - // Fill in the new node details - const rows = nodesSection.locator('tr.ant-table-row'); - const newRow = rows.nth(1); - await expect(newRow).toBeVisible(); + // Fill in the new node details + const rows = nodesSection.locator('tr.ant-table-row'); + const newRow = rows.nth(1); + await expect(newRow).toBeVisible(); - const hostInput = newRow.locator('input').first(); - await hostInput.click(); - await hostInput.fill('another-service.svc'); + const hostInput = newRow.locator('input').first(); + await hostInput.click(); + await hostInput.fill('another-service.svc'); - const portInput = newRow.locator('input').nth(1); - await portInput.click(); - await portInput.fill('8080'); + const portInput = newRow.locator('input').nth(1); + await portInput.click(); + await portInput.fill('8080'); - const weightInput = newRow.locator('input').nth(2); - await weightInput.click(); - await weightInput.fill('1'); + const weightInput = newRow.locator('input').nth(2); + await weightInput.click(); + await weightInput.fill('1'); - // Click outside to trigger the update - await nodesSection.click(); - }); + // Click outside to trigger the update + await nodesSection.click(); + }); - await test.step('verify pass_host is still "node" before saving', async () => { - const passHostSection = page.getByRole('group', { name: 'Pass Host' }); - const passHostField = passHostSection.getByRole('textbox', { - name: 'Pass Host', - exact: true, - }); - // This is the bug check - pass_host should still be "node" not reset to "pass" - await expect(passHostField).toHaveValue('node'); + await test.step('verify pass_host is still "node" before saving', async () => { + const passHostSection = page.getByRole('group', { name: 'Pass Host' }); + const passHostField = passHostSection.getByRole('textbox', { + name: 'Pass Host', + exact: true, }); + // This is the bug check - pass_host should still be "node" not reset to "pass" + await expect(passHostField).toHaveValue('node'); + }); - await test.step('save and verify pass_host is preserved', async () => { - const saveBtn = page.getByRole('button', { name: 'Save' }); - await saveBtn.click(); + await test.step('save and verify pass_host is preserved', async () => { + const saveBtn = page.getByRole('button', { name: 'Save' }); + await saveBtn.click(); - await uiHasToastMsg(page, { - hasText: 'Edit Upstream Successfully', - }); + await uiHasToastMsg(page, { + hasText: 'Edit Upstream Successfully', + }); - // Verify we're back in detail view mode - await upstreamsPom.isDetailPage(page); + // Verify we're back in detail view mode + await upstreamsPom.isDetailPage(page); - const passHostSection = page.getByRole('group', { name: 'Pass Host' }); - const passHostField = passHostSection.getByRole('textbox', { - name: 'Pass Host', - exact: true, - }); - await expect(passHostField).toHaveValue('node'); - await expect(passHostField).toBeDisabled(); + const passHostSection = page.getByRole('group', { name: 'Pass Host' }); + const passHostField = passHostSection.getByRole('textbox', { + name: 'Pass Host', + exact: true, }); + await expect(passHostField).toHaveValue('node'); + await expect(passHostField).toBeDisabled(); + }); + + await test.step('verify pass_host is preserved after page reload', async () => { + await page.reload(); + await page.waitForLoadState('load'); + await upstreamsPom.isDetailPage(page); - await test.step('verify pass_host is preserved after page reload', async () => { - await page.reload(); - await page.waitForLoadState('load'); - await upstreamsPom.isDetailPage(page); - - const passHostSection = page.getByRole('group', { name: 'Pass Host' }); - const passHostField = passHostSection.getByRole('textbox', { - name: 'Pass Host', - exact: true, - }); - await expect(passHostField).toHaveValue('node'); + const passHostSection = page.getByRole('group', { name: 'Pass Host' }); + const passHostField = passHostSection.getByRole('textbox', { + name: 'Pass Host', + exact: true, }); + await expect(passHostField).toHaveValue('node'); + }); - await test.step('delete upstream via UI', async () => { - // Navigate to list page first to avoid ambiguity with node delete buttons - await upstreamsPom.getUpstreamNavBtn(page).click(); - await upstreamsPom.isIndexPage(page); + await test.step('delete upstream via UI', async () => { + // Navigate to list page first to avoid ambiguity with node delete buttons + await upstreamsPom.getUpstreamNavBtn(page).click(); + await upstreamsPom.isIndexPage(page); - const row = page.getByRole('row', { name: upstreamName }); - await row.getByRole('button', { name: 'Delete' }).click(); + const row = page.getByRole('row', { name: upstreamName }); + await row.getByRole('button', { name: 'Delete' }).click(); - await page - .getByRole('dialog', { name: 'Delete Upstream' }) - .getByRole('button', { name: 'Delete' }) - .click(); + await page + .getByRole('dialog', { name: 'Delete Upstream' }) + .getByRole('button', { name: 'Delete' }) + .click(); - await uiHasToastMsg(page, { - hasText: 'Delete Upstream Successfully', - }); - await expect(page.getByRole('cell', { name: upstreamName })).toBeHidden(); + await uiHasToastMsg(page, { + hasText: 'Delete Upstream Successfully', }); + await expect(page.getByRole('cell', { name: upstreamName })).toBeHidden(); + }); }); /** * Additional test to verify pass_host=rewrite is also preserved */ test('should preserve pass_host value "rewrite" when editing upstream nodes', async ({ - page, + page, }) => { - const upstreamName = randomId('test-pass-host-rewrite'); + const upstreamName = randomId('test-pass-host-rewrite'); - // Navigate to upstream add page - await upstreamsPom.toIndex(page); - await upstreamsPom.isIndexPage(page); - await upstreamsPom.getAddUpstreamBtn(page).click(); - await upstreamsPom.isAddPage(page); - - await test.step('create upstream with pass_host=rewrite via UI', async () => { - // Fill in the Name field - await page.getByLabel('Name', { exact: true }).fill(upstreamName); - - // Add a node - const nodesSection = page.getByRole('group', { name: 'Nodes' }); - const addNodeBtn = page.getByRole('button', { name: 'Add a Node' }); - - await addNodeBtn.click(); - const rows = nodesSection.locator('tr.ant-table-row'); - const firstRow = rows.first(); - await expect(firstRow).toBeVisible(); - - const hostInput = firstRow.locator('input').first(); - await hostInput.click(); - await hostInput.fill('my-service.svc'); - - // Click outside to trigger update - await nodesSection.click(); - - // Set pass_host to "rewrite" - const passHostSection = page.getByRole('group', { name: 'Pass Host' }); - await passHostSection.getByRole('textbox', { name: 'Pass Host' }).click(); - await page.getByRole('option', { name: 'rewrite' }).click(); - - // Fill upstream_host (required when pass_host is "rewrite") - await page.getByLabel('Upstream Host').fill('custom.host.example.com'); - - // Submit the form - await upstreamsPom.getAddBtn(page).click(); - await uiHasToastMsg(page, { - hasText: 'Add Upstream Successfully', - }); - }); + // Navigate to upstream add page + await upstreamsPom.toIndex(page); + await upstreamsPom.isIndexPage(page); + await upstreamsPom.getAddUpstreamBtn(page).click(); + await upstreamsPom.isAddPage(page); + + await test.step('create upstream with pass_host=rewrite via UI', async () => { + // Fill in the Name field + await page.getByLabel('Name', { exact: true }).fill(upstreamName); + + // Add a node + const nodesSection = page.getByRole('group', { name: 'Nodes' }); + const addNodeBtn = page.getByRole('button', { name: 'Add a Node' }); + + await addNodeBtn.click(); + const rows = nodesSection.locator('tr.ant-table-row'); + const firstRow = rows.first(); + await expect(firstRow).toBeVisible(); + + const hostInput = firstRow.locator('input').first(); + await hostInput.click(); + await hostInput.fill('my-service.svc'); + + // Click outside to trigger update + await nodesSection.click(); + + // Set pass_host to "rewrite" + const passHostSection = page.getByRole('group', { name: 'Pass Host' }); + await passHostSection.getByRole('textbox', { name: 'Pass Host' }).click(); + await page.getByRole('option', { name: 'rewrite' }).click(); - await test.step('verify auto navigate to detail page', async () => { - await upstreamsPom.isDetailPage(page); + // Fill upstream_host (required when pass_host is "rewrite") + await page.getByLabel('Upstream Host').fill('custom.host.example.com'); + + // Submit the form + await upstreamsPom.getAddBtn(page).click(); + await uiHasToastMsg(page, { + hasText: 'Add Upstream Successfully', }); + }); - await test.step('verify initial values', async () => { - const passHostSection = page.getByRole('group', { name: 'Pass Host' }); - const passHostField = passHostSection.getByRole('textbox', { - name: 'Pass Host', - exact: true, - }); - await expect(passHostField).toHaveValue('rewrite'); - await expect(passHostField).toBeDisabled(); - - const upstreamHostField = page.getByLabel('Upstream Host'); - await expect(upstreamHostField).toHaveValue('custom.host.example.com'); + await test.step('verify auto navigate to detail page', async () => { + await upstreamsPom.isDetailPage(page); + }); + + await test.step('verify initial values', async () => { + const passHostSection = page.getByRole('group', { name: 'Pass Host' }); + const passHostField = passHostSection.getByRole('textbox', { + name: 'Pass Host', + exact: true, }); + await expect(passHostField).toHaveValue('rewrite'); + await expect(passHostField).toBeDisabled(); - await test.step('edit and modify nodes', async () => { - await page.getByRole('button', { name: 'Edit' }).click(); + const upstreamHostField = page.getByLabel('Upstream Host'); + await expect(upstreamHostField).toHaveValue('custom.host.example.com'); + }); - const nodesSection = page.getByRole('group', { name: 'Nodes' }); - const rows = nodesSection.locator('tr.ant-table-row'); - const firstRow = rows.first(); + await test.step('edit and modify nodes', async () => { + await page.getByRole('button', { name: 'Edit' }).click(); - // Modify the existing node's weight - const weightInput = firstRow.locator('input').nth(2); - await weightInput.click(); - await weightInput.fill('10'); + const nodesSection = page.getByRole('group', { name: 'Nodes' }); + const rows = nodesSection.locator('tr.ant-table-row'); + const firstRow = rows.first(); - // Click outside to trigger the update - await nodesSection.click(); - }); + // Modify the existing node's weight + const weightInput = firstRow.locator('input').nth(2); + await weightInput.click(); + await weightInput.fill('10'); - await test.step('verify values before saving', async () => { - const passHostSection = page.getByRole('group', { name: 'Pass Host' }); - const passHostField = passHostSection.getByRole('textbox', { - name: 'Pass Host', - exact: true, - }); - await expect(passHostField).toHaveValue('rewrite'); + // Click outside to trigger the update + await nodesSection.click(); + }); - const upstreamHostField = page.getByLabel('Upstream Host'); - await expect(upstreamHostField).toHaveValue('custom.host.example.com'); + await test.step('verify values before saving', async () => { + const passHostSection = page.getByRole('group', { name: 'Pass Host' }); + const passHostField = passHostSection.getByRole('textbox', { + name: 'Pass Host', + exact: true, }); + await expect(passHostField).toHaveValue('rewrite'); - await test.step('save and verify values are preserved', async () => { - const saveBtn = page.getByRole('button', { name: 'Save' }); - await saveBtn.click(); + const upstreamHostField = page.getByLabel('Upstream Host'); + await expect(upstreamHostField).toHaveValue('custom.host.example.com'); + }); + + await test.step('save and verify values are preserved', async () => { + const saveBtn = page.getByRole('button', { name: 'Save' }); + await saveBtn.click(); - await uiHasToastMsg(page, { - hasText: 'Edit Upstream Successfully', - }); + await uiHasToastMsg(page, { + hasText: 'Edit Upstream Successfully', + }); - const passHostSection = page.getByRole('group', { name: 'Pass Host' }); - const passHostField = passHostSection.getByRole('textbox', { - name: 'Pass Host', - exact: true, - }); - await expect(passHostField).toHaveValue('rewrite'); + const passHostSection = page.getByRole('group', { name: 'Pass Host' }); + const passHostField = passHostSection.getByRole('textbox', { + name: 'Pass Host', + exact: true, }); + await expect(passHostField).toHaveValue('rewrite'); + }); - await test.step('delete upstream via UI', async () => { - await upstreamsPom.getUpstreamNavBtn(page).click(); - await upstreamsPom.isIndexPage(page); + await test.step('delete upstream via UI', async () => { + await upstreamsPom.getUpstreamNavBtn(page).click(); + await upstreamsPom.isIndexPage(page); - const row = page.getByRole('row', { name: upstreamName }); - await row.getByRole('button', { name: 'Delete' }).click(); + const row = page.getByRole('row', { name: upstreamName }); + await row.getByRole('button', { name: 'Delete' }).click(); - await page - .getByRole('dialog', { name: 'Delete Upstream' }) - .getByRole('button', { name: 'Delete' }) - .click(); + await page + .getByRole('dialog', { name: 'Delete Upstream' }) + .getByRole('button', { name: 'Delete' }) + .click(); - await uiHasToastMsg(page, { - hasText: 'Delete Upstream Successfully', - }); - await expect(page.getByRole('cell', { name: upstreamName })).toBeHidden(); + await uiHasToastMsg(page, { + hasText: 'Delete Upstream Successfully', }); + await expect(page.getByRole('cell', { name: upstreamName })).toBeHidden(); + }); }); diff --git a/src/routes/stream_routes/detail.$id.tsx b/src/routes/stream_routes/detail.$id.tsx index 9c980dbebc..fa7734a31b 100644 --- a/src/routes/stream_routes/detail.$id.tsx +++ b/src/routes/stream_routes/detail.$id.tsx @@ -15,7 +15,7 @@ * limitations under the License. */ import { zodResolver } from '@hookform/resolvers/zod'; -import { Button, Group, Skeleton } from '@mantine/core'; +import { Button, Center, Group, Loader } from '@mantine/core'; import { notifications } from '@mantine/notifications'; import { useMutation, useSuspenseQuery } from '@tanstack/react-query'; import { @@ -48,7 +48,7 @@ type Props = { id: string; }; -const StreamRouteDetailForm = (props: Props) => { +const StreamRouteDetailFormInner = (props: Props) => { const { readOnly, setReadOnly, id } = props; const { t } = useTranslation(); @@ -99,6 +99,20 @@ const StreamRouteDetailForm = (props: Props) => { ); }; +const StreamRouteDetailForm = (props: Props) => { + return ( + + + + } + > + + + ); +}; + type StreamRouteDetailProps = Pick & { onDeleteSuccess: () => void; }; @@ -134,21 +148,13 @@ export const StreamRouteDetail = (props: StreamRouteDetailProps) => { ), })} /> - - - - } - > - - - - + + + ); }; From 401e258cd6e360dfbb1661baf5f01b3ef938e00b Mon Sep 17 00:00:00 2001 From: Deep Shekhar Singh Date: Sun, 22 Mar 2026 12:11:26 +0530 Subject: [PATCH 10/20] fix: resolve the must-fix issue regarding the UX regression --- src/routes/services/detail.$id/index.tsx | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/routes/services/detail.$id/index.tsx b/src/routes/services/detail.$id/index.tsx index 0460343463..87b0a81ec4 100644 --- a/src/routes/services/detail.$id/index.tsx +++ b/src/routes/services/detail.$id/index.tsx @@ -15,7 +15,7 @@ * limitations under the License. */ import { zodResolver } from '@hookform/resolvers/zod'; -import { Button, Group } from '@mantine/core'; +import { Button, Group, Skeleton } from '@mantine/core'; import { notifications } from '@mantine/notifications'; import { useMutation, useSuspenseQuery } from '@tanstack/react-query'; import { @@ -23,7 +23,7 @@ import { useNavigate, useParams, } from '@tanstack/react-router'; -import { useEffect } from 'react'; +import { Suspense, useEffect } from 'react'; import { FormProvider, useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { useBoolean } from 'react-use'; @@ -134,9 +134,17 @@ function RouteComponent() { ), })} /> - - - + + + + } + > + + + + ); } From 8e301b3d1fd1e7c7638fc9d98ee187c7d400d3ea Mon Sep 17 00:00:00 2001 From: Deep Shekhar Singh Date: Sun, 22 Mar 2026 12:22:16 +0530 Subject: [PATCH 11/20] fix(upstream): apply Suspense boundary to UpstreamDetailForm to prevent UX regression --- src/routes/upstreams/detail.$id.tsx | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/routes/upstreams/detail.$id.tsx b/src/routes/upstreams/detail.$id.tsx index bdb638e907..297ac5c592 100644 --- a/src/routes/upstreams/detail.$id.tsx +++ b/src/routes/upstreams/detail.$id.tsx @@ -27,7 +27,7 @@ import { useNavigate, useParams, } from '@tanstack/react-router'; -import { useEffect } from 'react'; +import { Suspense, useEffect } from 'react'; import { FormProvider, useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { useBoolean } from 'react-use'; @@ -68,7 +68,6 @@ const UpstreamDetailForm = ( const { t } = useTranslation(); const { data: { value: upstreamData }, - isLoading, refetch, } = useSuspenseQuery(getUpstreamQueryOptions(id)); @@ -95,14 +94,10 @@ const UpstreamDetailForm = ( }); useEffect(() => { - if (upstreamData && !isLoading) { + if (upstreamData) { form.reset(produceToUpstreamForm(upstreamData)); } - }, [upstreamData, form, isLoading]); - - if (isLoading) { - return ; - } + }, [upstreamData, form]); return ( @@ -160,11 +155,13 @@ function RouteComponent() { ), })} /> - + }> + + ); } From dac340cd49aa27ae6fb4958b5e94dde51ba7c680 Mon Sep 17 00:00:00 2001 From: Deep Shekhar Singh Date: Sun, 22 Mar 2026 12:23:59 +0530 Subject: [PATCH 12/20] style(stream-routes): use consistent Skeleton Suspense fallback for detail page --- src/routes/stream_routes/detail.$id.tsx | 40 +++++++++++-------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/src/routes/stream_routes/detail.$id.tsx b/src/routes/stream_routes/detail.$id.tsx index fa7734a31b..85a10e22e6 100644 --- a/src/routes/stream_routes/detail.$id.tsx +++ b/src/routes/stream_routes/detail.$id.tsx @@ -15,7 +15,7 @@ * limitations under the License. */ import { zodResolver } from '@hookform/resolvers/zod'; -import { Button, Center, Group, Loader } from '@mantine/core'; +import { Button, Group, Skeleton } from '@mantine/core'; import { notifications } from '@mantine/notifications'; import { useMutation, useSuspenseQuery } from '@tanstack/react-query'; import { @@ -48,7 +48,7 @@ type Props = { id: string; }; -const StreamRouteDetailFormInner = (props: Props) => { +const StreamRouteDetailForm = (props: Props) => { const { readOnly, setReadOnly, id } = props; const { t } = useTranslation(); @@ -99,19 +99,7 @@ const StreamRouteDetailFormInner = (props: Props) => { ); }; -const StreamRouteDetailForm = (props: Props) => { - return ( - - - - } - > - - - ); -}; + type StreamRouteDetailProps = Pick & { onDeleteSuccess: () => void; @@ -148,13 +136,21 @@ export const StreamRouteDetail = (props: StreamRouteDetailProps) => { ), })} /> - - - + + + + } + > + + + + ); }; From 6e0093e5349cec79f1498eaad373e98a023c03c5 Mon Sep 17 00:00:00 2001 From: Deep Shekhar Singh Date: Sun, 22 Mar 2026 12:25:12 +0530 Subject: [PATCH 13/20] test(e2e): remove global beforeAll upstream deletion to avoid race conditions --- e2e/tests/upstreams.pass-host-reset.spec.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/e2e/tests/upstreams.pass-host-reset.spec.ts b/e2e/tests/upstreams.pass-host-reset.spec.ts index c63deb5dc8..66fa224077 100644 --- a/e2e/tests/upstreams.pass-host-reset.spec.ts +++ b/e2e/tests/upstreams.pass-host-reset.spec.ts @@ -16,17 +16,10 @@ */ import { upstreamsPom } from '@e2e/pom/upstreams'; import { randomId } from '@e2e/utils/common'; -import { e2eReq } from '@e2e/utils/req'; import { test } from '@e2e/utils/test'; import { uiHasToastMsg } from '@e2e/utils/ui'; import { expect } from '@playwright/test'; -import { deleteAllUpstreams } from '@/apis/upstreams'; - -test.beforeAll(async () => { - await deleteAllUpstreams(e2eReq); -}); - /** * Test for GitHub issue #3294 * Bug: pass_host is reset to default value "pass" when editing upstream nodes From e8e5fd792b5d78632957f9ff1be24918cee0b167 Mon Sep 17 00:00:00 2001 From: Deep Shekhar Singh Date: Sun, 22 Mar 2026 12:28:22 +0530 Subject: [PATCH 14/20] perf: useMemo for formDefaults in upstream and route detail pages --- src/routes/routes/detail.$id.tsx | 10 +++++++--- src/routes/upstreams/detail.$id.tsx | 7 +++++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/routes/routes/detail.$id.tsx b/src/routes/routes/detail.$id.tsx index a010d4e9a0..cd339fe8ac 100644 --- a/src/routes/routes/detail.$id.tsx +++ b/src/routes/routes/detail.$id.tsx @@ -23,7 +23,7 @@ import { useNavigate, useParams, } from '@tanstack/react-router'; -import { Suspense, useEffect } from 'react'; +import { Suspense, useEffect, useMemo } from 'react'; import { FormProvider, useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { useBoolean } from 'react-use'; @@ -63,8 +63,12 @@ const RouteDetailForm = (props: Props) => { const { data: routeData, refetch } = routeQuery; // Compute initial form values from route data - const formDefaults = produceVarsToForm( - produceToUpstreamForm(routeData.value.upstream || {}, routeData.value) + const formDefaults = useMemo( + () => + produceVarsToForm( + produceToUpstreamForm(routeData.value.upstream || {}, routeData.value) + ), + [routeData.value] ); const form = useForm({ diff --git a/src/routes/upstreams/detail.$id.tsx b/src/routes/upstreams/detail.$id.tsx index 297ac5c592..b9bbf9b4c9 100644 --- a/src/routes/upstreams/detail.$id.tsx +++ b/src/routes/upstreams/detail.$id.tsx @@ -27,7 +27,7 @@ import { useNavigate, useParams, } from '@tanstack/react-router'; -import { Suspense, useEffect } from 'react'; +import { Suspense, useEffect, useMemo } from 'react'; import { FormProvider, useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { useBoolean } from 'react-use'; @@ -71,7 +71,10 @@ const UpstreamDetailForm = ( refetch, } = useSuspenseQuery(getUpstreamQueryOptions(id)); - const formDefaults = produceToUpstreamForm(upstreamData) as FormPartUpstreamType; + const formDefaults = useMemo( + () => produceToUpstreamForm(upstreamData) as FormPartUpstreamType, + [upstreamData] + ); type FormPartUpstreamInput = z.input; const form = useForm({ resolver: zodResolver(FormPartUpstreamSchema), From 43d78431338d336a3024151b41a78e310951e453 Mon Sep 17 00:00:00 2001 From: Deep Shekhar Singh Date: Mon, 23 Mar 2026 12:34:26 +0530 Subject: [PATCH 15/20] fix: resolve E2E test failures by improving form synchronization and data initialization --- e2e/tests/routes.crud-all-fields.spec.ts | 2 + .../services.crud-required-fields.spec.ts | 13 +++ e2e/utils/ui/index.ts | 20 ++++- e2e/utils/ui/upstreams.ts | 33 +++---- .../FormPartUpstream/FormItemNodes.tsx | 19 ++-- .../form-slice/FormPartUpstream/util.ts | 44 +++++++++ src/components/form/Editor.tsx | 2 +- src/routeTree.gen.ts | 90 +++++++++---------- src/routes/routes/add.tsx | 11 ++- src/routes/routes/detail.$id.tsx | 27 +++++- src/routes/services/add.tsx | 6 +- src/routes/services/detail.$id/index.tsx | 11 ++- src/routes/upstreams/add.tsx | 3 +- src/routes/upstreams/detail.$id.tsx | 7 +- 14 files changed, 206 insertions(+), 82 deletions(-) diff --git a/e2e/tests/routes.crud-all-fields.spec.ts b/e2e/tests/routes.crud-all-fields.spec.ts index f4e8dc3e27..a89c50ca27 100644 --- a/e2e/tests/routes.crud-all-fields.spec.ts +++ b/e2e/tests/routes.crud-all-fields.spec.ts @@ -20,6 +20,7 @@ import { e2eReq } from '@e2e/utils/req'; import { test } from '@e2e/utils/test'; import { uiClearMonacoEditor, + uiEnsureSettingsClosed, uiFillMonacoEditor, uiGetMonacoEditor, uiHasToastMsg, @@ -47,6 +48,7 @@ test.beforeAll(async () => { }); test('should CRUD route with all fields', async ({ page }) => { + await uiEnsureSettingsClosed(page); test.slow(); const varsSection = page.getByText('Vars').locator('..'); diff --git a/e2e/tests/services.crud-required-fields.spec.ts b/e2e/tests/services.crud-required-fields.spec.ts index ede2ac2c6b..e0fd452976 100644 --- a/e2e/tests/services.crud-required-fields.spec.ts +++ b/e2e/tests/services.crud-required-fields.spec.ts @@ -36,6 +36,19 @@ test.beforeAll(async () => { }); test('should CRUD service with required fields', async ({ page }) => { + page.on('console', (msg) => { + if (msg.type() === 'log' || msg.type() === 'error') { + console.log(`[Browser ${msg.type()}] ${msg.text()}`); + } + }); + + page.on('response', (response) => { + if (!response.ok() && response.url().includes('/apisix/admin')) { + console.log(`[Response Error] ${response.url()} -> ${response.status()} ${response.statusText()}`); + response.json().then(j => console.log('Response body:', JSON.stringify(j))).catch(() => {}); + } + }); + await servicesPom.toIndex(page); await servicesPom.isIndexPage(page); diff --git a/e2e/utils/ui/index.ts b/e2e/utils/ui/index.ts index cfb4916902..a9c3fe7959 100644 --- a/e2e/utils/ui/index.ts +++ b/e2e/utils/ui/index.ts @@ -40,12 +40,28 @@ export const uiHasToastMsg = async ( ...filterOpts: Parameters ) => { const alertMsg = page.getByRole('alert').filter(...filterOpts); - // Increased timeout for CI environment (30s instead of default 5s) - await expect(alertMsg).toBeVisible({ timeout: 30000 }); + try { + // Increased timeout for CI environment (30s instead of default 5s) + await expect(alertMsg).toBeVisible({ timeout: 30000 }); + } catch (e) { + const allAlerts = await page.getByRole('alert').allTextContents(); + console.log('Available alerts:', allAlerts); + throw e; + } await alertMsg.getByRole('button').click(); await expect(alertMsg).not.toBeVisible(); }; +export const uiEnsureSettingsClosed = async (page: Page) => { + const settingsModal = page.getByRole('dialog', { name: 'Settings' }); + // Wait a bit for modal to potentially appear + await page.waitForTimeout(500); + if (await settingsModal.isVisible()) { + await settingsModal.getByRole('button', { name: 'Close' }).click(); + await expect(settingsModal).toBeHidden(); + } +}; + export async function uiCannotSubmitEmptyForm(page: Page, pom: CommonPOM) { await pom.getAddBtn(page).click(); await pom.isAddPage(page); diff --git a/e2e/utils/ui/upstreams.ts b/e2e/utils/ui/upstreams.ts index 9def978d95..f75bc6810a 100644 --- a/e2e/utils/ui/upstreams.ts +++ b/e2e/utils/ui/upstreams.ts @@ -21,13 +21,15 @@ import type { APISIXType } from '@/types/schema/apisix'; import { genTLS } from '../common'; import type { Test } from '../test'; -import { uiFillHTTPStatuses } from '.'; +import { + uiEnsureSettingsClosed, + uiFillHTTPStatuses, +} from '.'; /** * Fill the upstream form with required fields * @param ctx - Playwright page object or locator - * @param upstreamName - Name for the upstream - * @param nodes - Array of upstream nodes + * @param upstreamName - Name */ export async function uiFillUpstreamRequiredFields( ctx: Page | Locator, @@ -92,13 +94,11 @@ export async function uiCheckUpstreamRequiredFields( export async function uiFillUpstreamAllFields( test: Test, ctx: Page | Locator, - /** - * currently only name and desc are useful, - * because I dont want to change too many fields in upstreams related tests - */ - upstream: Partial, - page: Page = ctx as Page + upstream: Partial = {}, + page: Page = (ctx as Locator).page ? (ctx as Locator).page() : (ctx as Page) ) { + await uiEnsureSettingsClosed(page); + await test.step('fill in required fields', async () => { // Fill in the required fields // 1. Name (required) @@ -238,15 +238,17 @@ export async function uiFillUpstreamAllFields( await tlsSection .getByRole('textbox', { name: 'Client Key', exact: true }) .fill(tls.key); - await tlsSection.getByRole('switch', { name: 'Verify' }).click(); + await tlsSection.getByText('Verify').scrollIntoViewIfNeeded(); + await tlsSection.locator('.mantine-Switch-track').click({ force: true }); // 12. Health Check settings // Activate active health check const healthCheckSection = ctx.getByRole('group', { name: 'Health Check', }); - const checksEnabled = ctx.getByTestId('checksEnabled').locator('..'); - await checksEnabled.click(); + const checksEnabled = ctx.getByTestId('checksEnabled').locator('..').locator('.mantine-Switch-track'); + await checksEnabled.scrollIntoViewIfNeeded(); + await checksEnabled.click({ force: true }); // Set the Healthy part of Active health check settings const activeSection = healthCheckSection.getByRole('group', { @@ -282,11 +284,12 @@ export async function uiFillUpstreamAllFields( '503' ); - // Activate passive health check - await healthCheckSection + const checksPassiveEnabled = healthCheckSection .getByTestId('checksPassiveEnabled') .locator('..') - .click(); + .locator('.mantine-Switch-track'); + await checksPassiveEnabled.scrollIntoViewIfNeeded(); + await checksPassiveEnabled.click({ force: true }); // Set the Healthy part of Passive health check settings const passiveSection = healthCheckSection.getByRole('group', { diff --git a/src/components/form-slice/FormPartUpstream/FormItemNodes.tsx b/src/components/form-slice/FormPartUpstream/FormItemNodes.tsx index 0bb13c13ff..b7e873ca74 100644 --- a/src/components/form-slice/FormPartUpstream/FormItemNodes.tsx +++ b/src/components/form-slice/FormPartUpstream/FormItemNodes.tsx @@ -16,7 +16,6 @@ */ import { EditableProTable, type ProColumns } from '@ant-design/pro-components'; import { Button, InputWrapper, type InputWrapperProps } from '@mantine/core'; -import { useClickOutside } from '@mantine/hooks'; import { toJS } from 'mobx'; import { useLocalObservable } from 'mobx-react-lite'; import { nanoid } from 'nanoid'; @@ -195,6 +194,11 @@ export const FormItemNodes = ( get editableKeys() { return this.disabled ? [] : this.values.map((item) => item.id); }, + save() { + const vals = parseToUpstreamNodes(toJS(this.values)); + fOnChange?.(vals); + restProps.onChange?.(vals); + }, })); useEffect(() => { ob.setValues(parseToDataSource(value)); @@ -203,11 +207,7 @@ export const FormItemNodes = ( ob.setDisabled(disabled); }, [disabled, ob]); - const ref = useClickOutside(() => { - const vals = parseToUpstreamNodes(toJS(ob.values)); - fOnChange?.(vals); - restProps.onChange?.(vals); - }, ['mouseup', 'touchend', 'mousedown', 'touchstart']); + return ( ( label={label} required={required} withAsterisk={withAsterisk} - ref={ref} > @@ -232,6 +231,7 @@ export const FormItemNodes = ( editableKeys: ob.editableKeys, onValuesChange(_, dataSource) { ob.setValues(dataSource); + ob.save(); }, actionRender: (row) => { return [ @@ -256,7 +256,10 @@ export const FormItemNodes = ( size="xs" color="cyan" style={{ borderColor: 'whitesmoke' }} - onClick={() => ob.append(genRecord())} + onClick={() => { + ob.append(genRecord()); + ob.save(); + }} {...(disabled && { display: 'none' })} > {t('form.upstreams.nodes.add')} diff --git a/src/components/form-slice/FormPartUpstream/util.ts b/src/components/form-slice/FormPartUpstream/util.ts index f397a7ce77..5a87fa15b4 100644 --- a/src/components/form-slice/FormPartUpstream/util.ts +++ b/src/components/form-slice/FormPartUpstream/util.ts @@ -31,3 +31,47 @@ export const produceToUpstreamForm = ( d.__checksPassiveEnabled = !!upstream.checks?.passive && isNotEmpty(upstream.checks.passive); }); +const isFieldEmpty = (v: unknown) => + v === undefined || v === null || v === '' || Number.isNaN(v); + +const removeEmptyInplace = (obj: Record) => { + for (const key in obj) { + const value = obj[key]; + if (typeof value === 'object' && value !== null && !Array.isArray(value)) { + removeEmptyInplace(value as Record); + if (Object.keys(value as Record).length === 0) { + delete obj[key]; + } + } else if (isFieldEmpty(value)) { + delete obj[key]; + } + } +}; + +export const produceRmEmptyUpstreamFields = produce((draft: Record) => { + const fields = ['timeout', 'keepalive_pool', 'tls', 'checks', 'upstream']; + for (const field of fields) { + if (draft[field] && typeof draft[field] === 'object' && !Array.isArray(draft[field])) { + removeEmptyInplace(draft[field] as Record); + if (Object.keys(draft[field] as Record).length === 0) { + delete draft[field]; + } + } + } +}); +export const produceToNestedUpstreamForm = produce((draft: Record) => { + const d = draft as Record & { + upstream?: Record; + checks?: { passive?: unknown }; + __checksEnabled?: boolean; + __checksPassiveEnabled?: boolean; + }; + if (d.upstream && typeof d.upstream === 'object' && !Array.isArray(d.upstream)) { + d.upstream = produceToUpstreamForm(d.upstream, d.upstream) as Record; + } + // Also handle top-level checks if they exist + if (d.checks) { + d.__checksEnabled = !!d.checks && isNotEmpty(d.checks); + d.__checksPassiveEnabled = !!d.checks?.passive && isNotEmpty(d.checks.passive); + } +}); diff --git a/src/components/form/Editor.tsx b/src/components/form/Editor.tsx index d236816eab..3b9f864c41 100644 --- a/src/components/form/Editor.tsx +++ b/src/components/form/Editor.tsx @@ -145,7 +145,7 @@ export const FormItemEditor = ( trigger(props.name); }} onMount={(editor) => { - if (process.env.NODE_ENV === 'test') { + if (process.env.NODE_ENV !== 'production') { window.__monacoEditor__ = editor; } }} diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts index 6172e82454..bb344f0269 100644 --- a/src/routeTree.gen.ts +++ b/src/routeTree.gen.ts @@ -310,18 +310,18 @@ export interface FileRoutesByFullPath { '/ssls/add': typeof SslsAddRoute '/stream_routes/add': typeof Stream_routesAddRoute '/upstreams/add': typeof UpstreamsAddRoute - '/consumer_groups/': typeof Consumer_groupsIndexRoute - '/consumers/': typeof ConsumersIndexRoute - '/global_rules/': typeof Global_rulesIndexRoute - '/plugin_configs/': typeof Plugin_configsIndexRoute - '/plugin_metadata/': typeof Plugin_metadataIndexRoute - '/protos/': typeof ProtosIndexRoute - '/routes/': typeof RoutesIndexRoute - '/secrets/': typeof SecretsIndexRoute - '/services/': typeof ServicesIndexRoute - '/ssls/': typeof SslsIndexRoute - '/stream_routes/': typeof Stream_routesIndexRoute - '/upstreams/': typeof UpstreamsIndexRoute + '/consumer_groups': typeof Consumer_groupsIndexRoute + '/consumers': typeof ConsumersIndexRoute + '/global_rules': typeof Global_rulesIndexRoute + '/plugin_configs': typeof Plugin_configsIndexRoute + '/plugin_metadata': typeof Plugin_metadataIndexRoute + '/protos': typeof ProtosIndexRoute + '/routes': typeof RoutesIndexRoute + '/secrets': typeof SecretsIndexRoute + '/services': typeof ServicesIndexRoute + '/ssls': typeof SslsIndexRoute + '/stream_routes': typeof Stream_routesIndexRoute + '/upstreams': typeof UpstreamsIndexRoute '/consumer_groups/detail/$id': typeof Consumer_groupsDetailIdRoute '/consumers/detail/$username': typeof ConsumersDetailUsernameRouteWithChildren '/global_rules/detail/$id': typeof Global_rulesDetailIdRoute @@ -338,9 +338,9 @@ export interface FileRoutesByFullPath { '/consumers/detail/$username/credentials/add': typeof ConsumersDetailUsernameCredentialsAddRoute '/services/detail/$id/routes/add': typeof ServicesDetailIdRoutesAddRoute '/services/detail/$id/stream_routes/add': typeof ServicesDetailIdStream_routesAddRoute - '/consumers/detail/$username/credentials/': typeof ConsumersDetailUsernameCredentialsIndexRoute - '/services/detail/$id/routes/': typeof ServicesDetailIdRoutesIndexRoute - '/services/detail/$id/stream_routes/': typeof ServicesDetailIdStream_routesIndexRoute + '/consumers/detail/$username/credentials': typeof ConsumersDetailUsernameCredentialsIndexRoute + '/services/detail/$id/routes': typeof ServicesDetailIdRoutesIndexRoute + '/services/detail/$id/stream_routes': typeof ServicesDetailIdStream_routesIndexRoute '/consumers/detail/$username/credentials/detail/$id': typeof ConsumersDetailUsernameCredentialsDetailIdRoute '/services/detail/$id/routes/detail/$routeId': typeof ServicesDetailIdRoutesDetailRouteIdRoute '/services/detail/$id/stream_routes/detail/$routeId': typeof ServicesDetailIdStream_routesDetailRouteIdRoute @@ -455,18 +455,18 @@ export interface FileRouteTypes { | '/ssls/add' | '/stream_routes/add' | '/upstreams/add' - | '/consumer_groups/' - | '/consumers/' - | '/global_rules/' - | '/plugin_configs/' - | '/plugin_metadata/' - | '/protos/' - | '/routes/' - | '/secrets/' - | '/services/' - | '/ssls/' - | '/stream_routes/' - | '/upstreams/' + | '/consumer_groups' + | '/consumers' + | '/global_rules' + | '/plugin_configs' + | '/plugin_metadata' + | '/protos' + | '/routes' + | '/secrets' + | '/services' + | '/ssls' + | '/stream_routes' + | '/upstreams' | '/consumer_groups/detail/$id' | '/consumers/detail/$username' | '/global_rules/detail/$id' @@ -483,9 +483,9 @@ export interface FileRouteTypes { | '/consumers/detail/$username/credentials/add' | '/services/detail/$id/routes/add' | '/services/detail/$id/stream_routes/add' - | '/consumers/detail/$username/credentials/' - | '/services/detail/$id/routes/' - | '/services/detail/$id/stream_routes/' + | '/consumers/detail/$username/credentials' + | '/services/detail/$id/routes' + | '/services/detail/$id/stream_routes' | '/consumers/detail/$username/credentials/detail/$id' | '/services/detail/$id/routes/detail/$routeId' | '/services/detail/$id/stream_routes/detail/$routeId' @@ -635,84 +635,84 @@ declare module '@tanstack/react-router' { '/upstreams/': { id: '/upstreams/' path: '/upstreams' - fullPath: '/upstreams/' + fullPath: '/upstreams' preLoaderRoute: typeof UpstreamsIndexRouteImport parentRoute: typeof rootRouteImport } '/stream_routes/': { id: '/stream_routes/' path: '/stream_routes' - fullPath: '/stream_routes/' + fullPath: '/stream_routes' preLoaderRoute: typeof Stream_routesIndexRouteImport parentRoute: typeof rootRouteImport } '/ssls/': { id: '/ssls/' path: '/ssls' - fullPath: '/ssls/' + fullPath: '/ssls' preLoaderRoute: typeof SslsIndexRouteImport parentRoute: typeof rootRouteImport } '/services/': { id: '/services/' path: '/services' - fullPath: '/services/' + fullPath: '/services' preLoaderRoute: typeof ServicesIndexRouteImport parentRoute: typeof rootRouteImport } '/secrets/': { id: '/secrets/' path: '/secrets' - fullPath: '/secrets/' + fullPath: '/secrets' preLoaderRoute: typeof SecretsIndexRouteImport parentRoute: typeof rootRouteImport } '/routes/': { id: '/routes/' path: '/routes' - fullPath: '/routes/' + fullPath: '/routes' preLoaderRoute: typeof RoutesIndexRouteImport parentRoute: typeof rootRouteImport } '/protos/': { id: '/protos/' path: '/protos' - fullPath: '/protos/' + fullPath: '/protos' preLoaderRoute: typeof ProtosIndexRouteImport parentRoute: typeof rootRouteImport } '/plugin_metadata/': { id: '/plugin_metadata/' path: '/plugin_metadata' - fullPath: '/plugin_metadata/' + fullPath: '/plugin_metadata' preLoaderRoute: typeof Plugin_metadataIndexRouteImport parentRoute: typeof rootRouteImport } '/plugin_configs/': { id: '/plugin_configs/' path: '/plugin_configs' - fullPath: '/plugin_configs/' + fullPath: '/plugin_configs' preLoaderRoute: typeof Plugin_configsIndexRouteImport parentRoute: typeof rootRouteImport } '/global_rules/': { id: '/global_rules/' path: '/global_rules' - fullPath: '/global_rules/' + fullPath: '/global_rules' preLoaderRoute: typeof Global_rulesIndexRouteImport parentRoute: typeof rootRouteImport } '/consumers/': { id: '/consumers/' path: '/consumers' - fullPath: '/consumers/' + fullPath: '/consumers' preLoaderRoute: typeof ConsumersIndexRouteImport parentRoute: typeof rootRouteImport } '/consumer_groups/': { id: '/consumer_groups/' path: '/consumer_groups' - fullPath: '/consumer_groups/' + fullPath: '/consumer_groups' preLoaderRoute: typeof Consumer_groupsIndexRouteImport parentRoute: typeof rootRouteImport } @@ -887,21 +887,21 @@ declare module '@tanstack/react-router' { '/services/detail/$id/stream_routes/': { id: '/services/detail/$id/stream_routes/' path: '/stream_routes' - fullPath: '/services/detail/$id/stream_routes/' + fullPath: '/services/detail/$id/stream_routes' preLoaderRoute: typeof ServicesDetailIdStream_routesIndexRouteImport parentRoute: typeof ServicesDetailIdRoute } '/services/detail/$id/routes/': { id: '/services/detail/$id/routes/' path: '/routes' - fullPath: '/services/detail/$id/routes/' + fullPath: '/services/detail/$id/routes' preLoaderRoute: typeof ServicesDetailIdRoutesIndexRouteImport parentRoute: typeof ServicesDetailIdRoute } '/consumers/detail/$username/credentials/': { id: '/consumers/detail/$username/credentials/' path: '/credentials' - fullPath: '/consumers/detail/$username/credentials/' + fullPath: '/consumers/detail/$username/credentials' preLoaderRoute: typeof ConsumersDetailUsernameCredentialsIndexRouteImport parentRoute: typeof ConsumersDetailUsernameRoute } diff --git a/src/routes/routes/add.tsx b/src/routes/routes/add.tsx index ac26e94da0..47d37a26bf 100644 --- a/src/routes/routes/add.tsx +++ b/src/routes/routes/add.tsx @@ -29,10 +29,12 @@ import { type RoutePostType, } from '@/components/form-slice/FormPartRoute/schema'; import { produceRoute } from '@/components/form-slice/FormPartRoute/util'; +import { produceRmEmptyUpstreamFields } from '@/components/form-slice/FormPartUpstream/util'; import { FormTOCBox } from '@/components/form-slice/FormSection'; import PageHeader from '@/components/page/PageHeader'; import { req } from '@/config/req'; import type { APISIXType } from '@/types/schema/apisix'; +import { pipeProduce } from '@/utils/producer'; type Props = { navigate: (res: APISIXType['RespRouteDetail']) => Promise; @@ -44,7 +46,14 @@ export const RouteAddForm = (props: Props) => { const { t } = useTranslation(); const postRoute = useMutation({ - mutationFn: (d: RoutePostType) => postRouteReq(req, produceRoute(d)), + mutationFn: (d: RoutePostType) => + postRouteReq( + req, + pipeProduce( + produceRmEmptyUpstreamFields, + produceRoute + )(d) as APISIXType['Route'] + ), async onSuccess(res) { notifications.show({ message: t('info.add.success', { name: t('routes.singular') }), diff --git a/src/routes/routes/detail.$id.tsx b/src/routes/routes/detail.$id.tsx index cd339fe8ac..d32f1c875a 100644 --- a/src/routes/routes/detail.$id.tsx +++ b/src/routes/routes/detail.$id.tsx @@ -40,7 +40,11 @@ import { produceRoute, produceVarsToForm, } from '@/components/form-slice/FormPartRoute/util'; -import { produceToUpstreamForm } from '@/components/form-slice/FormPartUpstream/util'; +import { + produceRmEmptyUpstreamFields, + produceToNestedUpstreamForm, + produceToUpstreamForm, +} from '@/components/form-slice/FormPartUpstream/util'; import { FormTOCBox } from '@/components/form-slice/FormSection'; import { FormSectionGeneral } from '@/components/form-slice/FormSectionGeneral'; import { DeleteResourceBtn } from '@/components/page/DeleteResourceBtn'; @@ -48,6 +52,7 @@ import PageHeader from '@/components/page/PageHeader'; import { API_ROUTES } from '@/config/constant'; import { req } from '@/config/req'; import { type APISIXType } from '@/types/schema/apisix'; +import { pipeProduce } from '@/utils/producer'; type Props = { readOnly: boolean; @@ -81,8 +86,9 @@ const RouteDetailForm = (props: Props) => { }); useEffect(() => { - const upstreamProduced = produceToUpstreamForm( - routeData.value.upstream || {}, + if (!routeData.value) return; + + const upstreamProduced = produceToNestedUpstreamForm( routeData.value ); form.reset(produceVarsToForm(upstreamProduced)); @@ -90,7 +96,13 @@ const RouteDetailForm = (props: Props) => { const putRoute = useMutation({ mutationFn: (d: RoutePutType) => - putRouteReq(req, produceRoute(d) as APISIXType['Route']), + putRouteReq( + req, + pipeProduce( + produceRmEmptyUpstreamFields, + produceRoute + )(d) as APISIXType['Route'] + ), async onSuccess() { notifications.show({ message: t('info.edit.success', { name: t('routes.singular') }), @@ -99,6 +111,13 @@ const RouteDetailForm = (props: Props) => { await refetch(); setReadOnly(true); }, + onError(err: Error & { response?: { data?: { error_msg?: string } } }) { + notifications.show({ + title: 'Error', + message: err.response?.data?.error_msg || err.message || 'Failed to update route', + color: 'red', + }); + }, }); return ( diff --git a/src/routes/services/add.tsx b/src/routes/services/add.tsx index e6d7ec3ca1..cb0814f6b0 100644 --- a/src/routes/services/add.tsx +++ b/src/routes/services/add.tsx @@ -25,6 +25,7 @@ import { postServiceReq, type ServicePostType } from '@/apis/services'; import { FormSubmitBtn } from '@/components/form/Btn'; import { FormPartService } from '@/components/form-slice/FormPartService'; import { ServicePostSchema } from '@/components/form-slice/FormPartService/schema'; +import { produceRmEmptyUpstreamFields } from '@/components/form-slice/FormPartUpstream/util'; import { FormTOCBox } from '@/components/form-slice/FormSection'; import PageHeader from '@/components/page/PageHeader'; import { req } from '@/config/req'; @@ -39,7 +40,10 @@ const ServiceAddForm = () => { mutationFn: (d: ServicePostType) => postServiceReq( req, - pipeProduce(produceRmUpstreamWhenHas('upstream_id'))(d) + pipeProduce( + produceRmEmptyUpstreamFields, + produceRmUpstreamWhenHas('upstream_id') + )(d) as ServicePostType ), async onSuccess(res) { notifications.show({ diff --git a/src/routes/services/detail.$id/index.tsx b/src/routes/services/detail.$id/index.tsx index 87b0a81ec4..9e25310560 100644 --- a/src/routes/services/detail.$id/index.tsx +++ b/src/routes/services/detail.$id/index.tsx @@ -32,6 +32,10 @@ import { getServiceQueryOptions } from '@/apis/hooks'; import { putServiceReq } from '@/apis/services'; import { FormSubmitBtn } from '@/components/form/Btn'; import { FormPartService } from '@/components/form-slice/FormPartService'; +import { + produceRmEmptyUpstreamFields, + produceToNestedUpstreamForm, +} from '@/components/form-slice/FormPartUpstream/util'; import { FormTOCBox } from '@/components/form-slice/FormSection'; import { FormSectionGeneral } from '@/components/form-slice/FormSectionGeneral'; import { DeleteResourceBtn } from '@/components/page/DeleteResourceBtn'; @@ -65,14 +69,17 @@ const ServiceDetailForm = (props: Props) => { }); useEffect(() => { - form.reset(serviceData.value); + form.reset(produceToNestedUpstreamForm(serviceData.value)); }, [serviceData, form]); const putService = useMutation({ mutationFn: (d: APISIXType['Service']) => putServiceReq( req, - pipeProduce(produceRmUpstreamWhenHas('upstream_id'))(d) + pipeProduce( + produceRmEmptyUpstreamFields, + produceRmUpstreamWhenHas('upstream_id') + )(d) as APISIXType['Service'] ), async onSuccess() { notifications.show({ diff --git a/src/routes/upstreams/add.tsx b/src/routes/upstreams/add.tsx index a080b815e4..2584357730 100644 --- a/src/routes/upstreams/add.tsx +++ b/src/routes/upstreams/add.tsx @@ -26,6 +26,7 @@ import { postUpstreamReq } from '@/apis/upstreams'; import { FormSubmitBtn } from '@/components/form/Btn'; import { FormPartUpstream } from '@/components/form-slice/FormPartUpstream'; import { FormPartUpstreamSchema } from '@/components/form-slice/FormPartUpstream/schema'; +import { produceRmEmptyUpstreamFields } from '@/components/form-slice/FormPartUpstream/util'; import { FormTOCBox } from '@/components/form-slice/FormSection'; import PageHeader from '@/components/page/PageHeader'; import { req } from '@/config/req'; @@ -63,7 +64,7 @@ const UpstreamAddForm = () => { - postUpstream.mutateAsync(pipeProduce()(d)) + postUpstream.mutateAsync(pipeProduce(produceRmEmptyUpstreamFields)(d)) )} > diff --git a/src/routes/upstreams/detail.$id.tsx b/src/routes/upstreams/detail.$id.tsx index b9bbf9b4c9..4fc345864c 100644 --- a/src/routes/upstreams/detail.$id.tsx +++ b/src/routes/upstreams/detail.$id.tsx @@ -40,7 +40,10 @@ import { FormPartUpstreamSchema, type FormPartUpstreamType, } from '@/components/form-slice/FormPartUpstream/schema'; -import { produceToUpstreamForm } from '@/components/form-slice/FormPartUpstream/util'; +import { + produceRmEmptyUpstreamFields, + produceToUpstreamForm, +} from '@/components/form-slice/FormPartUpstream/util'; import { FormTOCBox } from '@/components/form-slice/FormSection'; import { FormSectionGeneral } from '@/components/form-slice/FormSectionGeneral'; import { DeleteResourceBtn } from '@/components/page/DeleteResourceBtn'; @@ -107,7 +110,7 @@ const UpstreamDetailForm = ( { - putUpstream.mutateAsync(pipeProduce()(d)); + putUpstream.mutateAsync(pipeProduce(produceRmEmptyUpstreamFields)(d)); })} > From d138d9e551d5f0486618ed5459446804bc50f400 Mon Sep 17 00:00:00 2001 From: Deep Shekhar Singh Date: Wed, 25 Mar 2026 13:01:40 +0530 Subject: [PATCH 16/20] Fixed lint error in util.ts: The fix was typing produceVarsToAPI's return to reflect that vars becomes unknown[] | undefined after JSON.parse, which satisfies the APISIXType['Route'] cast in add.tsx. --- src/components/form-slice/FormPartRoute/util.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/form-slice/FormPartRoute/util.ts b/src/components/form-slice/FormPartRoute/util.ts index 7b406f7e78..cfe89f2cc6 100644 --- a/src/components/form-slice/FormPartRoute/util.ts +++ b/src/components/form-slice/FormPartRoute/util.ts @@ -29,9 +29,9 @@ export const produceVarsToForm = produce((draft: RoutePostType) => { export const produceVarsToAPI = produce((draft: RoutePostType) => { if (draft.vars && typeof draft.vars === 'string') { - draft.vars = JSON.parse(draft.vars); + (draft as RoutePostType & { vars: unknown }).vars = JSON.parse(draft.vars); } -}); +}) as (draft: RoutePostType) => Omit & { vars?: unknown[] }; export const produceRoute = pipeProduce( produceRmUpstreamWhenHas('service_id', 'upstream_id'), From 195f583b33f1050a3eac86ff922914f134f00912 Mon Sep 17 00:00:00 2001 From: Deep Shekhar Singh Date: Fri, 27 Mar 2026 12:32:59 +0530 Subject: [PATCH 17/20] Updated the function signature to accept APISIXType['Route'] to match what's actually being passed. --- src/apis/routes.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/apis/routes.ts b/src/apis/routes.ts index cb99f71776..50b4c45596 100644 --- a/src/apis/routes.ts +++ b/src/apis/routes.ts @@ -16,7 +16,6 @@ */ import type { AxiosInstance } from 'axios'; -import type { RoutePostType } from '@/components/form-slice/FormPartRoute/schema'; import { API_ROUTES, PAGE_SIZE_MAX, PAGE_SIZE_MIN } from '@/config/constant'; import type { APISIXType } from '@/types/schema/apisix'; import type { PageSearchType } from '@/types/schema/pageSearch'; @@ -45,7 +44,7 @@ export const putRouteReq = (req: AxiosInstance, data: APISIXType['Route']) => { ); }; -export const postRouteReq = (req: AxiosInstance, data: RoutePostType) => +export const postRouteReq = (req: AxiosInstance, data: APISIXType['Route']) => req.post(API_ROUTES, data); export const deleteAllRoutes = async (req: AxiosInstance) => { From 4bb48edd8578e9d7dd2cb5fc4d18edc413da9377 Mon Sep 17 00:00:00 2001 From: Deep Shekhar Singh Date: Mon, 30 Mar 2026 20:56:01 +0530 Subject: [PATCH 18/20] fix(upstream): stabilize node state sync and resolve E2E timeouts - Fix infinite update loop in FormItemNodes by ensuring stable IDs in genRecord - Implement atomic sync between MobX and RHF by adding deep-equal checks - Stabilize E2E tests by injecting safety pauses during node row transitions - Updated test helpers to ensure valid node data (port/weight) for Zod validation --- .../services.crud-required-fields.spec.ts | 21 +++++-------------- .../upstreams.crud-required-fields.spec.ts | 10 ++++++--- e2e/utils/ui/upstreams.ts | 10 ++++----- .../FormPartUpstream/FormItemNodes.tsx | 12 +++++++---- 4 files changed, 25 insertions(+), 28 deletions(-) diff --git a/e2e/tests/services.crud-required-fields.spec.ts b/e2e/tests/services.crud-required-fields.spec.ts index e0fd452976..fdf5f41b4e 100644 --- a/e2e/tests/services.crud-required-fields.spec.ts +++ b/e2e/tests/services.crud-required-fields.spec.ts @@ -36,19 +36,6 @@ test.beforeAll(async () => { }); test('should CRUD service with required fields', async ({ page }) => { - page.on('console', (msg) => { - if (msg.type() === 'log' || msg.type() === 'error') { - console.log(`[Browser ${msg.type()}] ${msg.text()}`); - } - }); - - page.on('response', (response) => { - if (!response.ok() && response.url().includes('/apisix/admin')) { - console.log(`[Response Error] ${response.url()} -> ${response.status()} ${response.statusText()}`); - response.json().then(j => console.log('Response body:', JSON.stringify(j))).catch(() => {}); - } - }); - await servicesPom.toIndex(page); await servicesPom.isIndexPage(page); @@ -67,9 +54,11 @@ test('should CRUD service with required fields', async ({ page }) => { await addNodeBtn.click(); const rows = upstreamSection.locator('tr.ant-table-row'); - await rows.first().locator('input').first().fill('127.0.0.1'); - await rows.first().locator('input').nth(1).fill('80'); - await rows.first().locator('input').nth(2).fill('1'); + const firstRowInputs = rows.first().locator('input'); + await firstRowInputs.nth(0).fill('127.0.0.1'); + await firstRowInputs.nth(1).fill('80'); + await firstRowInputs.nth(2).fill('1'); + await firstRowInputs.nth(2).blur(); // Trigger sync for Antd-Pro-Table to RHF // Ensure the name field is properly filled before submitting const nameField = page.getByRole('textbox', { name: 'Name' }).first(); diff --git a/e2e/tests/upstreams.crud-required-fields.spec.ts b/e2e/tests/upstreams.crud-required-fields.spec.ts index 55261ae40e..b25e0a15d4 100644 --- a/e2e/tests/upstreams.crud-required-fields.spec.ts +++ b/e2e/tests/upstreams.crud-required-fields.spec.ts @@ -25,20 +25,23 @@ import { } from '@e2e/utils/ui/upstreams'; import { expect } from '@playwright/test'; +import { deleteAllRoutes } from '@/apis/routes'; import { deleteAllUpstreams } from '@/apis/upstreams'; import type { APISIXType } from '@/types/schema/apisix'; const upstreamName = randomId('test-upstream'); const nodes: APISIXType['UpstreamNode'][] = [ - { host: 'test.com' }, - { host: 'test2.com', port: 80 }, + { host: 'test.com', port: 80, weight: 100 }, + { host: 'test2.com', port: 80, weight: 100 }, ]; test.beforeAll(async () => { + await deleteAllRoutes(e2eReq); await deleteAllUpstreams(e2eReq); }); test('should CRUD upstream with required fields', async ({ page }) => { + await upstreamsPom.toIndex(page); await upstreamsPom.isIndexPage(page); @@ -156,7 +159,8 @@ test('should CRUD upstream with required fields', async ({ page }) => { }); await test.step('delete upstream in detail page', async () => { - await page.getByRole('button', { name: 'Delete' }).click(); + // Delete the upstream + await page.getByRole('button', { name: 'Delete', exact: true }).first().click(); await page .getByRole('dialog', { name: 'Delete Upstream' }) diff --git a/e2e/utils/ui/upstreams.ts b/e2e/utils/ui/upstreams.ts index f75bc6810a..77667c1e5b 100644 --- a/e2e/utils/ui/upstreams.ts +++ b/e2e/utils/ui/upstreams.ts @@ -54,10 +54,10 @@ export async function uiFillUpstreamRequiredFields( await firstRowHost.fill(upstream.nodes[1].host); await expect(firstRowHost).toHaveValue(upstream.nodes[1].host); - // Add second node - blur first, wait for useClickOutside state sync, then click Add + // Add second node - blur first to trigger sync, then click Add await firstRowHost.blur(); if (page) await page.waitForTimeout(500); - await addNodeBtn.click(); + await addNodeBtn.click({ force: true }); await expect(rows).toHaveCount(2, { timeout: 10000 }); const secondRowHost = rows.nth(1).getByRole('textbox').first(); await secondRowHost.fill(upstream.nodes[0].host); @@ -66,7 +66,7 @@ export async function uiFillUpstreamRequiredFields( // Add a third node and then remove it to test deletion functionality await secondRowHost.blur(); if (page) await page.waitForTimeout(500); - await addNodeBtn.click(); + await addNodeBtn.click({ force: true }); await expect(rows).toHaveCount(3, { timeout: 10000 }); await rows.nth(2).getByRole('button', { name: 'Delete' }).click(); await expect(rows).toHaveCount(2); @@ -148,8 +148,8 @@ export async function uiFillUpstreamAllFields( // Add the second node - blur any focused input first, then click Add await priorityInput.blur(); - await page.waitForTimeout(500); - await addNodeBtn.click(); + if (page) await page.waitForTimeout(500); + await addNodeBtn.click({ force: true }); await expect(rows).toHaveCount(2, { timeout: 10000 }); // Fill in the Host for the second node - click first then fill diff --git a/src/components/form-slice/FormPartUpstream/FormItemNodes.tsx b/src/components/form-slice/FormPartUpstream/FormItemNodes.tsx index b7e873ca74..6f91fb60cb 100644 --- a/src/components/form-slice/FormPartUpstream/FormItemNodes.tsx +++ b/src/components/form-slice/FormPartUpstream/FormItemNodes.tsx @@ -53,9 +53,10 @@ const zValidateField = ( const genRecord = (data?: DataSource | APISIXType['UpstreamNode']) => { const d = data || zGetDefault(APISIX.UpstreamNode); + const id = (d as DataSource).id || nanoid(); return { - id: nanoid(), ...d, + id, } as DataSource; }; @@ -180,8 +181,9 @@ export const FormItemNodes = ( }, values: [] as DataSource[], setValues(data: DataSource[]) { - if (equals(toJS(this.values), data)) return; + if (equals(parseToUpstreamNodes(toJS(this.values)), parseToUpstreamNodes(data))) return; this.values = data; + this.save(); }, append(data: DataSource) { this.values.push(data); @@ -231,7 +233,6 @@ export const FormItemNodes = ( editableKeys: ob.editableKeys, onValuesChange(_, dataSource) { ob.setValues(dataSource); - ob.save(); }, actionRender: (row) => { return [ @@ -240,7 +241,10 @@ export const FormItemNodes = ( variant="transparent" size="compact-xs" px={0} - onClick={() => ob.remove(row.id)} + onClick={() => { + ob.remove(row.id); + ob.save(); + }} > {t('form.btn.delete')} , From c6dd3be778bff56933f47aade45bd6d561b61a7e Mon Sep 17 00:00:00 2001 From: Deep Shekhar Singh Date: Tue, 14 Apr 2026 12:27:02 +0530 Subject: [PATCH 19/20] fix: resolve merge artifacts and syntax errors in detail pages --- .../form-slice/FormPartUpstream/util.ts | 28 ------------------- src/routes/routes/detail.$id.tsx | 11 -------- src/routes/services/detail.$id/index.tsx | 5 ++-- 3 files changed, 2 insertions(+), 42 deletions(-) diff --git a/src/components/form-slice/FormPartUpstream/util.ts b/src/components/form-slice/FormPartUpstream/util.ts index aba904955d..7229e57494 100644 --- a/src/components/form-slice/FormPartUpstream/util.ts +++ b/src/components/form-slice/FormPartUpstream/util.ts @@ -31,34 +31,6 @@ export const produceToUpstreamForm = ( d.__checksPassiveEnabled = !!upstream.checks?.passive && isNotEmpty(upstream.checks.passive); }); -const isFieldEmpty = (v: unknown) => - v === undefined || v === null || v === '' || Number.isNaN(v); - -const removeEmptyInplace = (obj: Record) => { - for (const key in obj) { - const value = obj[key]; - if (typeof value === 'object' && value !== null && !Array.isArray(value)) { - removeEmptyInplace(value as Record); - if (Object.keys(value as Record).length === 0) { - delete obj[key]; - } - } else if (isFieldEmpty(value)) { - delete obj[key]; - } - } -}; - -export const produceRmEmptyUpstreamFields = produce((draft: Record) => { - const fields = ['timeout', 'keepalive_pool', 'tls', 'checks', 'upstream']; - for (const field of fields) { - if (draft[field] && typeof draft[field] === 'object' && !Array.isArray(draft[field])) { - removeEmptyInplace(draft[field] as Record); - if (Object.keys(draft[field] as Record).length === 0) { - delete draft[field]; - } - } - } -}); export const produceToNestedUpstreamForm = produce((draft: Record) => { const d = draft as Record & { upstream?: Record; diff --git a/src/routes/routes/detail.$id.tsx b/src/routes/routes/detail.$id.tsx index 9665bf28ca..7fc8856f3b 100644 --- a/src/routes/routes/detail.$id.tsx +++ b/src/routes/routes/detail.$id.tsx @@ -67,7 +67,6 @@ const RouteDetailForm = (props: Props) => { const routeQuery = useSuspenseQuery(getRouteQueryOptions(id)); const { data: routeData, refetch } = routeQuery; - // Compute initial form values from route data const formDefaults = useMemo( () => produceVarsToForm( @@ -76,16 +75,6 @@ const RouteDetailForm = (props: Props) => { [routeData.value] ); - const formDefaults = useMemo(() => { - if (routeData?.value) { - const upstreamProduced = produceToUpstreamForm( - routeData.value.upstream || {}, - routeData.value - ); - return produceVarsToForm(upstreamProduced); - } - }, [routeData]); - const form = useForm({ resolver: zodResolver(RoutePutSchema), shouldUnregister: true, diff --git a/src/routes/services/detail.$id/index.tsx b/src/routes/services/detail.$id/index.tsx index e2814fd03b..d6691d5b9f 100644 --- a/src/routes/services/detail.$id/index.tsx +++ b/src/routes/services/detail.$id/index.tsx @@ -77,10 +77,9 @@ const ServiceDetailForm = (props: Props) => { putServiceReq( req, pipeProduce( - produceRmEmptyUpstreamFields, - produceRmUpstreamWhenHas('upstream_id') + produceRmUpstreamWhenHas('upstream_id'), + produceRmEmptyUpstreamFields )(d) as APISIXType['Service'] - pipeProduce(produceRmUpstreamWhenHas('upstream_id'), produceRmEmptyUpstreamFields)(d) ), async onSuccess() { notifications.show({ From 437a3d1a1e8101982e663ddd27be15d34a85b2f6 Mon Sep 17 00:00:00 2001 From: Deep Shekhar Singh Date: Tue, 14 Apr 2026 12:31:17 +0530 Subject: [PATCH 20/20] Update routeTree.gen.ts --- src/routeTree.gen.ts | 90 ++++++++++++++++++++++---------------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts index bb344f0269..6172e82454 100644 --- a/src/routeTree.gen.ts +++ b/src/routeTree.gen.ts @@ -310,18 +310,18 @@ export interface FileRoutesByFullPath { '/ssls/add': typeof SslsAddRoute '/stream_routes/add': typeof Stream_routesAddRoute '/upstreams/add': typeof UpstreamsAddRoute - '/consumer_groups': typeof Consumer_groupsIndexRoute - '/consumers': typeof ConsumersIndexRoute - '/global_rules': typeof Global_rulesIndexRoute - '/plugin_configs': typeof Plugin_configsIndexRoute - '/plugin_metadata': typeof Plugin_metadataIndexRoute - '/protos': typeof ProtosIndexRoute - '/routes': typeof RoutesIndexRoute - '/secrets': typeof SecretsIndexRoute - '/services': typeof ServicesIndexRoute - '/ssls': typeof SslsIndexRoute - '/stream_routes': typeof Stream_routesIndexRoute - '/upstreams': typeof UpstreamsIndexRoute + '/consumer_groups/': typeof Consumer_groupsIndexRoute + '/consumers/': typeof ConsumersIndexRoute + '/global_rules/': typeof Global_rulesIndexRoute + '/plugin_configs/': typeof Plugin_configsIndexRoute + '/plugin_metadata/': typeof Plugin_metadataIndexRoute + '/protos/': typeof ProtosIndexRoute + '/routes/': typeof RoutesIndexRoute + '/secrets/': typeof SecretsIndexRoute + '/services/': typeof ServicesIndexRoute + '/ssls/': typeof SslsIndexRoute + '/stream_routes/': typeof Stream_routesIndexRoute + '/upstreams/': typeof UpstreamsIndexRoute '/consumer_groups/detail/$id': typeof Consumer_groupsDetailIdRoute '/consumers/detail/$username': typeof ConsumersDetailUsernameRouteWithChildren '/global_rules/detail/$id': typeof Global_rulesDetailIdRoute @@ -338,9 +338,9 @@ export interface FileRoutesByFullPath { '/consumers/detail/$username/credentials/add': typeof ConsumersDetailUsernameCredentialsAddRoute '/services/detail/$id/routes/add': typeof ServicesDetailIdRoutesAddRoute '/services/detail/$id/stream_routes/add': typeof ServicesDetailIdStream_routesAddRoute - '/consumers/detail/$username/credentials': typeof ConsumersDetailUsernameCredentialsIndexRoute - '/services/detail/$id/routes': typeof ServicesDetailIdRoutesIndexRoute - '/services/detail/$id/stream_routes': typeof ServicesDetailIdStream_routesIndexRoute + '/consumers/detail/$username/credentials/': typeof ConsumersDetailUsernameCredentialsIndexRoute + '/services/detail/$id/routes/': typeof ServicesDetailIdRoutesIndexRoute + '/services/detail/$id/stream_routes/': typeof ServicesDetailIdStream_routesIndexRoute '/consumers/detail/$username/credentials/detail/$id': typeof ConsumersDetailUsernameCredentialsDetailIdRoute '/services/detail/$id/routes/detail/$routeId': typeof ServicesDetailIdRoutesDetailRouteIdRoute '/services/detail/$id/stream_routes/detail/$routeId': typeof ServicesDetailIdStream_routesDetailRouteIdRoute @@ -455,18 +455,18 @@ export interface FileRouteTypes { | '/ssls/add' | '/stream_routes/add' | '/upstreams/add' - | '/consumer_groups' - | '/consumers' - | '/global_rules' - | '/plugin_configs' - | '/plugin_metadata' - | '/protos' - | '/routes' - | '/secrets' - | '/services' - | '/ssls' - | '/stream_routes' - | '/upstreams' + | '/consumer_groups/' + | '/consumers/' + | '/global_rules/' + | '/plugin_configs/' + | '/plugin_metadata/' + | '/protos/' + | '/routes/' + | '/secrets/' + | '/services/' + | '/ssls/' + | '/stream_routes/' + | '/upstreams/' | '/consumer_groups/detail/$id' | '/consumers/detail/$username' | '/global_rules/detail/$id' @@ -483,9 +483,9 @@ export interface FileRouteTypes { | '/consumers/detail/$username/credentials/add' | '/services/detail/$id/routes/add' | '/services/detail/$id/stream_routes/add' - | '/consumers/detail/$username/credentials' - | '/services/detail/$id/routes' - | '/services/detail/$id/stream_routes' + | '/consumers/detail/$username/credentials/' + | '/services/detail/$id/routes/' + | '/services/detail/$id/stream_routes/' | '/consumers/detail/$username/credentials/detail/$id' | '/services/detail/$id/routes/detail/$routeId' | '/services/detail/$id/stream_routes/detail/$routeId' @@ -635,84 +635,84 @@ declare module '@tanstack/react-router' { '/upstreams/': { id: '/upstreams/' path: '/upstreams' - fullPath: '/upstreams' + fullPath: '/upstreams/' preLoaderRoute: typeof UpstreamsIndexRouteImport parentRoute: typeof rootRouteImport } '/stream_routes/': { id: '/stream_routes/' path: '/stream_routes' - fullPath: '/stream_routes' + fullPath: '/stream_routes/' preLoaderRoute: typeof Stream_routesIndexRouteImport parentRoute: typeof rootRouteImport } '/ssls/': { id: '/ssls/' path: '/ssls' - fullPath: '/ssls' + fullPath: '/ssls/' preLoaderRoute: typeof SslsIndexRouteImport parentRoute: typeof rootRouteImport } '/services/': { id: '/services/' path: '/services' - fullPath: '/services' + fullPath: '/services/' preLoaderRoute: typeof ServicesIndexRouteImport parentRoute: typeof rootRouteImport } '/secrets/': { id: '/secrets/' path: '/secrets' - fullPath: '/secrets' + fullPath: '/secrets/' preLoaderRoute: typeof SecretsIndexRouteImport parentRoute: typeof rootRouteImport } '/routes/': { id: '/routes/' path: '/routes' - fullPath: '/routes' + fullPath: '/routes/' preLoaderRoute: typeof RoutesIndexRouteImport parentRoute: typeof rootRouteImport } '/protos/': { id: '/protos/' path: '/protos' - fullPath: '/protos' + fullPath: '/protos/' preLoaderRoute: typeof ProtosIndexRouteImport parentRoute: typeof rootRouteImport } '/plugin_metadata/': { id: '/plugin_metadata/' path: '/plugin_metadata' - fullPath: '/plugin_metadata' + fullPath: '/plugin_metadata/' preLoaderRoute: typeof Plugin_metadataIndexRouteImport parentRoute: typeof rootRouteImport } '/plugin_configs/': { id: '/plugin_configs/' path: '/plugin_configs' - fullPath: '/plugin_configs' + fullPath: '/plugin_configs/' preLoaderRoute: typeof Plugin_configsIndexRouteImport parentRoute: typeof rootRouteImport } '/global_rules/': { id: '/global_rules/' path: '/global_rules' - fullPath: '/global_rules' + fullPath: '/global_rules/' preLoaderRoute: typeof Global_rulesIndexRouteImport parentRoute: typeof rootRouteImport } '/consumers/': { id: '/consumers/' path: '/consumers' - fullPath: '/consumers' + fullPath: '/consumers/' preLoaderRoute: typeof ConsumersIndexRouteImport parentRoute: typeof rootRouteImport } '/consumer_groups/': { id: '/consumer_groups/' path: '/consumer_groups' - fullPath: '/consumer_groups' + fullPath: '/consumer_groups/' preLoaderRoute: typeof Consumer_groupsIndexRouteImport parentRoute: typeof rootRouteImport } @@ -887,21 +887,21 @@ declare module '@tanstack/react-router' { '/services/detail/$id/stream_routes/': { id: '/services/detail/$id/stream_routes/' path: '/stream_routes' - fullPath: '/services/detail/$id/stream_routes' + fullPath: '/services/detail/$id/stream_routes/' preLoaderRoute: typeof ServicesDetailIdStream_routesIndexRouteImport parentRoute: typeof ServicesDetailIdRoute } '/services/detail/$id/routes/': { id: '/services/detail/$id/routes/' path: '/routes' - fullPath: '/services/detail/$id/routes' + fullPath: '/services/detail/$id/routes/' preLoaderRoute: typeof ServicesDetailIdRoutesIndexRouteImport parentRoute: typeof ServicesDetailIdRoute } '/consumers/detail/$username/credentials/': { id: '/consumers/detail/$username/credentials/' path: '/credentials' - fullPath: '/consumers/detail/$username/credentials' + fullPath: '/consumers/detail/$username/credentials/' preLoaderRoute: typeof ConsumersDetailUsernameCredentialsIndexRouteImport parentRoute: typeof ConsumersDetailUsernameRoute }