@planningcenter/tapestry-migration-cli 2.4.0-rc.8 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +100 -6
- package/dist/tapestry-react-shim.cjs +1 -1
- package/package.json +2 -2
- package/src/components/button/index.ts +3 -3
- package/src/components/button/transforms/innerRefToRef.test.ts +170 -0
- package/src/components/button/transforms/innerRefToRef.ts +14 -0
- package/src/components/button/transforms/unsupportedProps.ts +8 -31
- package/src/components/link/index.ts +14 -4
- package/src/components/link/transforms/auditSpreadProps.test.ts +351 -0
- package/src/components/link/transforms/auditSpreadProps.ts +24 -0
- package/src/components/link/transforms/innerRefToRef.test.ts +170 -0
- package/src/components/link/transforms/innerRefToRef.ts +14 -0
- package/src/components/link/transforms/moveLinkImport.test.ts +295 -0
- package/src/components/{button/transforms/linkToButton.ts → link/transforms/moveLinkImport.ts} +4 -5
- package/src/components/link/transforms/{inlineMemberToKind.test.ts → removeInlineMember.test.ts} +13 -28
- package/src/components/link/transforms/removeInlineMember.ts +11 -0
- package/src/components/link/transforms/{inlinePropToKind.test.ts → removeInlineProp.test.ts} +12 -29
- package/src/components/link/transforms/{inlinePropToKind.ts → removeInlineProp.ts} +0 -9
- package/src/components/link/transforms/tooltipToWrapper.test.ts +392 -0
- package/src/components/link/transforms/tooltipToWrapper.ts +35 -0
- package/src/components/link/transforms/unsupportedProps.test.ts +265 -0
- package/src/components/link/transforms/unsupportedProps.ts +58 -0
- package/src/components/shared/helpers/unsupportedPropsHelpers.ts +35 -0
- package/src/components/shared/transformFactories/stylePropTransformFactory.ts +1 -0
- package/src/index.ts +18 -7
- package/src/components/button/transforms/linkToButton.test.ts +0 -426
- package/src/components/link/transforms/inlineMemberToKind.ts +0 -49
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import jscodeshift from "jscodeshift"
|
|
2
|
+
import { describe, expect, it } from "vitest"
|
|
3
|
+
|
|
4
|
+
import transform from "./moveLinkImport"
|
|
5
|
+
|
|
6
|
+
const j = jscodeshift.withParser("tsx")
|
|
7
|
+
|
|
8
|
+
function applyTransform(source: string): string | null {
|
|
9
|
+
const fileInfo = { path: "test.tsx", source }
|
|
10
|
+
return transform(
|
|
11
|
+
fileInfo,
|
|
12
|
+
{ j, jscodeshift: j, report: () => {}, stats: () => {} },
|
|
13
|
+
{}
|
|
14
|
+
) as string | null
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
describe("moveLinkImport transform", () => {
|
|
18
|
+
describe("basic transformations", () => {
|
|
19
|
+
it("should move Link import from tapestry-react to tapestry", () => {
|
|
20
|
+
const input = `
|
|
21
|
+
import { Link } from "@planningcenter/tapestry-react"
|
|
22
|
+
|
|
23
|
+
export default function Test() {
|
|
24
|
+
return <Link href="/test">Test</Link>
|
|
25
|
+
}
|
|
26
|
+
`.trim()
|
|
27
|
+
|
|
28
|
+
const expected = `
|
|
29
|
+
import { Link } from "@planningcenter/tapestry";
|
|
30
|
+
|
|
31
|
+
export default function Test() {
|
|
32
|
+
return <Link href="/test">Test</Link>
|
|
33
|
+
}
|
|
34
|
+
`.trim()
|
|
35
|
+
|
|
36
|
+
const result = applyTransform(input)
|
|
37
|
+
expect(result?.trim()).toBe(expected)
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
it("should handle multiple Link components", () => {
|
|
41
|
+
const input = `
|
|
42
|
+
import { Link } from "@planningcenter/tapestry-react"
|
|
43
|
+
|
|
44
|
+
export default function Test() {
|
|
45
|
+
return (
|
|
46
|
+
<div>
|
|
47
|
+
<Link href="/home">Home</Link>
|
|
48
|
+
<Link href="/about">About</Link>
|
|
49
|
+
</div>
|
|
50
|
+
)
|
|
51
|
+
}
|
|
52
|
+
`.trim()
|
|
53
|
+
|
|
54
|
+
const expected = `
|
|
55
|
+
import { Link } from "@planningcenter/tapestry";
|
|
56
|
+
|
|
57
|
+
export default function Test() {
|
|
58
|
+
return (
|
|
59
|
+
<div>
|
|
60
|
+
<Link href="/home">Home</Link>
|
|
61
|
+
<Link href="/about">About</Link>
|
|
62
|
+
</div>
|
|
63
|
+
)
|
|
64
|
+
}
|
|
65
|
+
`.trim()
|
|
66
|
+
|
|
67
|
+
const result = applyTransform(input)
|
|
68
|
+
expect(result?.trim()).toBe(expected)
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
it("should preserve other imports from tapestry-react", () => {
|
|
72
|
+
const input = `
|
|
73
|
+
import { Link, Button, Input } from "@planningcenter/tapestry-react"
|
|
74
|
+
|
|
75
|
+
export default function Test() {
|
|
76
|
+
return <Link href="/test">Test</Link>
|
|
77
|
+
}
|
|
78
|
+
`.trim()
|
|
79
|
+
|
|
80
|
+
const result = applyTransform(input)
|
|
81
|
+
expect(result).toContain(
|
|
82
|
+
'import { Button, Input } from "@planningcenter/tapestry-react"'
|
|
83
|
+
)
|
|
84
|
+
expect(result).toContain(
|
|
85
|
+
'import { Link } from "@planningcenter/tapestry"'
|
|
86
|
+
)
|
|
87
|
+
expect(result).toContain('<Link href="/test">Test</Link>')
|
|
88
|
+
expect(result).not.toContain(
|
|
89
|
+
'Link, Button } from "@planningcenter/tapestry-react"'
|
|
90
|
+
)
|
|
91
|
+
})
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
describe("import conflict handling", () => {
|
|
95
|
+
it("should use alias when Link already imported from tapestry", () => {
|
|
96
|
+
const input = `
|
|
97
|
+
import { Link } from "@planningcenter/tapestry"
|
|
98
|
+
import { Link as ReactLink } from "@planningcenter/tapestry-react"
|
|
99
|
+
|
|
100
|
+
export default function Test() {
|
|
101
|
+
return <ReactLink href="/test">Test</ReactLink>
|
|
102
|
+
}
|
|
103
|
+
`.trim()
|
|
104
|
+
|
|
105
|
+
const result = applyTransform(input)
|
|
106
|
+
expect(result).toContain(
|
|
107
|
+
'import { Link } from "@planningcenter/tapestry"'
|
|
108
|
+
)
|
|
109
|
+
expect(result).toContain('<Link href="/test">Test</Link>')
|
|
110
|
+
expect(result).not.toContain('from "@planningcenter/tapestry-react"')
|
|
111
|
+
expect(result).not.toContain("ReactLink")
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
it("should handle existing tapestry import with other components", () => {
|
|
115
|
+
const input = `
|
|
116
|
+
import { Button, Input } from "@planningcenter/tapestry"
|
|
117
|
+
import { Link } from "@planningcenter/tapestry-react"
|
|
118
|
+
|
|
119
|
+
export default function Test() {
|
|
120
|
+
return <Link href="/test">Test</Link>
|
|
121
|
+
}
|
|
122
|
+
`.trim()
|
|
123
|
+
|
|
124
|
+
const result = applyTransform(input)
|
|
125
|
+
expect(result).toContain(
|
|
126
|
+
'import { Button, Input, Link } from "@planningcenter/tapestry"'
|
|
127
|
+
)
|
|
128
|
+
expect(result).toContain('<Link href="/test">Test</Link>')
|
|
129
|
+
expect(result).not.toContain('from "@planningcenter/tapestry-react"')
|
|
130
|
+
})
|
|
131
|
+
})
|
|
132
|
+
|
|
133
|
+
describe("edge cases", () => {
|
|
134
|
+
it("should not transform if Link is not imported from tapestry-react", () => {
|
|
135
|
+
const input = `
|
|
136
|
+
import { Button } from "@planningcenter/tapestry-react"
|
|
137
|
+
|
|
138
|
+
export default function Test() {
|
|
139
|
+
return <Button>Test</Button>
|
|
140
|
+
}
|
|
141
|
+
`.trim()
|
|
142
|
+
|
|
143
|
+
const result = applyTransform(input)
|
|
144
|
+
expect(result).toBe(null)
|
|
145
|
+
})
|
|
146
|
+
|
|
147
|
+
it("should handle Link with aliased import", () => {
|
|
148
|
+
const input = `
|
|
149
|
+
import { Link as ReactLink } from "@planningcenter/tapestry-react"
|
|
150
|
+
|
|
151
|
+
export default function Test() {
|
|
152
|
+
return <ReactLink href="/test">Test</ReactLink>
|
|
153
|
+
}
|
|
154
|
+
`.trim()
|
|
155
|
+
|
|
156
|
+
const result = applyTransform(input)
|
|
157
|
+
expect(result).toContain(
|
|
158
|
+
'import { Link } from "@planningcenter/tapestry"'
|
|
159
|
+
)
|
|
160
|
+
expect(result).toContain('<Link href="/test">Test</Link>')
|
|
161
|
+
expect(result).not.toContain("ReactLink")
|
|
162
|
+
expect(result).not.toContain('from "@planningcenter/tapestry-react"')
|
|
163
|
+
})
|
|
164
|
+
|
|
165
|
+
it("should handle self-closing Link components", () => {
|
|
166
|
+
const input = `
|
|
167
|
+
import { Link } from "@planningcenter/tapestry-react"
|
|
168
|
+
|
|
169
|
+
export default function Test() {
|
|
170
|
+
return <Link href="/test" />
|
|
171
|
+
}
|
|
172
|
+
`.trim()
|
|
173
|
+
|
|
174
|
+
const expected = `
|
|
175
|
+
import { Link } from "@planningcenter/tapestry";
|
|
176
|
+
|
|
177
|
+
export default function Test() {
|
|
178
|
+
return <Link href="/test" />
|
|
179
|
+
}
|
|
180
|
+
`.trim()
|
|
181
|
+
|
|
182
|
+
const result = applyTransform(input)
|
|
183
|
+
expect(result?.trim()).toBe(expected)
|
|
184
|
+
})
|
|
185
|
+
|
|
186
|
+
it("should handle Link with props", () => {
|
|
187
|
+
const input = `
|
|
188
|
+
import { Link } from "@planningcenter/tapestry-react"
|
|
189
|
+
|
|
190
|
+
export default function Test() {
|
|
191
|
+
return <Link href="/test" kind="primary" onClick={handleClick}>Test</Link>
|
|
192
|
+
}
|
|
193
|
+
`.trim()
|
|
194
|
+
|
|
195
|
+
const result = applyTransform(input)
|
|
196
|
+
expect(result).toContain(
|
|
197
|
+
'import { Link } from "@planningcenter/tapestry"'
|
|
198
|
+
)
|
|
199
|
+
expect(result).toContain('kind="primary"')
|
|
200
|
+
expect(result).toContain("onClick={handleClick}")
|
|
201
|
+
expect(result).not.toContain('from "@planningcenter/tapestry-react"')
|
|
202
|
+
})
|
|
203
|
+
})
|
|
204
|
+
|
|
205
|
+
describe("no changes scenarios", () => {
|
|
206
|
+
it("should return null when no Link import exists", () => {
|
|
207
|
+
const input = `
|
|
208
|
+
import React from "react"
|
|
209
|
+
|
|
210
|
+
export default function Test() {
|
|
211
|
+
return <div>Hello</div>
|
|
212
|
+
}
|
|
213
|
+
`.trim()
|
|
214
|
+
|
|
215
|
+
const result = applyTransform(input)
|
|
216
|
+
expect(result).toBe(null)
|
|
217
|
+
})
|
|
218
|
+
|
|
219
|
+
it("should return null when Link already imported from tapestry", () => {
|
|
220
|
+
const input = `
|
|
221
|
+
import { Link } from "@planningcenter/tapestry"
|
|
222
|
+
|
|
223
|
+
export default function Test() {
|
|
224
|
+
return <Link href="/test">Test</Link>
|
|
225
|
+
}
|
|
226
|
+
`.trim()
|
|
227
|
+
|
|
228
|
+
const result = applyTransform(input)
|
|
229
|
+
expect(result).toBe(null)
|
|
230
|
+
})
|
|
231
|
+
|
|
232
|
+
it("should return null for empty file", () => {
|
|
233
|
+
const result = applyTransform("")
|
|
234
|
+
expect(result).toBe(null)
|
|
235
|
+
})
|
|
236
|
+
})
|
|
237
|
+
|
|
238
|
+
describe("complex scenarios", () => {
|
|
239
|
+
it("should handle mixed imports and multiple components", () => {
|
|
240
|
+
const input = `
|
|
241
|
+
import React from "react"
|
|
242
|
+
import { Link, Button } from "@planningcenter/tapestry-react"
|
|
243
|
+
import { Input } from "@planningcenter/tapestry"
|
|
244
|
+
|
|
245
|
+
export default function Test() {
|
|
246
|
+
return (
|
|
247
|
+
<form>
|
|
248
|
+
<Input name="email" />
|
|
249
|
+
<Button type="submit">Submit</Button>
|
|
250
|
+
<Link href="/cancel">Cancel</Link>
|
|
251
|
+
</form>
|
|
252
|
+
)
|
|
253
|
+
}
|
|
254
|
+
`.trim()
|
|
255
|
+
|
|
256
|
+
const result = applyTransform(input)
|
|
257
|
+
expect(result).toContain(
|
|
258
|
+
'import { Button } from "@planningcenter/tapestry-react"'
|
|
259
|
+
)
|
|
260
|
+
expect(result).toContain(
|
|
261
|
+
'import { Input, Link } from "@planningcenter/tapestry"'
|
|
262
|
+
)
|
|
263
|
+
expect(result).toContain('<Button type="submit">Submit</Button>')
|
|
264
|
+
expect(result).toContain('<Link href="/cancel">Cancel</Link>')
|
|
265
|
+
expect(result).not.toContain(
|
|
266
|
+
'Link, Button } from "@planningcenter/tapestry-react"'
|
|
267
|
+
)
|
|
268
|
+
})
|
|
269
|
+
|
|
270
|
+
it("should handle Link usage in JSX expressions", () => {
|
|
271
|
+
const input = `
|
|
272
|
+
import { Link } from "@planningcenter/tapestry-react"
|
|
273
|
+
|
|
274
|
+
export default function Test({ showLink }) {
|
|
275
|
+
return (
|
|
276
|
+
<div>
|
|
277
|
+
{showLink && <Link href="/conditional">Conditional</Link>}
|
|
278
|
+
{items.map(item => <Link key={item.id} href={item.url}>{item.name}</Link>)}
|
|
279
|
+
</div>
|
|
280
|
+
)
|
|
281
|
+
}
|
|
282
|
+
`.trim()
|
|
283
|
+
|
|
284
|
+
const result = applyTransform(input)
|
|
285
|
+
expect(result).toContain(
|
|
286
|
+
'import { Link } from "@planningcenter/tapestry"'
|
|
287
|
+
)
|
|
288
|
+
expect(result).toContain('<Link href="/conditional">Conditional</Link>')
|
|
289
|
+
expect(result).toContain(
|
|
290
|
+
"<Link key={item.id} href={item.url}>{item.name}</Link>"
|
|
291
|
+
)
|
|
292
|
+
expect(result).not.toContain('from "@planningcenter/tapestry-react"')
|
|
293
|
+
})
|
|
294
|
+
})
|
|
295
|
+
})
|
package/src/components/{button/transforms/linkToButton.ts → link/transforms/moveLinkImport.ts}
RENAMED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import { Transform } from "jscodeshift"
|
|
2
2
|
|
|
3
|
-
import { hasAttribute } from "../../shared/conditions/hasAttribute"
|
|
4
3
|
import { componentTransformFactory } from "../../shared/transformFactories/componentTransformFactory"
|
|
5
4
|
|
|
6
5
|
const transform: Transform = componentTransformFactory({
|
|
7
|
-
condition:
|
|
8
|
-
conflictAlias: "
|
|
6
|
+
condition: () => true,
|
|
7
|
+
conflictAlias: "TLink",
|
|
9
8
|
fromComponent: "Link",
|
|
10
9
|
fromPackage: "@planningcenter/tapestry-react",
|
|
11
|
-
toComponent: "
|
|
12
|
-
toPackage: "@planningcenter/tapestry
|
|
10
|
+
toComponent: "Link",
|
|
11
|
+
toPackage: "@planningcenter/tapestry",
|
|
13
12
|
})
|
|
14
13
|
|
|
15
14
|
export default transform
|
package/src/components/link/transforms/{inlineMemberToKind.test.ts → removeInlineMember.test.ts}
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import jscodeshift from "jscodeshift"
|
|
2
2
|
import { describe, expect, it } from "vitest"
|
|
3
3
|
|
|
4
|
-
import transform from "./
|
|
4
|
+
import transform from "./removeInlineMember"
|
|
5
5
|
|
|
6
6
|
const j = jscodeshift.withParser("tsx")
|
|
7
7
|
|
|
@@ -14,9 +14,9 @@ function applyTransform(source: string): string | null {
|
|
|
14
14
|
) as string | null
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
describe("
|
|
17
|
+
describe("removeInlineMember transform", () => {
|
|
18
18
|
describe("basic transformations", () => {
|
|
19
|
-
it("should transform Link.Inline to Link
|
|
19
|
+
it("should transform Link.Inline to Link", () => {
|
|
20
20
|
const input = `
|
|
21
21
|
import { Link } from "@planningcenter/tapestry-react"
|
|
22
22
|
|
|
@@ -29,7 +29,7 @@ export default function Test() {
|
|
|
29
29
|
import { Link } from "@planningcenter/tapestry-react"
|
|
30
30
|
|
|
31
31
|
export default function Test() {
|
|
32
|
-
return <Link href="/profile"
|
|
32
|
+
return <Link href="/profile">Profile</Link>;
|
|
33
33
|
}
|
|
34
34
|
`.trim()
|
|
35
35
|
|
|
@@ -57,13 +57,11 @@ export default function Test() {
|
|
|
57
57
|
`.trim()
|
|
58
58
|
|
|
59
59
|
const result = applyTransform(input)
|
|
60
|
-
expect(result).toContain('kind="inline-text"')
|
|
61
60
|
expect(result).toContain('href="/dashboard"')
|
|
62
61
|
expect(result).toContain('className="nav-link"')
|
|
63
62
|
expect(result).toContain('target="_blank"')
|
|
64
63
|
expect(result).toContain('rel="noopener"')
|
|
65
64
|
expect(result).toContain('data-testid="profile-link"')
|
|
66
|
-
expect(result).toContain('kind="inline-text"')
|
|
67
65
|
expect(result).toContain("<Link")
|
|
68
66
|
expect(result).not.toContain("Link.Inline")
|
|
69
67
|
})
|
|
@@ -81,7 +79,7 @@ export default function Test() {
|
|
|
81
79
|
import { Link } from "@planningcenter/tapestry-react"
|
|
82
80
|
|
|
83
81
|
export default function Test() {
|
|
84
|
-
return <Link href="/dashboard"
|
|
82
|
+
return <Link href="/dashboard" />;
|
|
85
83
|
}
|
|
86
84
|
`.trim()
|
|
87
85
|
|
|
@@ -104,12 +102,8 @@ export default function Test() {
|
|
|
104
102
|
`.trim()
|
|
105
103
|
|
|
106
104
|
const result = applyTransform(input)
|
|
107
|
-
expect(result).toContain(
|
|
108
|
-
|
|
109
|
-
)
|
|
110
|
-
expect(result).toContain(
|
|
111
|
-
'<Link href="/about" kind="inline-text">About</Link>'
|
|
112
|
-
)
|
|
105
|
+
expect(result).toContain('<Link href="/home">Home</Link>')
|
|
106
|
+
expect(result).toContain('<Link href="/about">About</Link>')
|
|
113
107
|
expect(result).not.toContain("Link.Inline")
|
|
114
108
|
})
|
|
115
109
|
})
|
|
@@ -132,9 +126,7 @@ export default function Test() {
|
|
|
132
126
|
|
|
133
127
|
const result = applyTransform(input)
|
|
134
128
|
expect(result).toContain('<Link href="/home">Home</Link>')
|
|
135
|
-
expect(result).toContain(
|
|
136
|
-
'<Link href="/profile" kind="inline-text">Profile</Link>'
|
|
137
|
-
)
|
|
129
|
+
expect(result).toContain('<Link href="/profile">Profile</Link>')
|
|
138
130
|
expect(result).toContain(
|
|
139
131
|
'<Link as="button" href="/dashboard">Dashboard</Link>'
|
|
140
132
|
)
|
|
@@ -152,7 +144,7 @@ export default function Test() {
|
|
|
152
144
|
|
|
153
145
|
const result = applyTransform(input)
|
|
154
146
|
expect(result).toContain(
|
|
155
|
-
'<TapestryLink href="/profile"
|
|
147
|
+
'<TapestryLink href="/profile">Profile</TapestryLink>'
|
|
156
148
|
)
|
|
157
149
|
expect(result).not.toContain("TapestryLink.Inline")
|
|
158
150
|
})
|
|
@@ -175,11 +167,9 @@ export default function Test({ items, showInline }) {
|
|
|
175
167
|
|
|
176
168
|
const result = applyTransform(input)
|
|
177
169
|
expect(result).toContain(
|
|
178
|
-
|
|
179
|
-
)
|
|
180
|
-
expect(result).toContain(
|
|
181
|
-
'<Link href="/conditional" kind="inline-text">Conditional</Link>'
|
|
170
|
+
"<Link key={item.id} href={item.url}>{item.name}</Link>"
|
|
182
171
|
)
|
|
172
|
+
expect(result).toContain('<Link href="/conditional">Conditional</Link>')
|
|
183
173
|
expect(result).not.toContain("Link.Inline")
|
|
184
174
|
})
|
|
185
175
|
})
|
|
@@ -216,7 +206,6 @@ export default function Test({ url, isExternal }) {
|
|
|
216
206
|
`.trim()
|
|
217
207
|
|
|
218
208
|
const result = applyTransform(input)
|
|
219
|
-
expect(result).toContain('kind="inline-text"')
|
|
220
209
|
expect(result).toContain("<Link")
|
|
221
210
|
expect(result).toContain("href={url}")
|
|
222
211
|
expect(result).toContain('target={isExternal ? "_blank" : "_self"}')
|
|
@@ -245,12 +234,8 @@ export default function Test() {
|
|
|
245
234
|
`.trim()
|
|
246
235
|
|
|
247
236
|
const result = applyTransform(input)
|
|
248
|
-
expect(result).toContain(
|
|
249
|
-
|
|
250
|
-
)
|
|
251
|
-
expect(result).toContain(
|
|
252
|
-
'<Link href="/help" kind="inline-text">help section</Link>'
|
|
253
|
-
)
|
|
237
|
+
expect(result).toContain('<Link href="/about">about page</Link>')
|
|
238
|
+
expect(result).toContain('<Link href="/help">help section</Link>')
|
|
254
239
|
expect(result).not.toContain("Link.Inline")
|
|
255
240
|
})
|
|
256
241
|
})
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { componentTransformFactory } from "../../shared/transformFactories/componentTransformFactory"
|
|
2
|
+
|
|
3
|
+
const transform = componentTransformFactory({
|
|
4
|
+
condition: () => true, // Transform all Link.Inline elements
|
|
5
|
+
fromComponent: "Link.Inline",
|
|
6
|
+
fromPackage: "@planningcenter/tapestry-react",
|
|
7
|
+
toComponent: "Link",
|
|
8
|
+
toPackage: "@planningcenter/tapestry-react",
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
export default transform
|
package/src/components/link/transforms/{inlinePropToKind.test.ts → removeInlineProp.test.ts}
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import jscodeshift from "jscodeshift"
|
|
2
2
|
import { describe, expect, it } from "vitest"
|
|
3
3
|
|
|
4
|
-
import transform from "./
|
|
4
|
+
import transform from "./removeInlineProp"
|
|
5
5
|
|
|
6
6
|
const j = jscodeshift.withParser("tsx")
|
|
7
7
|
|
|
@@ -14,9 +14,9 @@ function applyTransform(source: string): string | null {
|
|
|
14
14
|
) as string | null
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
describe("
|
|
17
|
+
describe("removeInlineProp transform", () => {
|
|
18
18
|
describe("basic transformations", () => {
|
|
19
|
-
it("should
|
|
19
|
+
it("should remove inline prop from Link", () => {
|
|
20
20
|
const input = `
|
|
21
21
|
import { Link } from "@planningcenter/tapestry-react"
|
|
22
22
|
|
|
@@ -26,14 +26,14 @@ export default function Test() {
|
|
|
26
26
|
`.trim()
|
|
27
27
|
|
|
28
28
|
const result = applyTransform(input)
|
|
29
|
-
expect(result).toContain('kind="inline-text"')
|
|
30
29
|
expect(result).not.toContain("inline>")
|
|
31
30
|
expect(result).not.toContain("inline />")
|
|
32
31
|
expect(result).not.toContain("inline=")
|
|
33
32
|
expect(result).toContain('href="/profile"')
|
|
33
|
+
expect(result).toContain('<Link href="/profile">Profile</Link>')
|
|
34
34
|
})
|
|
35
35
|
|
|
36
|
-
it("should
|
|
36
|
+
it("should remove inline={true} from Link", () => {
|
|
37
37
|
const input = `
|
|
38
38
|
import { Link } from "@planningcenter/tapestry-react"
|
|
39
39
|
|
|
@@ -43,7 +43,6 @@ export default function Test() {
|
|
|
43
43
|
`.trim()
|
|
44
44
|
|
|
45
45
|
const result = applyTransform(input)
|
|
46
|
-
expect(result).toContain('kind="inline-text"')
|
|
47
46
|
expect(result).not.toContain("inline>")
|
|
48
47
|
expect(result).not.toContain("inline />")
|
|
49
48
|
expect(result).not.toContain("inline=")
|
|
@@ -69,7 +68,6 @@ export default function Test() {
|
|
|
69
68
|
`.trim()
|
|
70
69
|
|
|
71
70
|
const result = applyTransform(input)
|
|
72
|
-
expect(result).toContain('kind="inline-text"')
|
|
73
71
|
expect(result).toContain('href="/dashboard"')
|
|
74
72
|
expect(result).toContain('className="nav-link"')
|
|
75
73
|
expect(result).toContain('data-testid="profile-link"')
|
|
@@ -88,7 +86,6 @@ export default function Test() {
|
|
|
88
86
|
`.trim()
|
|
89
87
|
|
|
90
88
|
const result = applyTransform(input)
|
|
91
|
-
expect(result).toContain('kind="inline-text"')
|
|
92
89
|
expect(result).toContain('href="/dashboard"')
|
|
93
90
|
expect(result).not.toContain("inline>")
|
|
94
91
|
expect(result).not.toContain("inline />")
|
|
@@ -110,12 +107,8 @@ export default function Test() {
|
|
|
110
107
|
`.trim()
|
|
111
108
|
|
|
112
109
|
const result = applyTransform(input)
|
|
113
|
-
expect(result).toContain(
|
|
114
|
-
|
|
115
|
-
)
|
|
116
|
-
expect(result).toContain(
|
|
117
|
-
'<Link href="/about" kind="inline-text">About</Link>'
|
|
118
|
-
)
|
|
110
|
+
expect(result).toContain('<Link href="/home">Home</Link>')
|
|
111
|
+
expect(result).toContain('<Link href="/about">About</Link>')
|
|
119
112
|
expect(result).not.toContain("inline>")
|
|
120
113
|
expect(result).not.toContain("inline />")
|
|
121
114
|
expect(result).not.toContain("inline=")
|
|
@@ -140,9 +133,7 @@ export default function Test() {
|
|
|
140
133
|
|
|
141
134
|
const result = applyTransform(input)
|
|
142
135
|
expect(result).toContain('<Link href="/home">Home</Link>')
|
|
143
|
-
expect(result).toContain(
|
|
144
|
-
'<Link href="/profile" kind="inline-text">Profile</Link>'
|
|
145
|
-
)
|
|
136
|
+
expect(result).toContain('<Link href="/profile">Profile</Link>')
|
|
146
137
|
expect(result).toContain(
|
|
147
138
|
'<Link href="/dashboard" kind="primary">Dashboard</Link>'
|
|
148
139
|
)
|
|
@@ -161,7 +152,6 @@ export default function Test() {
|
|
|
161
152
|
`.trim()
|
|
162
153
|
|
|
163
154
|
const result = applyTransform(input)
|
|
164
|
-
expect(result).toContain('kind="inline-text"')
|
|
165
155
|
expect(result).not.toContain("inline>")
|
|
166
156
|
expect(result).not.toContain("inline />")
|
|
167
157
|
expect(result).not.toContain("inline=")
|
|
@@ -193,7 +183,6 @@ export default function Test({ linkProps }) {
|
|
|
193
183
|
`.trim()
|
|
194
184
|
|
|
195
185
|
const result = applyTransform(input)
|
|
196
|
-
expect(result).toContain('kind="inline-text"')
|
|
197
186
|
expect(result).toContain("{...linkProps}")
|
|
198
187
|
expect(result).not.toContain("inline>")
|
|
199
188
|
expect(result).not.toContain("inline />")
|
|
@@ -218,11 +207,9 @@ export default function Test({ items, showInline }) {
|
|
|
218
207
|
|
|
219
208
|
const result = applyTransform(input)
|
|
220
209
|
expect(result).toContain(
|
|
221
|
-
|
|
222
|
-
)
|
|
223
|
-
expect(result).toContain(
|
|
224
|
-
'<Link href="/conditional" kind="inline-text">Conditional</Link>'
|
|
210
|
+
"<Link key={item.id} href={item.url}>{item.name}</Link>"
|
|
225
211
|
)
|
|
212
|
+
expect(result).toContain('<Link href="/conditional">Conditional</Link>')
|
|
226
213
|
expect(result).not.toContain("inline>")
|
|
227
214
|
expect(result).not.toContain("inline />")
|
|
228
215
|
expect(result).not.toContain("inline=")
|
|
@@ -247,12 +234,8 @@ export default function Test() {
|
|
|
247
234
|
`.trim()
|
|
248
235
|
|
|
249
236
|
const result = applyTransform(input)
|
|
250
|
-
expect(result).toContain(
|
|
251
|
-
|
|
252
|
-
)
|
|
253
|
-
expect(result).toContain(
|
|
254
|
-
'<Link href="/help" kind="inline-text">help section</Link>'
|
|
255
|
-
)
|
|
237
|
+
expect(result).toContain('<Link href="/about">about page</Link>')
|
|
238
|
+
expect(result).toContain('<Link href="/help">help section</Link>')
|
|
256
239
|
expect(result).not.toContain("inline>")
|
|
257
240
|
expect(result).not.toContain("inline />")
|
|
258
241
|
expect(result).not.toContain("inline=")
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { addAttribute } from "../../shared/actions/addAttribute"
|
|
2
1
|
import { removeAttribute } from "../../shared/actions/removeAttribute"
|
|
3
2
|
import { hasAttribute } from "../../shared/conditions/hasAttribute"
|
|
4
3
|
import { attributeTransformFactory } from "../../shared/transformFactories/attributeTransformFactory"
|
|
@@ -9,14 +8,6 @@ const transform = attributeTransformFactory({
|
|
|
9
8
|
targetPackage: "@planningcenter/tapestry-react",
|
|
10
9
|
transform: (element, { j, source }) => {
|
|
11
10
|
removeAttribute("inline", { element, j, source })
|
|
12
|
-
|
|
13
|
-
addAttribute({
|
|
14
|
-
element,
|
|
15
|
-
j,
|
|
16
|
-
name: "kind",
|
|
17
|
-
value: "inline-text",
|
|
18
|
-
})
|
|
19
|
-
|
|
20
11
|
return true
|
|
21
12
|
},
|
|
22
13
|
})
|