Skip to content

Commit cdea9e5

Browse files
committed
Get createSlice transform working and fix whitespace test failures
1 parent 2c86fa9 commit cdea9e5

File tree

10 files changed

+297
-30
lines changed

10 files changed

+297
-30
lines changed

packages/rtk-codemods2/transforms/createReducerBuilder/__testfixtures__/basic.output.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ createReducer(initialState, (builder) => {
1616
builder.addCase(todoAdded1e, (state, action) => {
1717
// stuff
1818
});
19+
1920
builder.addCase(todoAdded1f, (state, action) => {
2021
//stuff
2122
});
@@ -30,6 +31,7 @@ createReducer(initialState, (builder) => {
3031
builder.addCase(todoAdded2b, (state, action) => {
3132
// stuff
3233
});
34+
3335
builder.addCase(todoAdded2c, (state, action) => {
3436
// stuff
3537
});
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
createReducer(initialState, (builder) => {
2+
builder.addCase(todoAdded, (state: SliceState, action: PayloadAction<string>) => {
3+
// stuff
4+
});
5+
});
6+
7+
createReducer(initialState, (builder) => {
8+
builder.addCase(todoAdded, (state: SliceState, action: PayloadAction<string>) => {
9+
// stuff
10+
});
11+
});
Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,37 @@
1-
createReducer(initialState, {
2-
[todoAdded]: (state, action) => {
3-
// stuff
4-
},
1+
createReducer(initialState, (builder) => {
2+
builder.addCase(todoAdded1a, (state, action) => {
3+
// stuff 1a
4+
});
5+
6+
builder.addCase(todoAdded1b, (state, action) => action.payload);
7+
8+
builder.addCase(todoAdded1c + 'test', (state, action) => {
9+
// stuff 1c
10+
});
11+
12+
builder.addCase(todoAdded1d, (state, action) => {
13+
// stuff 1d
14+
});
15+
16+
builder.addCase(todoAdded1e, (state, action) => {
17+
// stuff 1e
18+
});
19+
20+
builder.addCase(todoAdded1f, (state, action) => {
21+
//stuff 1f
22+
});
523
});
624

7-
createReducer(initialState, {
8-
[todoAdded](state, action) {
9-
// stuff
10-
},
25+
createReducer(initialState, (builder) => {
26+
builder.addCase(todoAdded2a, (state, action) => {
27+
// stuff 2a
28+
});
29+
30+
builder.addCase(todoAdded2b, (state, action) => {
31+
// stuff 2b
32+
});
33+
34+
builder.addCase(todoAdded2c, (state, action) => {
35+
// stuff 2c
36+
});
1137
});
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
const slice1 = createSlice({
2+
name: "a",
3+
initialState,
4+
extraReducers: {
5+
[todoAdded]: (state: SliceState, action: PayloadAction<string>) => {
6+
// stuff
7+
},
8+
}
9+
});
10+
11+
const slice2 = createSlice({
12+
name: "b",
13+
initialState,
14+
extraReducers: {
15+
[todoAdded](state: SliceState, action: PayloadAction<string>) {
16+
// stuff
17+
},
18+
}
19+
});
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
const slice1 = createSlice({
2+
name: "a",
3+
initialState,
4+
5+
extraReducers: (builder) => {
6+
builder.addCase(todoAdded, (state: SliceState, action: PayloadAction<string>) => {
7+
// stuff
8+
});
9+
}
10+
});
11+
12+
const slice2 = createSlice({
13+
name: "b",
14+
initialState,
15+
16+
extraReducers: (builder) => {
17+
builder.addCase(todoAdded, (state: SliceState, action: PayloadAction<string>) => {
18+
// stuff
19+
});
20+
}
21+
});
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
const slice1 = createSlice({
2+
name: "a",
3+
initialState: {},
4+
extraReducers: {
5+
[todoAdded1a]: (state, action) => {
6+
// stuff
7+
},
8+
[todoAdded1b]: (state, action) => action.payload,
9+
[todoAdded1c + "test"]: (state, action) => {
10+
// stuff
11+
},
12+
[todoAdded1d](state, action) {
13+
// stuff
14+
},
15+
[todoAdded1e]: function(state, action) {
16+
// stuff
17+
},
18+
todoAdded1f: (state, action) => {
19+
//stuff
20+
}
21+
}
22+
});
23+
24+
25+
const slice2 = createSlice({
26+
name: "b",
27+
initialState: {},
28+
extraReducers: {
29+
[todoAdded2a]: (state, action) => {
30+
// stuff
31+
},
32+
[todoAdded2b](state, action) {
33+
// stuff
34+
},
35+
[todoAdded2c]: function(state, action) {
36+
// stuff
37+
}
38+
}
39+
});
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
const slice1 = createSlice({
2+
name: "a",
3+
initialState: {},
4+
5+
extraReducers: (builder) => {
6+
builder.addCase(todoAdded1a, (state, action) => {
7+
// stuff
8+
});
9+
10+
builder.addCase(todoAdded1b, (state, action) => action.payload);
11+
12+
builder.addCase(todoAdded1c + "test", (state, action) => {
13+
// stuff
14+
});
15+
16+
builder.addCase(todoAdded1d, (state, action) => {
17+
// stuff
18+
});
19+
20+
builder.addCase(todoAdded1e, (state, action) => {
21+
// stuff
22+
});
23+
24+
builder.addCase(todoAdded1f, (state, action) => {
25+
//stuff
26+
});
27+
}
28+
});
29+
30+
31+
const slice2 = createSlice({
32+
name: "b",
33+
initialState: {},
34+
35+
extraReducers: (builder) => {
36+
builder.addCase(todoAdded2a, (state, action) => {
37+
// stuff
38+
});
39+
40+
builder.addCase(todoAdded2b, (state, action) => {
41+
// stuff
42+
});
43+
44+
builder.addCase(todoAdded2c, (state, action) => {
45+
// stuff
46+
});
47+
}
48+
});

packages/rtk-codemods2/transforms/createSliceBuilder/index.js

Lines changed: 0 additions & 19 deletions
This file was deleted.
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
import { namedTypes } from 'ast-types';
2+
import { ExpressionKind, PatternKind } from 'ast-types/gen/kinds';
3+
import {
4+
BlockStatement,
5+
CallExpression,
6+
Expression,
7+
ExpressionStatement,
8+
JSCodeshift,
9+
ObjectExpression,
10+
ObjectMethod,
11+
ObjectProperty,
12+
Transform,
13+
} from 'jscodeshift';
14+
15+
type ObjectKey = ObjectMethod['key'] & ObjectProperty['key'];
16+
17+
function wrapInAddCaseExpression(
18+
j: JSCodeshift,
19+
key: ObjectKey,
20+
params: PatternKind[],
21+
body: BlockStatement | ExpressionKind
22+
) {
23+
const identifier = j.identifier('builder');
24+
return j.expressionStatement(
25+
j.callExpression(j.memberExpression(identifier, j.identifier('addCase'), false), [
26+
key,
27+
j.arrowFunctionExpression(params, body),
28+
])
29+
);
30+
}
31+
32+
export function reducerPropsToBuilderExpression(j: JSCodeshift, defNode: ObjectExpression) {
33+
const caseExpressions: ExpressionStatement[] = [];
34+
for (let property of defNode.properties) {
35+
let key: ObjectKey = null as any;
36+
let params: PatternKind[] = [];
37+
let body: BlockStatement | ExpressionKind = null as any;
38+
switch (property.type) {
39+
case 'ObjectMethod': {
40+
key = property.key;
41+
params = property.params;
42+
body = property.body;
43+
break;
44+
}
45+
case 'ObjectProperty': {
46+
switch (property.value.type) {
47+
case 'ArrowFunctionExpression':
48+
case 'FunctionExpression': {
49+
key = property.key;
50+
params = property.value.params;
51+
body = property.value.body;
52+
break;
53+
}
54+
}
55+
}
56+
}
57+
if (!body) {
58+
continue;
59+
}
60+
caseExpressions.push(wrapInAddCaseExpression(j, key, params, body));
61+
}
62+
63+
return j.arrowFunctionExpression([j.identifier('builder')], j.blockStatement(caseExpressions));
64+
}
65+
66+
const transform: Transform = (file, api) => {
67+
const j = api.jscodeshift;
68+
69+
return (
70+
j(file.source)
71+
// @ts-ignore some expression mismatch
72+
.find(j.CallExpression, {
73+
callee: { name: 'createSlice' },
74+
// @ts-ignore some expression mismatch
75+
arguments: { 0: { type: 'ObjectExpression' } },
76+
})
77+
78+
.filter((path) => {
79+
const createSliceArgsObject = path.node.arguments[0] as ObjectExpression;
80+
return createSliceArgsObject.properties.some(
81+
(p) =>
82+
p.type === 'ObjectProperty' &&
83+
p.key.type === 'Identifier' &&
84+
p.key.name === 'extraReducers' &&
85+
p.value.type === 'ObjectExpression'
86+
);
87+
})
88+
.forEach((path) => {
89+
const createSliceArgsObject = path.node.arguments[0] as ObjectExpression;
90+
j(path).replaceWith(
91+
j.callExpression(j.identifier('createSlice'), [
92+
j.objectExpression(
93+
createSliceArgsObject.properties.map((p) => {
94+
if (
95+
p.type === 'ObjectProperty' &&
96+
p.key.type === 'Identifier' &&
97+
p.key.name === 'extraReducers' &&
98+
p.value.type === 'ObjectExpression'
99+
) {
100+
const expressionStatement = reducerPropsToBuilderExpression(
101+
j,
102+
p.value as ObjectExpression
103+
);
104+
return j.objectProperty(p.key, expressionStatement);
105+
}
106+
return p;
107+
})
108+
),
109+
])
110+
);
111+
})
112+
.toSource({
113+
arrowParensAlways: true,
114+
})
115+
);
116+
};
117+
118+
export const parser = 'tsx';
119+
120+
export default transform;

packages/rtk-codemods2/transforms/createSliceBuilder/test.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
const { runTransformTest } = require('codemod-cli');
44

5-
runTransformTest({
5+
runTransformTest({
66
name: 'createSliceBuilder',
7-
path: require.resolve('./index.js'),
7+
path: require.resolve('./index.ts'),
88
fixtureDir: `${__dirname}/__testfixtures__/`,
9-
});
9+
});

0 commit comments

Comments
 (0)