@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,172 @@
1
+ import {type API, type FileInfo} from 'jscodeshift'
2
+
3
+ import {getAttribute} from './getAttribute'
4
+ import {getComponentLocalNames} from './getComponentLocalNames'
5
+ import {getStyledComponentAliases} from './getStyledComponentAliases'
6
+ import {defineInlineTest} from './testUtils'
7
+ import {transformAttributes} from './transformAttributes'
8
+ import {transformStyledComponents} from './transformStyledComponents'
9
+
10
+ const DEFAULT_WARNING = 'Please double check styled-component migration(s) below'
11
+ const CUSTOM_WARNING =
12
+ 'Please double check styled(Card) migration — update to styled(Box) manually if needed'
13
+
14
+ function transform(
15
+ fileInfo: FileInfo,
16
+ api: API,
17
+ options?: {
18
+ warning?: string
19
+ hasCallback?: boolean
20
+ },
21
+ ): string {
22
+ const j = api.jscodeshift
23
+ const root = j(fileInfo.source)
24
+ const localNames = getComponentLocalNames(j, root, 'Card')
25
+ const styledAliases = getStyledComponentAliases(j, root, localNames)
26
+
27
+ transformStyledComponents(j, root, styledAliases, (attrs) => !!getAttribute(attrs, 'margin'), {
28
+ warning: options?.warning,
29
+ callback: options?.hasCallback
30
+ ? (path) =>
31
+ transformAttributes(
32
+ j,
33
+ path,
34
+ {
35
+ insetTop: {
36
+ type: 'rename-only',
37
+ name: 'top',
38
+ },
39
+ },
40
+ 'Warning',
41
+ )
42
+ : undefined,
43
+ })
44
+
45
+ return root.toSource()
46
+ }
47
+
48
+ defineInlineTest(
49
+ transform,
50
+ {},
51
+ `
52
+ import {Card} from '@sanity/ui'
53
+
54
+ function Example() {
55
+ const RootCard = styled(Card)(({theme}) => ({}))
56
+
57
+ return <RootCard margin={1} />
58
+ }
59
+ `,
60
+ `
61
+ import {Card} from '@sanity/ui'
62
+
63
+ function Example() {
64
+ const RootCard = styled(Card)(({theme}) => ({}))
65
+
66
+ return <RootCard margin={1} />
67
+ }
68
+ `,
69
+ 'preserves component if filter matches',
70
+ )
71
+
72
+ defineInlineTest(
73
+ transform,
74
+ {
75
+ hasCallback: true,
76
+ },
77
+ `
78
+ import {Card} from '@sanity/ui'
79
+
80
+ function Example() {
81
+ const RootCard = styled(Card)(({theme}) => {})
82
+
83
+ return <RootCard margin={1} insetTop={0} />
84
+ }
85
+ `,
86
+ `
87
+ import {Card} from '@sanity/ui'
88
+
89
+ function Example() {
90
+ const RootCard = styled(Card)(({theme}) => {})
91
+
92
+ return <RootCard margin={1} top={0} />;
93
+ }
94
+ `,
95
+ 'preserves component and runs callback if filter matches',
96
+ )
97
+
98
+ defineInlineTest(
99
+ transform,
100
+ {},
101
+ `
102
+ import {Card} from '@sanity/ui'
103
+
104
+ function Example() {
105
+ const RootCard = styled(Card)(({theme}) => ({}))
106
+
107
+ return <RootCard padding={1} />
108
+ }
109
+ `,
110
+ `
111
+ import {Card} from '@sanity/ui'
112
+
113
+ function Example() {
114
+ // UI-CODEMOD TODO: ${DEFAULT_WARNING}
115
+ const RootCard = styled(Card)(({theme}) => ({}));
116
+
117
+ return <RootCard padding={1} />
118
+ }
119
+ `,
120
+ 'adds todo warning on styled definition when filter does not match',
121
+ )
122
+
123
+ defineInlineTest(
124
+ transform,
125
+ {warning: CUSTOM_WARNING},
126
+ `
127
+ import {Card} from '@sanity/ui'
128
+
129
+ function Example() {
130
+ const RootCard = styled(Card)(({theme}) => ({}))
131
+
132
+ return <RootCard padding={1} />
133
+ }
134
+ `,
135
+ `
136
+ import {Card} from '@sanity/ui'
137
+
138
+ function Example() {
139
+ // UI-CODEMOD TODO: ${CUSTOM_WARNING}
140
+ const RootCard = styled(Card)(({theme}) => ({}));
141
+
142
+ return <RootCard padding={1} />
143
+ }
144
+ `,
145
+ 'adds custom todo warning on styled definition when filter does not match',
146
+ )
147
+
148
+ defineInlineTest(
149
+ transform,
150
+ {},
151
+ `
152
+ import {Card} from '@sanity/ui'
153
+
154
+ function Example() {
155
+ // UI-CODEMOD TODO: ${DEFAULT_WARNING}
156
+ const RootCard = styled(Card)(({theme}) => ({}))
157
+
158
+ return <RootCard padding={1} />
159
+ }
160
+ `,
161
+ `
162
+ import {Card} from '@sanity/ui'
163
+
164
+ function Example() {
165
+ // UI-CODEMOD TODO: ${DEFAULT_WARNING}
166
+ const RootCard = styled(Card)(({theme}) => ({}))
167
+
168
+ return <RootCard padding={1} />
169
+ }
170
+ `,
171
+ 'does not duplicate todo warning',
172
+ )
@@ -0,0 +1,58 @@
1
+ import type {API, ASTPath, JSXAttribute, JSXOpeningElement, JSXSpreadAttribute} from 'jscodeshift'
2
+
3
+ import {insertTodoWarning} from './insertTodoWarning'
4
+
5
+ const DEFAULT_WARNING = 'Please double check styled-component migration(s) below'
6
+
7
+ /**
8
+ * Runs callback on JSX styled-component if `filter` passes. Otherwise, adds
9
+ * a TODO on the styled definition if manual review is needed.
10
+ * Returns whether the AST was updated.
11
+ */
12
+ export function transformStyledComponents(
13
+ j: API['jscodeshift'],
14
+ root: ReturnType<API['jscodeshift']>,
15
+ aliases: Iterable<string>,
16
+ filter: (attrs: (JSXAttribute | JSXSpreadAttribute)[]) => boolean,
17
+ options: {
18
+ callback?: (path: ASTPath<JSXOpeningElement>) => boolean | void
19
+ warning?: string
20
+ } = {},
21
+ ): boolean {
22
+ const names = new Set(aliases)
23
+ const {callback, warning = DEFAULT_WARNING} = options
24
+ const aliasesToWarn = new Set<string>()
25
+ let hasChanges = false
26
+
27
+ root.find(j.JSXOpeningElement).forEach((path) => {
28
+ const name = path.node.name
29
+
30
+ if (name.type !== 'JSXIdentifier' || !names.has(name.name)) {
31
+ return
32
+ }
33
+
34
+ const attrs = path.node.attributes ?? []
35
+
36
+ if (!filter(attrs)) {
37
+ aliasesToWarn.add(name.name)
38
+ }
39
+
40
+ if (filter(attrs)) {
41
+ if (callback?.(path)) {
42
+ hasChanges = true
43
+ }
44
+ }
45
+ })
46
+
47
+ root.find(j.VariableDeclarator).forEach((path) => {
48
+ const {id} = path.node
49
+
50
+ if (id.type === 'Identifier' && aliasesToWarn.has(id.name)) {
51
+ if (insertTodoWarning(j, path, warning)) {
52
+ hasChanges = true
53
+ }
54
+ }
55
+ })
56
+
57
+ return hasChanges
58
+ }