@@ -2670,6 +2670,262 @@ describe('rewriteBasepath utility', () => {
2670
2670
expect ( router . state . location . pathname ) . toBe ( '/users' )
2671
2671
} )
2672
2672
2673
+ it ( 'should handle basepath with leading slash but without trailing slash' , async ( ) => {
2674
+ const rootRoute = createRootRoute ( {
2675
+ component : ( ) => < Outlet /> ,
2676
+ } )
2677
+
2678
+ const usersRoute = createRoute ( {
2679
+ getParentRoute : ( ) => rootRoute ,
2680
+ path : '/users' ,
2681
+ component : ( ) => < div data-testid = "users" > Users</ div > ,
2682
+ } )
2683
+
2684
+ const routeTree = rootRoute . addChildren ( [ usersRoute ] )
2685
+
2686
+ const router = createRouter ( {
2687
+ routeTree,
2688
+ history : createMemoryHistory ( {
2689
+ initialEntries : [ '/api/v1/users' ] ,
2690
+ } ) ,
2691
+ rewrite : rewriteBasepath ( { basepath : '/api/v1' } ) , // With leading slash but no trailing slash
2692
+ } )
2693
+
2694
+ render ( < RouterProvider router = { router } /> )
2695
+
2696
+ await waitFor ( ( ) => {
2697
+ expect ( screen . getByTestId ( 'users' ) ) . toBeInTheDocument ( )
2698
+ } )
2699
+
2700
+ expect ( router . state . location . pathname ) . toBe ( '/users' )
2701
+ } )
2702
+
2703
+ it ( 'should handle basepath without leading slash but with trailing slash' , async ( ) => {
2704
+ const rootRoute = createRootRoute ( {
2705
+ component : ( ) => < Outlet /> ,
2706
+ } )
2707
+
2708
+ const usersRoute = createRoute ( {
2709
+ getParentRoute : ( ) => rootRoute ,
2710
+ path : '/users' ,
2711
+ component : ( ) => < div data-testid = "users" > Users</ div > ,
2712
+ } )
2713
+
2714
+ const routeTree = rootRoute . addChildren ( [ usersRoute ] )
2715
+
2716
+ const router = createRouter ( {
2717
+ routeTree,
2718
+ history : createMemoryHistory ( {
2719
+ initialEntries : [ '/api/v1/users' ] ,
2720
+ } ) ,
2721
+ rewrite : rewriteBasepath ( { basepath : 'api/v1/' } ) , // Without leading slash but with trailing slash
2722
+ } )
2723
+
2724
+ render ( < RouterProvider router = { router } /> )
2725
+
2726
+ await waitFor ( ( ) => {
2727
+ expect ( screen . getByTestId ( 'users' ) ) . toBeInTheDocument ( )
2728
+ } )
2729
+
2730
+ expect ( router . state . location . pathname ) . toBe ( '/users' )
2731
+ } )
2732
+
2733
+ it ( 'should handle basepath without leading and trailing slashes' , async ( ) => {
2734
+ const rootRoute = createRootRoute ( {
2735
+ component : ( ) => < Outlet /> ,
2736
+ } )
2737
+
2738
+ const usersRoute = createRoute ( {
2739
+ getParentRoute : ( ) => rootRoute ,
2740
+ path : '/users' ,
2741
+ component : ( ) => < div data-testid = "users" > Users</ div > ,
2742
+ } )
2743
+
2744
+ const routeTree = rootRoute . addChildren ( [ usersRoute ] )
2745
+
2746
+ const router = createRouter ( {
2747
+ routeTree,
2748
+ history : createMemoryHistory ( {
2749
+ initialEntries : [ '/api/v1/users' ] ,
2750
+ } ) ,
2751
+ rewrite : rewriteBasepath ( { basepath : 'api/v1' } ) , // Without leading and trailing slashes
2752
+ } )
2753
+
2754
+ render ( < RouterProvider router = { router } /> )
2755
+
2756
+ await waitFor ( ( ) => {
2757
+ expect ( screen . getByTestId ( 'users' ) ) . toBeInTheDocument ( )
2758
+ } )
2759
+
2760
+ expect ( router . state . location . pathname ) . toBe ( '/users' )
2761
+ } )
2762
+
2763
+ it ( 'should not resolve to 404 when basepath has trailing slash and URL matches' , async ( ) => {
2764
+ const rootRoute = createRootRoute ( {
2765
+ component : ( ) => < Outlet /> ,
2766
+ } )
2767
+
2768
+ const homeRoute = createRoute ( {
2769
+ getParentRoute : ( ) => rootRoute ,
2770
+ path : '/' ,
2771
+ component : ( ) => < div data-testid = "home" > Home</ div > ,
2772
+ } )
2773
+
2774
+ const usersRoute = createRoute ( {
2775
+ getParentRoute : ( ) => rootRoute ,
2776
+ path : '/users' ,
2777
+ component : ( ) => < div data-testid = "users" > Users</ div > ,
2778
+ } )
2779
+
2780
+ const routeTree = rootRoute . addChildren ( [ homeRoute , usersRoute ] )
2781
+
2782
+ const router = createRouter ( {
2783
+ routeTree,
2784
+ history : createMemoryHistory ( {
2785
+ initialEntries : [ '/my-app/' ] ,
2786
+ } ) ,
2787
+ rewrite : rewriteBasepath ( { basepath : '/my-app/' } ) , // With trailing slash
2788
+ } )
2789
+
2790
+ render ( < RouterProvider router = { router } /> )
2791
+
2792
+ await waitFor ( ( ) => {
2793
+ expect ( screen . getByTestId ( 'home' ) ) . toBeInTheDocument ( )
2794
+ } )
2795
+
2796
+ expect ( router . state . location . pathname ) . toBe ( '/' )
2797
+ expect ( router . state . statusCode ) . toBe ( 200 )
2798
+ } )
2799
+
2800
+ it ( 'should not resolve to 404 when basepath has no trailing slash and URL matches' , async ( ) => {
2801
+ const rootRoute = createRootRoute ( {
2802
+ component : ( ) => < Outlet /> ,
2803
+ } )
2804
+
2805
+ const homeRoute = createRoute ( {
2806
+ getParentRoute : ( ) => rootRoute ,
2807
+ path : '/' ,
2808
+ component : ( ) => < div data-testid = "home" > Home</ div > ,
2809
+ } )
2810
+
2811
+ const usersRoute = createRoute ( {
2812
+ getParentRoute : ( ) => rootRoute ,
2813
+ path : '/users' ,
2814
+ component : ( ) => < div data-testid = "users" > Users</ div > ,
2815
+ } )
2816
+
2817
+ const routeTree = rootRoute . addChildren ( [ homeRoute , usersRoute ] )
2818
+
2819
+ const router = createRouter ( {
2820
+ routeTree,
2821
+ history : createMemoryHistory ( {
2822
+ initialEntries : [ '/my-app' ] ,
2823
+ } ) ,
2824
+ rewrite : rewriteBasepath ( { basepath : '/my-app' } ) , // Without trailing slash
2825
+ } )
2826
+
2827
+ render ( < RouterProvider router = { router } /> )
2828
+
2829
+ await waitFor ( ( ) => {
2830
+ expect ( screen . getByTestId ( 'home' ) ) . toBeInTheDocument ( )
2831
+ } )
2832
+
2833
+ expect ( router . state . location . pathname ) . toBe ( '/' )
2834
+ expect ( router . state . statusCode ) . toBe ( 200 )
2835
+ } )
2836
+
2837
+ it ( 'should handle basepath with trailing slash when navigating to root path' , async ( ) => {
2838
+ const rootRoute = createRootRoute ( {
2839
+ component : ( ) => < Outlet /> ,
2840
+ } )
2841
+
2842
+ const homeRoute = createRoute ( {
2843
+ getParentRoute : ( ) => rootRoute ,
2844
+ path : '/' ,
2845
+ component : ( ) => (
2846
+ < div >
2847
+ < Link to = "/about" data-testid = "about-link" >
2848
+ About
2849
+ </ Link >
2850
+ </ div >
2851
+ ) ,
2852
+ } )
2853
+
2854
+ const aboutRoute = createRoute ( {
2855
+ getParentRoute : ( ) => rootRoute ,
2856
+ path : '/about' ,
2857
+ component : ( ) => < div data-testid = "about" > About</ div > ,
2858
+ } )
2859
+
2860
+ const routeTree = rootRoute . addChildren ( [ homeRoute , aboutRoute ] )
2861
+
2862
+ const history = createMemoryHistory ( { initialEntries : [ '/my-app/' ] } )
2863
+
2864
+ const router = createRouter ( {
2865
+ routeTree,
2866
+ history,
2867
+ rewrite : rewriteBasepath ( { basepath : '/my-app/' } ) , // With trailing slash
2868
+ } )
2869
+
2870
+ render ( < RouterProvider router = { router } /> )
2871
+
2872
+ const aboutLink = await screen . findByTestId ( 'about-link' )
2873
+ fireEvent . click ( aboutLink )
2874
+
2875
+ await waitFor ( ( ) => {
2876
+ expect ( screen . getByTestId ( 'about' ) ) . toBeInTheDocument ( )
2877
+ } )
2878
+
2879
+ expect ( router . state . location . pathname ) . toBe ( '/about' )
2880
+ expect ( history . location . pathname ) . toBe ( '/my-app/about' )
2881
+ } )
2882
+
2883
+ it ( 'should handle basepath without trailing slash when navigating to root path' , async ( ) => {
2884
+ const rootRoute = createRootRoute ( {
2885
+ component : ( ) => < Outlet /> ,
2886
+ } )
2887
+
2888
+ const homeRoute = createRoute ( {
2889
+ getParentRoute : ( ) => rootRoute ,
2890
+ path : '/' ,
2891
+ component : ( ) => (
2892
+ < div >
2893
+ < Link to = "/about" data-testid = "about-link" >
2894
+ About
2895
+ </ Link >
2896
+ </ div >
2897
+ ) ,
2898
+ } )
2899
+
2900
+ const aboutRoute = createRoute ( {
2901
+ getParentRoute : ( ) => rootRoute ,
2902
+ path : '/about' ,
2903
+ component : ( ) => < div data-testid = "about" > About</ div > ,
2904
+ } )
2905
+
2906
+ const routeTree = rootRoute . addChildren ( [ homeRoute , aboutRoute ] )
2907
+
2908
+ const history = createMemoryHistory ( { initialEntries : [ '/my-app' ] } )
2909
+
2910
+ const router = createRouter ( {
2911
+ routeTree,
2912
+ history,
2913
+ rewrite : rewriteBasepath ( { basepath : '/my-app' } ) , // Without trailing slash
2914
+ } )
2915
+
2916
+ render ( < RouterProvider router = { router } /> )
2917
+
2918
+ const aboutLink = await screen . findByTestId ( 'about-link' )
2919
+ fireEvent . click ( aboutLink )
2920
+
2921
+ await waitFor ( ( ) => {
2922
+ expect ( screen . getByTestId ( 'about' ) ) . toBeInTheDocument ( )
2923
+ } )
2924
+
2925
+ expect ( router . state . location . pathname ) . toBe ( '/about' )
2926
+ expect ( history . location . pathname ) . toBe ( '/my-app/about' )
2927
+ } )
2928
+
2673
2929
it ( 'should handle empty basepath gracefully' , async ( ) => {
2674
2930
const rootRoute = createRootRoute ( {
2675
2931
component : ( ) => < Outlet /> ,
0 commit comments