Skip to content

Commit 3036c3f

Browse files
committed
feature: @putout/plugin-react-router: declare: add
1 parent 27da28c commit 3036c3f

14 files changed

Lines changed: 127 additions & 3 deletions

packages/plugin-react-router/README.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ npm i putout @putout/plugin-react-router -D
1313

1414
## Rules
1515

16+
-[declare](#declare);
1617
-[v6-convert-switch-to-routers](#v6-convert-switch-to-routers);
1718
-[v6-convert-component-to-element](#v6-convert-component-to-element);
1819
-[v7-split-multi-segment-route](#v7-split-multi-segment-route);
@@ -24,6 +25,7 @@ npm i putout @putout/plugin-react-router -D
2425
```json
2526
{
2627
"rules": {
28+
"react-router/declare": "on",
2729
"react-router/v6-convert-switch-to-routers": "on",
2830
"react-router/v6-convert-component-to-element": "on",
2931
"react-router/v7-split-multi-segment-route": "on",
@@ -34,6 +36,34 @@ npm i putout @putout/plugin-react-router -D
3436
}
3537
```
3638

39+
## declare
40+
41+
Check out in 🐊[Putout Editor](https://putout.cloudcmd.io/#/gist/c2d572f629f94043c3c5079fd95fe760/7d84e69ff1e770a1cbf5f4fc82846f7b60f47293).
42+
43+
### ❌ Example of incorrect code
44+
45+
```jsx
46+
const routes = () => (
47+
<Switch>
48+
<Route exact path="/login" component={Login}/>
49+
<Route exact path="/join" component={Join}/>
50+
</Switch>
51+
);
52+
```
53+
54+
### ✅ Example of correct code
55+
56+
```jsx
57+
import {Route, Routes} from 'react-router';
58+
59+
const routes = () => (
60+
<Routes>
61+
<Route exact path="/login" component={Login}/>
62+
<Route exact path="/join" component={Join}/>
63+
</Routes>
64+
);
65+
```
66+
3767
## v6-convert-switch-to-routes
3868

3969
`ReactRouter v6` [uses `Routers` instead of `Switch`](https://reactrouter.com/en/6.6.2/components/routes#routes). Check out in 🐊[Putout Editor](https://putout.cloudcmd.io/#/gist/2030cd7141bf5f02bef896b19b9400ea/a1364326157c85b9e8fa33b6c87cb77ca5a2792f).
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import {Link} from 'react-router';
2+
3+
export const Element = () => (
4+
<Link/>
5+
);
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const Element = () => <Link/>
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
export const declare = () => ({
2+
createBrowserRouter: `import { createBrowserRouter } from 'react-router'`,
3+
createHashRouter: `import { createHashRouter } from 'react-router'`,
4+
createMemoryRouter: `import { createMemoryRouter } from 'react-router'`,
5+
6+
createRoutesFromElements: `import { createRoutesFromElements } from 'react-router'`,
7+
createRoutesFromChildren: `import { createRoutesFromChildren } from 'react-router'`,
8+
9+
Routes: `import { Routes } from 'react-router'`,
10+
Route: `import { Route } from 'react-router'`,
11+
Outlet: `import { Outlet } from 'react-router'`,
12+
Navigate: `import { Navigate } from 'react-router'`,
13+
14+
Link: `import { Link } from 'react-router'`,
15+
NavLink: `import { NavLink } from 'react-router'`,
16+
17+
useNavigate: `import { useNavigate } from 'react-router'`,
18+
useLocation: `import { useLocation } from 'react-router'`,
19+
useParams: `import { useParams } from 'react-router'`,
20+
useSearchParams: `import { useSearchParams } from 'react-router'`,
21+
useMatch: `import { useMatch } from 'react-router'`,
22+
useMatches: `import { useMatches } from 'react-router'`,
23+
useHref: `import { useHref } from 'react-router'`,
24+
useResolvedPath: `import { useResolvedPath } from 'react-router'`,
25+
26+
useLoaderData: `import { useLoaderData } from 'react-router'`,
27+
useRouteLoaderData: `import { useRouteLoaderData } from 'react-router'`,
28+
useActionData: `import { useActionData } from 'react-router'`,
29+
useRevalidator: `import { useRevalidator } from 'react-router'`,
30+
useFetcher: `import { useFetcher } from 'react-router'`,
31+
useFetchers: `import { useFetchers } from 'react-router'`,
32+
useRouteError: `import { useRouteError } from 'react-router'`,
33+
34+
generatePath: `import { generatePath } from 'react-router'`,
35+
matchPath: `import { matchPath } from 'react-router'`,
36+
matchRoutes: `import { matchRoutes } from 'react-router'`,
37+
resolvePath: `import { resolvePath } from 'react-router'`,
38+
redirect: `import { redirect } from 'react-router'`,
39+
replace: `import { replace } from 'react-router'`,
40+
json: `import { json } from 'react-router'`,
41+
data: `import { data } from 'react-router'`,
42+
isRouteErrorResponse: `import { isRouteErrorResponse } from 'react-router'`,
43+
44+
StaticRouterProvider: `import { StaticRouterProvider } from 'react-router'`,
45+
ServerRouter: `import { ServerRouter } from 'react-router'`,
46+
47+
createStaticHandler: `import { createStaticHandler } from 'react-router'`,
48+
createStaticRouter: `import { createStaticRouter } from 'react-router'`,
49+
50+
RouterProvider: `import { RouterProvider } from 'react-router/dom'`,
51+
HydratedRouter: `import { HydratedRouter } from 'react-router/dom'`,
52+
});
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import {createTest} from '@putout/test';
2+
import * as plugin from './index.js';
3+
4+
const test = createTest(import.meta.url, {
5+
plugins: [
6+
['declare', plugin],
7+
],
8+
});
9+
10+
test('react-router: declare: report', (t) => {
11+
t.report('declare', `Declare 'Link', it referenced but not defined`);
12+
t.end();
13+
});
14+
15+
test('react-router: declare: transform', (t) => {
16+
t.transform('declare');
17+
t.end();
18+
});

packages/plugin-react-router/lib/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import * as declare from './declare/index.js';
12
import * as v8ApplyReactRouterDom from './v8-apply-react-router-dom/index.js';
23
import * as v7RemoveUselessServer from './v7-remove-useless-server/index.js';
34
import * as v6ConvertSwitchToRoutes from './v6-convert-switch-to-routes/index.js';
@@ -10,4 +11,5 @@ export const rules = {
1011
'v7-split-multi-segment-route': v7SplitMultiSegmentRoute,
1112
'v7-remove-useless-server': v7RemoveUselessServer,
1213
'v8-apply-react-router-dom': v8ApplyReactRouterDom,
14+
'declare': declare,
1315
};
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
import {Link} from 'react-router-dom';
1+
import {Link} from 'react-router/dom';
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import {Link} from 'react-router';
2+
3+
export const Element = () => (
4+
<Link/>
5+
);
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const Element = () => <Link/>
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1+
import {Route} from 'react-router';
2+
13
<Route path="/" element={<Home/>}/>;

0 commit comments

Comments
 (0)