@sanity/ui-codemod 1.0.0-alpha.1

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.
Files changed (157) hide show
  1. package/bin/run.js +5 -0
  2. package/dist/_chunks-es/addAttribute.js +11 -0
  3. package/dist/_chunks-es/addAttribute.js.map +1 -0
  4. package/dist/_chunks-es/box.mods.js +186 -0
  5. package/dist/_chunks-es/box.mods.js.map +1 -0
  6. package/dist/_chunks-es/flex.mods.js +74 -0
  7. package/dist/_chunks-es/flex.mods.js.map +1 -0
  8. package/dist/_chunks-es/getTransformPath.js +75 -0
  9. package/dist/_chunks-es/getTransformPath.js.map +1 -0
  10. package/dist/_chunks-es/grid.mods.js +110 -0
  11. package/dist/_chunks-es/grid.mods.js.map +1 -0
  12. package/dist/_chunks-es/layout-mods.js +424 -0
  13. package/dist/_chunks-es/layout-mods.js.map +1 -0
  14. package/dist/_chunks-es/transformComponent.js +359 -0
  15. package/dist/_chunks-es/transformComponent.js.map +1 -0
  16. package/dist/commands/latest/box.d.ts +47 -0
  17. package/dist/commands/latest/box.js +17 -0
  18. package/dist/commands/latest/box.js.map +1 -0
  19. package/dist/commands/latest/card.d.ts +47 -0
  20. package/dist/commands/latest/card.js +17 -0
  21. package/dist/commands/latest/card.js.map +1 -0
  22. package/dist/commands/latest/code.d.ts +47 -0
  23. package/dist/commands/latest/code.js +17 -0
  24. package/dist/commands/latest/code.js.map +1 -0
  25. package/dist/commands/latest/container.d.ts +47 -0
  26. package/dist/commands/latest/container.js +17 -0
  27. package/dist/commands/latest/container.js.map +1 -0
  28. package/dist/commands/latest/flex.d.ts +47 -0
  29. package/dist/commands/latest/flex.js +17 -0
  30. package/dist/commands/latest/flex.js.map +1 -0
  31. package/dist/commands/latest/grid.d.ts +47 -0
  32. package/dist/commands/latest/grid.js +17 -0
  33. package/dist/commands/latest/grid.js.map +1 -0
  34. package/dist/commands/latest/heading.d.ts +47 -0
  35. package/dist/commands/latest/heading.js +17 -0
  36. package/dist/commands/latest/heading.js.map +1 -0
  37. package/dist/commands/latest/text.d.ts +47 -0
  38. package/dist/commands/latest/text.js +17 -0
  39. package/dist/commands/latest/text.js.map +1 -0
  40. package/dist/transforms/latest/box/box.d.ts +18 -0
  41. package/dist/transforms/latest/box/box.js +101 -0
  42. package/dist/transforms/latest/box/box.js.map +1 -0
  43. package/dist/transforms/latest/card/card.d.ts +18 -0
  44. package/dist/transforms/latest/card/card.js +618 -0
  45. package/dist/transforms/latest/card/card.js.map +1 -0
  46. package/dist/transforms/latest/code/code.d.ts +18 -0
  47. package/dist/transforms/latest/code/code.js +73 -0
  48. package/dist/transforms/latest/code/code.js.map +1 -0
  49. package/dist/transforms/latest/container/container.d.ts +18 -0
  50. package/dist/transforms/latest/container/container.js +91 -0
  51. package/dist/transforms/latest/container/container.js.map +1 -0
  52. package/dist/transforms/latest/flex/flex.d.ts +18 -0
  53. package/dist/transforms/latest/flex/flex.js +19 -0
  54. package/dist/transforms/latest/flex/flex.js.map +1 -0
  55. package/dist/transforms/latest/grid/grid.d.ts +18 -0
  56. package/dist/transforms/latest/grid/grid.js +19 -0
  57. package/dist/transforms/latest/grid/grid.js.map +1 -0
  58. package/dist/transforms/latest/heading/heading.d.ts +18 -0
  59. package/dist/transforms/latest/heading/heading.js +85 -0
  60. package/dist/transforms/latest/heading/heading.js.map +1 -0
  61. package/dist/transforms/latest/text/text.d.ts +18 -0
  62. package/dist/transforms/latest/text/text.js +88 -0
  63. package/dist/transforms/latest/text/text.js.map +1 -0
  64. package/package.json +68 -0
  65. package/src/baseCommand.ts +74 -0
  66. package/src/commands/latest/box.ts +21 -0
  67. package/src/commands/latest/card.ts +21 -0
  68. package/src/commands/latest/code.ts +21 -0
  69. package/src/commands/latest/container.ts +21 -0
  70. package/src/commands/latest/flex.ts +21 -0
  71. package/src/commands/latest/grid.ts +21 -0
  72. package/src/commands/latest/heading.ts +21 -0
  73. package/src/commands/latest/inline.ts +21 -0
  74. package/src/commands/latest/label.ts +21 -0
  75. package/src/commands/latest/stack.ts +21 -0
  76. package/src/commands/latest/text.ts +21 -0
  77. package/src/constants/latest/layout-mods.ts +422 -0
  78. package/src/transforms/latest/box/box.mods.ts +88 -0
  79. package/src/transforms/latest/box/box.test.ts +204 -0
  80. package/src/transforms/latest/box/box.ts +104 -0
  81. package/src/transforms/latest/card/card.mods.ts +592 -0
  82. package/src/transforms/latest/card/card.test.ts +207 -0
  83. package/src/transforms/latest/card/card.ts +71 -0
  84. package/src/transforms/latest/code/code.mods.ts +57 -0
  85. package/src/transforms/latest/code/code.test.ts +61 -0
  86. package/src/transforms/latest/code/code.ts +53 -0
  87. package/src/transforms/latest/container/container.mods.ts +77 -0
  88. package/src/transforms/latest/container/container.test.ts +105 -0
  89. package/src/transforms/latest/container/container.ts +42 -0
  90. package/src/transforms/latest/flex/flex.mods.ts +73 -0
  91. package/src/transforms/latest/flex/flex.test.ts +80 -0
  92. package/src/transforms/latest/flex/flex.ts +42 -0
  93. package/src/transforms/latest/grid/grid.mods.ts +109 -0
  94. package/src/transforms/latest/grid/grid.test.ts +97 -0
  95. package/src/transforms/latest/grid/grid.ts +42 -0
  96. package/src/transforms/latest/heading/heading.mods.ts +70 -0
  97. package/src/transforms/latest/heading/heading.test.ts +87 -0
  98. package/src/transforms/latest/heading/heading.ts +53 -0
  99. package/src/transforms/latest/inline/inline.mods.ts +65 -0
  100. package/src/transforms/latest/inline/inline.test.ts +57 -0
  101. package/src/transforms/latest/inline/inline.ts +42 -0
  102. package/src/transforms/latest/label/label.mods.ts +72 -0
  103. package/src/transforms/latest/label/label.test.ts +113 -0
  104. package/src/transforms/latest/label/label.ts +67 -0
  105. package/src/transforms/latest/stack/stack.mods.ts +12 -0
  106. package/src/transforms/latest/stack/stack.test.ts +160 -0
  107. package/src/transforms/latest/stack/stack.ts +102 -0
  108. package/src/transforms/latest/text/text.mods.ts +72 -0
  109. package/src/transforms/latest/text/text.test.ts +113 -0
  110. package/src/transforms/latest/text/text.ts +57 -0
  111. package/src/types/AnyExpression.ts +9 -0
  112. package/src/types/AttributeMods.ts +16 -0
  113. package/src/types/BaseOptions.ts +6 -0
  114. package/src/utils/addAttribute.test.ts +43 -0
  115. package/src/utils/addAttribute.ts +26 -0
  116. package/src/utils/addImportSpecifier.test.ts +36 -0
  117. package/src/utils/addImportSpecifier.ts +42 -0
  118. package/src/utils/getAttribute.ts +22 -0
  119. package/src/utils/getAttributeExpression.ts +22 -0
  120. package/src/utils/getAttributeValue.ts +20 -0
  121. package/src/utils/getClonedImportSpecifiers.ts +29 -0
  122. package/src/utils/getComponentJsxNames.ts +17 -0
  123. package/src/utils/getComponentLocalNames.ts +69 -0
  124. package/src/utils/getCompositeAttrValue.ts +39 -0
  125. package/src/utils/getMappingArray.ts +36 -0
  126. package/src/utils/getMappingExpression.ts +22 -0
  127. package/src/utils/getMappingValue.ts +52 -0
  128. package/src/utils/getShorthandAttributes.ts +54 -0
  129. package/src/utils/getSplitImportSpecifiers.ts +40 -0
  130. package/src/utils/getStaticAttributeExpression.ts +35 -0
  131. package/src/utils/getStyleExpression.ts +37 -0
  132. package/src/utils/getStyledComponentAliases.ts +28 -0
  133. package/src/utils/getStyledComponentName.ts +52 -0
  134. package/src/utils/getTransformPath.ts +17 -0
  135. package/src/utils/insertTodoWarning.ts +48 -0
  136. package/src/utils/isImportBindingUsed.ts +53 -0
  137. package/src/utils/isValidStyleType.ts +21 -0
  138. package/src/utils/mergeStyle.ts +64 -0
  139. package/src/utils/removeUnusedImport.test.ts +77 -0
  140. package/src/utils/removeUnusedImport.ts +57 -0
  141. package/src/utils/replaceElement.test.ts +181 -0
  142. package/src/utils/replaceElement.ts +106 -0
  143. package/src/utils/replaceStyledComponent.test.ts +57 -0
  144. package/src/utils/replaceStyledComponent.ts +60 -0
  145. package/src/utils/shouldTransformComponent.test.ts +61 -0
  146. package/src/utils/shouldTransformComponent.ts +40 -0
  147. package/src/utils/testUtils.ts +54 -0
  148. package/src/utils/transformAttributes.test.ts +544 -0
  149. package/src/utils/transformAttributes.ts +248 -0
  150. package/src/utils/transformComponent.test.ts +45 -0
  151. package/src/utils/transformComponent.ts +31 -0
  152. package/src/utils/transformImport.test.ts +175 -0
  153. package/src/utils/transformImport.ts +55 -0
  154. package/src/utils/transformImportAlias.test.ts +40 -0
  155. package/src/utils/transformImportAlias.ts +49 -0
  156. package/src/utils/transformStyledComponents.test.ts +172 -0
  157. package/src/utils/transformStyledComponents.ts +58 -0
@@ -0,0 +1,544 @@
1
+ import {type API, type FileInfo} from 'jscodeshift'
2
+
3
+ import type {AttributeMods} from '../types/AttributeMods'
4
+ import {defineInlineTest} from '../utils/testUtils'
5
+ import {transformAttributes} from './transformAttributes'
6
+
7
+ const MODS: AttributeMods = {
8
+ border: {
9
+ type: 'mapped-only',
10
+ mapping: {
11
+ default: true,
12
+ none: false,
13
+ },
14
+ },
15
+ borderWidth: {type: 'remove'},
16
+ flex: {
17
+ type: 'shorthand-mapped',
18
+ props: [
19
+ {
20
+ name: 'flexBasis',
21
+ mapping: {
22
+ none: 'auto',
23
+ auto: 'auto',
24
+ initial: 'auto',
25
+ },
26
+ },
27
+ {
28
+ name: 'flexGrow',
29
+ mapping: {
30
+ none: 0,
31
+ auto: 1,
32
+ initial: 0,
33
+ 1: 1,
34
+ 2: 2,
35
+ },
36
+ },
37
+ {
38
+ name: 'flexShrink',
39
+ mapping: {
40
+ none: 0,
41
+ auto: 1,
42
+ initial: 1,
43
+ },
44
+ },
45
+ ],
46
+ },
47
+ insetTop: {
48
+ type: 'rename-only',
49
+ name: 'top',
50
+ },
51
+ muted: {
52
+ type: 'rename-mapped',
53
+ name: 'tone',
54
+ mapping: {
55
+ true: 'neutral',
56
+ },
57
+ },
58
+ padding: {
59
+ type: 'composite',
60
+ name: 'density',
61
+ mapping: {
62
+ compact: {
63
+ padding: 3,
64
+ radius: 2,
65
+ },
66
+ },
67
+ },
68
+ scheme: {
69
+ type: 'warn-only',
70
+ warning: 'Custom warning',
71
+ },
72
+ sizing: {
73
+ type: 'style-mapped',
74
+ style: 'boxSizing',
75
+ mapping: {
76
+ border: 'border-box',
77
+ },
78
+ },
79
+ textAlign: {
80
+ type: 'style-only',
81
+ style: 'textAlign',
82
+ },
83
+ width: {
84
+ type: 'mapped-only',
85
+ mapping: {
86
+ fill: '100%',
87
+ 0: '20rem',
88
+ 1: '40rem',
89
+ 2: '60rem',
90
+ },
91
+ },
92
+ }
93
+
94
+ const TODO_WARNING = 'Warning'
95
+
96
+ function transform(fileInfo: FileInfo, api: API): string {
97
+ const j = api.jscodeshift
98
+ const root = j(fileInfo.source)
99
+
100
+ root
101
+ .find(j.JSXOpeningElement, {
102
+ name: {type: 'JSXIdentifier', name: 'div'},
103
+ })
104
+ .forEach((path) => {
105
+ transformAttributes(j, path, MODS, TODO_WARNING)
106
+ })
107
+
108
+ return root.toSource()
109
+ }
110
+
111
+ defineInlineTest(
112
+ transform,
113
+ {},
114
+ `
115
+ <div borderWidth={0.5} />
116
+ `,
117
+ `
118
+ <div />
119
+ `,
120
+ 'removes prop',
121
+ )
122
+
123
+ defineInlineTest(
124
+ transform,
125
+ {},
126
+ `
127
+ <div insetTop={0} />
128
+ `,
129
+ `
130
+ <div top={0} />
131
+ `,
132
+ 'renames prop',
133
+ )
134
+
135
+ defineInlineTest(
136
+ transform,
137
+ {},
138
+ `
139
+ <div width="fill" />
140
+ `,
141
+ `
142
+ <div width="100%" />
143
+ `,
144
+ 'updates mapped prop value',
145
+ )
146
+
147
+ defineInlineTest(
148
+ transform,
149
+ {},
150
+ `
151
+ <div width={[0, 1, 2]} />
152
+ `,
153
+ `
154
+ <div width={["20rem", "40rem", "60rem"]} />
155
+ `,
156
+ 'updates responsive mapped prop value',
157
+ )
158
+
159
+ defineInlineTest(
160
+ transform,
161
+ {},
162
+ `
163
+ <div border="default" />
164
+ `,
165
+ `
166
+ <div border={true} />
167
+ `,
168
+ 'updates boolean mapped prop value',
169
+ )
170
+
171
+ defineInlineTest(
172
+ transform,
173
+ {},
174
+ `
175
+ <div border="none" />
176
+ `,
177
+ `
178
+ <div border={false} />
179
+ `,
180
+ 'updates boolean mapped prop value if false',
181
+ )
182
+
183
+ defineInlineTest(
184
+ transform,
185
+ {},
186
+ `
187
+ <div border />
188
+ `,
189
+ `
190
+ <div border={true} />
191
+ `,
192
+ 'skips updating mapped prop value if it matches existing',
193
+ )
194
+
195
+ defineInlineTest(
196
+ transform,
197
+ {},
198
+ `
199
+ <div muted />
200
+ `,
201
+ `
202
+ <div tone="neutral" />
203
+ `,
204
+ 'renames and updates boolean prop to mapped value',
205
+ )
206
+
207
+ defineInlineTest(
208
+ transform,
209
+ {},
210
+ `
211
+ <div textAlign="center" />
212
+ `,
213
+ `
214
+ <div style={{
215
+ textAlign: "center"
216
+ }} />
217
+ `,
218
+ 'moves prop to style',
219
+ )
220
+
221
+ defineInlineTest(
222
+ transform,
223
+ {},
224
+ `
225
+ <div textAlign={\`center\`} />
226
+ `,
227
+ `
228
+ <div style={{
229
+ textAlign: \`center\`
230
+ }} />
231
+ `,
232
+ 'moves prop to style with template literal value',
233
+ )
234
+
235
+ defineInlineTest(
236
+ transform,
237
+ {},
238
+ `
239
+ <div sizing="border" />
240
+ `,
241
+ `
242
+ <div style={{
243
+ boxSizing: "border-box"
244
+ }} />
245
+ `,
246
+ 'moves prop to style and updates mapped value',
247
+ )
248
+
249
+ defineInlineTest(
250
+ transform,
251
+ {},
252
+ `
253
+ <div textAlign="center" style={{ background: "blue" }} />
254
+ `,
255
+ `
256
+ <div
257
+ style={{
258
+ background: "blue",
259
+ textAlign: "center"
260
+ }} />
261
+ `,
262
+ 'moves prop to style and preserves existing styles',
263
+ )
264
+
265
+ defineInlineTest(
266
+ transform,
267
+ {},
268
+ `
269
+ <div flex="auto" />
270
+ `,
271
+ `
272
+ <div flexBasis="auto" flexGrow={1} flexShrink={1} />
273
+ `,
274
+ 'splits up shorthand props and updates mapped prop value',
275
+ )
276
+
277
+ defineInlineTest(
278
+ transform,
279
+ {},
280
+ `
281
+ <div flex="none" />
282
+ `,
283
+ `
284
+ <div flexBasis="auto" flexGrow={0} flexShrink={0} />
285
+ `,
286
+ 'splits up shorthand props and updates mapped prop value even if zero',
287
+ )
288
+
289
+ defineInlineTest(
290
+ transform,
291
+ {},
292
+ `
293
+ <div flex="1" />
294
+ `,
295
+ `
296
+ <div flexGrow={1} />
297
+ `,
298
+ 'splits up shorthand props and updates mapped prop value skipping if undefined',
299
+ )
300
+
301
+ defineInlineTest(
302
+ transform,
303
+ {},
304
+ `
305
+ <div flex={["auto", "none"]} />
306
+ `,
307
+ `
308
+ <div flexBasis={["auto", "auto"]} flexGrow={[1, 0]} flexShrink={[1, 0]} />
309
+ `,
310
+ 'splits up shorthand props and updates responsive mapped prop value',
311
+ )
312
+
313
+ defineInlineTest(
314
+ transform,
315
+ {},
316
+ `
317
+ <div flex={["2", "none"]} />
318
+ `,
319
+ `
320
+ <div
321
+ flexBasis={[undefined, "auto"]}
322
+ flexGrow={[2, 0]}
323
+ flexShrink={[undefined, 0]} />
324
+ `,
325
+ 'splits up shorthand props and updates responsive mapped prop value including undefined',
326
+ )
327
+
328
+ defineInlineTest(
329
+ transform,
330
+ {},
331
+ `
332
+ <div padding={3} radius={2} />
333
+ `,
334
+ `
335
+ <div density="compact" />
336
+ `,
337
+ 'combines composite props and updates mapped prop value',
338
+ )
339
+
340
+ defineInlineTest(
341
+ transform,
342
+ {},
343
+ `
344
+ <div scheme="light" width="fill" />
345
+ `,
346
+ `
347
+ // UI-CODEMOD TODO: Custom warning
348
+ <div scheme="light" width="100%" />
349
+ `,
350
+ 'warns with custom warning for warn prop',
351
+ )
352
+
353
+ defineInlineTest(
354
+ transform,
355
+ {},
356
+ `
357
+ <div width={3} />
358
+ `,
359
+ `
360
+ // UI-CODEMOD TODO: ${TODO_WARNING}
361
+ <div width={3} />
362
+ `,
363
+ 'warns if mapped prop value does not match mappings',
364
+ )
365
+
366
+ defineInlineTest(
367
+ transform,
368
+ {},
369
+ `
370
+ <div width={[2, 3]} />
371
+ `,
372
+ `
373
+ // UI-CODEMOD TODO: ${TODO_WARNING}
374
+ <div width={[2, 3]} />
375
+ `,
376
+ 'warns if responsive mapped prop value does not match mappings',
377
+ )
378
+
379
+ defineInlineTest(
380
+ transform,
381
+ {},
382
+ `
383
+ <div width={variable} />
384
+ `,
385
+ `
386
+ // UI-CODEMOD TODO: ${TODO_WARNING}
387
+ <div width={variable} />
388
+ `,
389
+ 'warns if mapped prop value is a variable',
390
+ )
391
+
392
+ defineInlineTest(
393
+ transform,
394
+ {},
395
+ `
396
+ <div width={variable ? 'fill' : 0} />
397
+ `,
398
+ `
399
+ // UI-CODEMOD TODO: ${TODO_WARNING}
400
+ <div width={variable ? 'fill' : 0} />
401
+ `,
402
+ 'warns if mapped prop value is a ternary',
403
+ )
404
+
405
+ defineInlineTest(
406
+ transform,
407
+ {},
408
+ `
409
+ <div width={\`fil\${\`l\`}\`} />
410
+ `,
411
+ `
412
+ // UI-CODEMOD TODO: ${TODO_WARNING}
413
+ <div width={\`fil\${\`l\`}\`} />
414
+ `,
415
+ 'warns if mapped prop value is a template literal with variable',
416
+ )
417
+
418
+ defineInlineTest(
419
+ transform,
420
+ {},
421
+ `
422
+ <div textAlign={["center", "left"]} />
423
+ `,
424
+ `
425
+ // UI-CODEMOD TODO: ${TODO_WARNING}
426
+ <div textAlign={["center", "left"]} />
427
+ `,
428
+ 'warns if responsive prop should be moved to style',
429
+ )
430
+
431
+ defineInlineTest(
432
+ transform,
433
+ {},
434
+ `
435
+ <div sizing={["content", "box"]} />
436
+ `,
437
+ `
438
+ // UI-CODEMOD TODO: ${TODO_WARNING}
439
+ <div sizing={["content", "box"]} />
440
+ `,
441
+ 'warns if responsive prop should be moved to style with updated values',
442
+ )
443
+
444
+ defineInlineTest(
445
+ transform,
446
+ {},
447
+ `
448
+ <div textAlign={\`cente\${\`r\`}\`} />
449
+ `,
450
+ `
451
+ // UI-CODEMOD TODO: ${TODO_WARNING}
452
+ <div textAlign={\`cente\${\`r\`}\`} />
453
+ `,
454
+ 'warns if prop with template literal value with variable should be moved to style',
455
+ )
456
+
457
+ defineInlineTest(
458
+ transform,
459
+ {},
460
+ `
461
+ <div padding={3} />
462
+ `,
463
+ `
464
+ // UI-CODEMOD TODO: ${TODO_WARNING}
465
+ <div padding={3} />
466
+ `,
467
+ 'warns if composite prop does not include all mappings',
468
+ )
469
+
470
+ defineInlineTest(
471
+ transform,
472
+ {},
473
+ `
474
+ <div padding={[3, 4]} radius={2} />
475
+ `,
476
+ `
477
+ // UI-CODEMOD TODO: ${TODO_WARNING}
478
+ <div padding={[3, 4]} radius={2} />
479
+ `,
480
+ 'warns if composite prop includes responsive values',
481
+ )
482
+
483
+ defineInlineTest(
484
+ transform,
485
+ {},
486
+ `
487
+ <div padding={3} radius={variable} />
488
+ `,
489
+ `
490
+ // UI-CODEMOD TODO: ${TODO_WARNING}
491
+ <div padding={3} radius={variable} />
492
+ `,
493
+ 'warns if composite prop includes variable',
494
+ )
495
+
496
+ function transformWarnMissing(fileInfo: FileInfo, api: API): string {
497
+ const j = api.jscodeshift
498
+ const root = j(fileInfo.source)
499
+
500
+ root
501
+ .find(j.JSXOpeningElement, {
502
+ name: {type: 'JSXIdentifier', name: 'div'},
503
+ })
504
+ .forEach((path) => {
505
+ transformAttributes(
506
+ j,
507
+ path,
508
+ {
509
+ requiredProp: {
510
+ type: 'warn-missing',
511
+ warning: 'Missing',
512
+ },
513
+ },
514
+ TODO_WARNING,
515
+ )
516
+ })
517
+
518
+ return root.toSource()
519
+ }
520
+
521
+ defineInlineTest(
522
+ transformWarnMissing,
523
+ {},
524
+ `
525
+ <div />
526
+ `,
527
+ `
528
+ // UI-CODEMOD TODO: Missing
529
+ <div />
530
+ `,
531
+ 'warns with custom warning for warn missing prop',
532
+ )
533
+
534
+ defineInlineTest(
535
+ transformWarnMissing,
536
+ {},
537
+ `
538
+ <div requiredProp />
539
+ `,
540
+ `
541
+ <div requiredProp />
542
+ `,
543
+ 'does not warn for warn missing prop if prop is present',
544
+ )