@carbon/upgrade 11.16.0 → 11.18.0-rc.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 +6 -0
- package/cli.js +583 -461
- package/package.json +3 -3
- package/transforms/__testfixtures__/featureflag-deprecate-flags-prop.input.js +134 -0
- package/transforms/__testfixtures__/featureflag-deprecate-flags-prop.output.js +124 -0
- package/transforms/__testfixtures__/icons-react-size-prop-rename.output.js +6 -6
- package/transforms/__testfixtures__/icons-react-size-prop-with-prop.input.js +0 -3
- package/transforms/__testfixtures__/icons-react-size-prop-with-prop.output.js +2 -5
- package/transforms/__testfixtures__/size-prop-update.output.js +20 -20
- package/transforms/__testfixtures__/small-to-size-prop.output.js +2 -3
- package/transforms/__tests__/featureflag-deprecate-flags-prop-test.js +12 -0
- package/transforms/featureflag-deprecate-flags-prop.js +80 -0
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@carbon/upgrade",
|
|
3
3
|
"description": "A tool for upgrading Carbon versions",
|
|
4
|
-
"version": "11.
|
|
4
|
+
"version": "11.18.0-rc.0",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"bin": {
|
|
7
7
|
"carbon-upgrade": "./bin/carbon-upgrade.js"
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
},
|
|
60
60
|
"dependencies": {
|
|
61
61
|
"@ibm/telemetry-js": "^1.5.0",
|
|
62
|
-
"jscodeshift": "^0.
|
|
62
|
+
"jscodeshift": "^17.0.0"
|
|
63
63
|
},
|
|
64
|
-
"gitHead": "
|
|
64
|
+
"gitHead": "124d86cfad8f2efd4d60372f735fea534fc6f374"
|
|
65
65
|
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { FeatureFlags } from '../FeatureFlags';
|
|
2
|
+
import {
|
|
3
|
+
RadioTile,
|
|
4
|
+
TileGroup,
|
|
5
|
+
TreeView,
|
|
6
|
+
VStack,
|
|
7
|
+
TreeNode,
|
|
8
|
+
OverflowMenu,
|
|
9
|
+
MenuItem,
|
|
10
|
+
} from '@carbon/react';
|
|
11
|
+
import { Document, Folder } from '@carbon/icons-react';
|
|
12
|
+
export const EnableV12TileDefaultIconsFlag = () => {
|
|
13
|
+
return (
|
|
14
|
+
<FeatureFlags flags={{ 'enable-v12-tile-default-icons': true }}>
|
|
15
|
+
<TileGroup legend="TestGroup" name="test">
|
|
16
|
+
<RadioTile id="test-1" value="test-1">
|
|
17
|
+
Option 1
|
|
18
|
+
</RadioTile>
|
|
19
|
+
<RadioTile id="test-2" value="test-2">
|
|
20
|
+
Option 2
|
|
21
|
+
</RadioTile>
|
|
22
|
+
</TileGroup>
|
|
23
|
+
</FeatureFlags>
|
|
24
|
+
);
|
|
25
|
+
};
|
|
26
|
+
export const EnableExperimentalFocusWrapWithoutSentinels = () => {
|
|
27
|
+
return (
|
|
28
|
+
// prettier-ignore
|
|
29
|
+
<FeatureFlags flags={{ 'enable-experimental-focus-wrap-without-sentinels': true }}>
|
|
30
|
+
<ActionableNotification
|
|
31
|
+
title="Notification title"
|
|
32
|
+
subtitle="Subtitle text goes here"
|
|
33
|
+
closeOnEscape
|
|
34
|
+
inline={false}
|
|
35
|
+
actionButtonLabel="Action"
|
|
36
|
+
/>
|
|
37
|
+
</FeatureFlags>
|
|
38
|
+
);
|
|
39
|
+
};
|
|
40
|
+
export const EnableTreeviewControllable = (args) => {
|
|
41
|
+
return (
|
|
42
|
+
<div>
|
|
43
|
+
<FeatureFlags flags={{ 'enable-treeview-controllable': true }}>
|
|
44
|
+
<TreeView
|
|
45
|
+
label="Tree View"
|
|
46
|
+
active={true}
|
|
47
|
+
onActivate={() => {
|
|
48
|
+
console.log('test');
|
|
49
|
+
}}
|
|
50
|
+
selected={[]}
|
|
51
|
+
onSelect={() => {
|
|
52
|
+
console.log('test');
|
|
53
|
+
}}>
|
|
54
|
+
{renderTree(nodes)}
|
|
55
|
+
</TreeView>
|
|
56
|
+
</FeatureFlags>
|
|
57
|
+
</div>
|
|
58
|
+
);
|
|
59
|
+
};
|
|
60
|
+
export const EnableV12Overflowmenu = () => {
|
|
61
|
+
return (
|
|
62
|
+
<FeatureFlags flags={{ 'enable-v12-overflowmenu': true }}>
|
|
63
|
+
<OverflowMenu autoAlign={true}>
|
|
64
|
+
<MenuItem label="Stop app" />
|
|
65
|
+
<MenuItem label="Restart app" />
|
|
66
|
+
<MenuItem label="Rename app" />
|
|
67
|
+
<MenuItem label="Edit routes and access" />
|
|
68
|
+
|
|
69
|
+
<MenuItem label="Delete app" kind="danger" />
|
|
70
|
+
</OverflowMenu>
|
|
71
|
+
</FeatureFlags>
|
|
72
|
+
);
|
|
73
|
+
};
|
|
74
|
+
export const EnableV12TileRadioIcons = () => {
|
|
75
|
+
return (
|
|
76
|
+
<FeatureFlags flags={{ 'enable-v12-tile-radio-icons': true }}>
|
|
77
|
+
<TileGroup legend="TestGroup" name="test">
|
|
78
|
+
<RadioTile id="test-1" value="test-1">
|
|
79
|
+
Option 1
|
|
80
|
+
</RadioTile>
|
|
81
|
+
<RadioTile id="test-2" value="test-2">
|
|
82
|
+
Option 2
|
|
83
|
+
</RadioTile>
|
|
84
|
+
</TileGroup>
|
|
85
|
+
</FeatureFlags>
|
|
86
|
+
);
|
|
87
|
+
};
|
|
88
|
+
export const TestRegularJsx = () => {
|
|
89
|
+
return <div className={wrapperClasses}></div>;
|
|
90
|
+
};
|
|
91
|
+
export const CombinedFlags = () => {
|
|
92
|
+
return (
|
|
93
|
+
// prettier-ignore
|
|
94
|
+
<FeatureFlags
|
|
95
|
+
flags={{
|
|
96
|
+
'enable-v12-tile-default-icons': true,
|
|
97
|
+
'enable-v12-tile-radio-icons': true,
|
|
98
|
+
'enable-v12-overflowmenu': true,
|
|
99
|
+
'enable-treeview-controllable': true,
|
|
100
|
+
'enable-experimental-focus-wrap-without-sentinels': true,
|
|
101
|
+
'enable-v11-release': true,
|
|
102
|
+
'enable-css-custom-properties': true,
|
|
103
|
+
'enable-css-grid': true,
|
|
104
|
+
}}>
|
|
105
|
+
<TileGroup legend="TestGroup" name="test">
|
|
106
|
+
<RadioTile id="test-1" value="test-1">
|
|
107
|
+
Option 1
|
|
108
|
+
</RadioTile>
|
|
109
|
+
<RadioTile id="test-2" value="test-2">
|
|
110
|
+
Option 2
|
|
111
|
+
</RadioTile>
|
|
112
|
+
</TileGroup>
|
|
113
|
+
</FeatureFlags>
|
|
114
|
+
);
|
|
115
|
+
};
|
|
116
|
+
export const OldFlags = () => {
|
|
117
|
+
return (
|
|
118
|
+
<FeatureFlags
|
|
119
|
+
flags={{
|
|
120
|
+
'enable-v11-release': true,
|
|
121
|
+
'enable-css-custom-properties': true,
|
|
122
|
+
'enable-css-grid': true,
|
|
123
|
+
}}>
|
|
124
|
+
<TileGroup legend="TestGroup" name="test">
|
|
125
|
+
<RadioTile id="test-1" value="test-1">
|
|
126
|
+
Option 1
|
|
127
|
+
</RadioTile>
|
|
128
|
+
<RadioTile id="test-2" value="test-2">
|
|
129
|
+
Option 2
|
|
130
|
+
</RadioTile>
|
|
131
|
+
</TileGroup>
|
|
132
|
+
</FeatureFlags>
|
|
133
|
+
);
|
|
134
|
+
};
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { FeatureFlags } from '../FeatureFlags';
|
|
2
|
+
import {
|
|
3
|
+
RadioTile,
|
|
4
|
+
TileGroup,
|
|
5
|
+
TreeView,
|
|
6
|
+
VStack,
|
|
7
|
+
TreeNode,
|
|
8
|
+
OverflowMenu,
|
|
9
|
+
MenuItem,
|
|
10
|
+
} from '@carbon/react';
|
|
11
|
+
import { Document, Folder } from '@carbon/icons-react';
|
|
12
|
+
export const EnableV12TileDefaultIconsFlag = () => {
|
|
13
|
+
return (
|
|
14
|
+
(<FeatureFlags enableV12TileDefaultIcons>
|
|
15
|
+
<TileGroup legend="TestGroup" name="test">
|
|
16
|
+
<RadioTile id="test-1" value="test-1">
|
|
17
|
+
Option 1
|
|
18
|
+
</RadioTile>
|
|
19
|
+
<RadioTile id="test-2" value="test-2">
|
|
20
|
+
Option 2
|
|
21
|
+
</RadioTile>
|
|
22
|
+
</TileGroup>
|
|
23
|
+
</FeatureFlags>)
|
|
24
|
+
);
|
|
25
|
+
};
|
|
26
|
+
export const EnableExperimentalFocusWrapWithoutSentinels = () => {
|
|
27
|
+
return (
|
|
28
|
+
// prettier-ignore
|
|
29
|
+
(<FeatureFlags enableExperimentalFocusWrapWithoutSentinels>
|
|
30
|
+
<ActionableNotification
|
|
31
|
+
title="Notification title"
|
|
32
|
+
subtitle="Subtitle text goes here"
|
|
33
|
+
closeOnEscape
|
|
34
|
+
inline={false}
|
|
35
|
+
actionButtonLabel="Action"
|
|
36
|
+
/>
|
|
37
|
+
</FeatureFlags>)
|
|
38
|
+
);
|
|
39
|
+
};
|
|
40
|
+
export const EnableTreeviewControllable = (args) => {
|
|
41
|
+
return (
|
|
42
|
+
(<div>
|
|
43
|
+
<FeatureFlags enableTreeviewControllable>
|
|
44
|
+
<TreeView
|
|
45
|
+
label="Tree View"
|
|
46
|
+
active={true}
|
|
47
|
+
onActivate={() => {
|
|
48
|
+
console.log('test');
|
|
49
|
+
}}
|
|
50
|
+
selected={[]}
|
|
51
|
+
onSelect={() => {
|
|
52
|
+
console.log('test');
|
|
53
|
+
}}>
|
|
54
|
+
{renderTree(nodes)}
|
|
55
|
+
</TreeView>
|
|
56
|
+
</FeatureFlags>
|
|
57
|
+
</div>)
|
|
58
|
+
);
|
|
59
|
+
};
|
|
60
|
+
export const EnableV12Overflowmenu = () => {
|
|
61
|
+
return (
|
|
62
|
+
(<FeatureFlags enableV12Overflowmenu>
|
|
63
|
+
<OverflowMenu autoAlign={true}>
|
|
64
|
+
<MenuItem label="Stop app" />
|
|
65
|
+
<MenuItem label="Restart app" />
|
|
66
|
+
<MenuItem label="Rename app" />
|
|
67
|
+
<MenuItem label="Edit routes and access" />
|
|
68
|
+
|
|
69
|
+
<MenuItem label="Delete app" kind="danger" />
|
|
70
|
+
</OverflowMenu>
|
|
71
|
+
</FeatureFlags>)
|
|
72
|
+
);
|
|
73
|
+
};
|
|
74
|
+
export const EnableV12TileRadioIcons = () => {
|
|
75
|
+
return (
|
|
76
|
+
(<FeatureFlags enableV12TileRadioIcons>
|
|
77
|
+
<TileGroup legend="TestGroup" name="test">
|
|
78
|
+
<RadioTile id="test-1" value="test-1">
|
|
79
|
+
Option 1
|
|
80
|
+
</RadioTile>
|
|
81
|
+
<RadioTile id="test-2" value="test-2">
|
|
82
|
+
Option 2
|
|
83
|
+
</RadioTile>
|
|
84
|
+
</TileGroup>
|
|
85
|
+
</FeatureFlags>)
|
|
86
|
+
);
|
|
87
|
+
};
|
|
88
|
+
export const TestRegularJsx = () => {
|
|
89
|
+
return <div className={wrapperClasses}></div>;
|
|
90
|
+
};
|
|
91
|
+
export const CombinedFlags = () => {
|
|
92
|
+
return (
|
|
93
|
+
// prettier-ignore
|
|
94
|
+
(<FeatureFlags
|
|
95
|
+
enableV12TileDefaultIcons
|
|
96
|
+
enableV12TileRadioIcons
|
|
97
|
+
enableV12Overflowmenu
|
|
98
|
+
enableTreeviewControllable
|
|
99
|
+
enableExperimentalFocusWrapWithoutSentinels>
|
|
100
|
+
<TileGroup legend="TestGroup" name="test">
|
|
101
|
+
<RadioTile id="test-1" value="test-1">
|
|
102
|
+
Option 1
|
|
103
|
+
</RadioTile>
|
|
104
|
+
<RadioTile id="test-2" value="test-2">
|
|
105
|
+
Option 2
|
|
106
|
+
</RadioTile>
|
|
107
|
+
</TileGroup>
|
|
108
|
+
</FeatureFlags>)
|
|
109
|
+
);
|
|
110
|
+
};
|
|
111
|
+
export const OldFlags = () => {
|
|
112
|
+
return (
|
|
113
|
+
(<FeatureFlags>
|
|
114
|
+
<TileGroup legend="TestGroup" name="test">
|
|
115
|
+
<RadioTile id="test-1" value="test-1">
|
|
116
|
+
Option 1
|
|
117
|
+
</RadioTile>
|
|
118
|
+
<RadioTile id="test-2" value="test-2">
|
|
119
|
+
Option 2
|
|
120
|
+
</RadioTile>
|
|
121
|
+
</TileGroup>
|
|
122
|
+
</FeatureFlags>)
|
|
123
|
+
);
|
|
124
|
+
};
|
|
@@ -10,23 +10,23 @@ import { Search } from 'test';
|
|
|
10
10
|
|
|
11
11
|
function RendersIconDirectly() {
|
|
12
12
|
return (
|
|
13
|
-
<div>
|
|
13
|
+
(<div>
|
|
14
14
|
<Add size={32} />
|
|
15
15
|
<Bee size={24} />
|
|
16
16
|
<Caret size={20} />
|
|
17
17
|
<DownArrow />
|
|
18
|
-
</div>
|
|
18
|
+
</div>)
|
|
19
19
|
);
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
function RendersIconWithProps(props) {
|
|
23
23
|
return (
|
|
24
|
-
<div>
|
|
24
|
+
(<div>
|
|
25
25
|
<Add size={32} aria-label="test" {...props} />
|
|
26
26
|
<Bee size={24} aria-label="test" {...props} />
|
|
27
27
|
<Caret size={20} aria-label="test" {...props} />
|
|
28
28
|
<DownArrow aria-label="test" {...props} />
|
|
29
|
-
</div>
|
|
29
|
+
</div>)
|
|
30
30
|
);
|
|
31
31
|
}
|
|
32
32
|
|
|
@@ -36,9 +36,9 @@ function AliasedIcon() {
|
|
|
36
36
|
|
|
37
37
|
function ExistingScope() {
|
|
38
38
|
return (
|
|
39
|
-
<div>
|
|
39
|
+
(<div>
|
|
40
40
|
<Search />
|
|
41
41
|
<SearchIcon size={24} />
|
|
42
|
-
</div>
|
|
42
|
+
</div>)
|
|
43
43
|
);
|
|
44
44
|
}
|
|
@@ -2,14 +2,11 @@ import { Add16, Bee24, Chevron24 as chevron } from '@carbon/icons-react';
|
|
|
2
2
|
|
|
3
3
|
const mapped = {
|
|
4
4
|
default: Add16,
|
|
5
|
-
// prettier-ignore
|
|
6
5
|
size: Bee24,
|
|
7
|
-
// prettier-ignore
|
|
8
6
|
lowercase: chevron,
|
|
9
7
|
};
|
|
10
8
|
|
|
11
9
|
function RenderIconProp() {
|
|
12
|
-
// prettier-ignore
|
|
13
10
|
return (
|
|
14
11
|
<div>
|
|
15
12
|
<DefaultSize renderIcon={Add16} />
|
|
@@ -2,9 +2,7 @@ import { Add, Bee, Chevron as chevron } from '@carbon/icons-react';
|
|
|
2
2
|
|
|
3
3
|
const mapped = {
|
|
4
4
|
default: Add,
|
|
5
|
-
// prettier-ignore
|
|
6
5
|
size: props => <Bee size={24} {...props} />,
|
|
7
|
-
// prettier-ignore
|
|
8
6
|
lowercase: props => React.createElement(chevron, {
|
|
9
7
|
size: 24,
|
|
10
8
|
...props
|
|
@@ -12,11 +10,10 @@ const mapped = {
|
|
|
12
10
|
};
|
|
13
11
|
|
|
14
12
|
function RenderIconProp() {
|
|
15
|
-
// prettier-ignore
|
|
16
13
|
return (
|
|
17
|
-
<div>
|
|
14
|
+
(<div>
|
|
18
15
|
<DefaultSize renderIcon={Add} />
|
|
19
16
|
<Size renderIcon={props => <Bee size={24} {...props} />} />
|
|
20
|
-
</div>
|
|
17
|
+
</div>)
|
|
21
18
|
);
|
|
22
19
|
}
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
function Accordion() {
|
|
2
2
|
return (
|
|
3
|
-
<div>
|
|
3
|
+
(<div>
|
|
4
4
|
<Accordion className="test" size="lg" />
|
|
5
5
|
<Accordion className="test" size="lg">
|
|
6
6
|
<AccordionItem>Test</AccordionItem>
|
|
7
7
|
</Accordion>
|
|
8
|
-
</div>
|
|
8
|
+
</div>)
|
|
9
9
|
);
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
function Button() {
|
|
13
13
|
return (
|
|
14
|
-
<div>
|
|
14
|
+
(<div>
|
|
15
15
|
<Button className="test" size="sm" />
|
|
16
16
|
<Button className="test" size="md"></Button>
|
|
17
17
|
<Button className="test" size="lg"></Button>
|
|
18
18
|
<Button className="test" size="xl"></Button>
|
|
19
19
|
<Button className="test" size="2xl"></Button>
|
|
20
|
-
</div>
|
|
20
|
+
</div>)
|
|
21
21
|
);
|
|
22
22
|
}
|
|
23
23
|
|
|
@@ -27,11 +27,11 @@ function ComboBox() {
|
|
|
27
27
|
|
|
28
28
|
function ContentSwitcher() {
|
|
29
29
|
return (
|
|
30
|
-
<ContentSwitcher className="test" size="lg">
|
|
30
|
+
(<ContentSwitcher className="test" size="lg">
|
|
31
31
|
<Switch name="one" text="First section" />
|
|
32
32
|
<Switch name="two" text="Second section" />
|
|
33
33
|
<Switch name="three" text="Third section" />
|
|
34
|
-
</ContentSwitcher>
|
|
34
|
+
</ContentSwitcher>)
|
|
35
35
|
);
|
|
36
36
|
}
|
|
37
37
|
|
|
@@ -41,31 +41,31 @@ function Dropdown() {
|
|
|
41
41
|
|
|
42
42
|
function DataTable() {
|
|
43
43
|
return (
|
|
44
|
-
<div>
|
|
44
|
+
(<div>
|
|
45
45
|
<Table className="test" size="xs"></Table>
|
|
46
46
|
<Table className="test" size="sm"></Table>
|
|
47
47
|
<Table className="test" size="xl"></Table>
|
|
48
48
|
<DataTable className="test" size="xs"></DataTable>
|
|
49
49
|
<DataTable className="test" size="sm"></DataTable>
|
|
50
50
|
<DataTable className="test" size="xl"></DataTable>
|
|
51
|
-
</div>
|
|
51
|
+
</div>)
|
|
52
52
|
);
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
function DatePicker() {
|
|
56
56
|
return (
|
|
57
|
-
<DatePicker datePickerType="single">
|
|
57
|
+
(<DatePicker datePickerType="single">
|
|
58
58
|
<DatePickerInput
|
|
59
59
|
size="lg"
|
|
60
60
|
id="datepicker"
|
|
61
61
|
labelText="Datepicker Test"></DatePickerInput>
|
|
62
|
-
</DatePicker>
|
|
62
|
+
</DatePicker>)
|
|
63
63
|
);
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
function FileUploader() {
|
|
67
67
|
return (
|
|
68
|
-
<div>
|
|
68
|
+
(<div>
|
|
69
69
|
<FileUploader size="sm"></FileUploader>
|
|
70
70
|
<FileUploader size="md"></FileUploader>
|
|
71
71
|
<FileUploader size="lg"></FileUploader>
|
|
@@ -78,7 +78,7 @@ function FileUploader() {
|
|
|
78
78
|
<FileUploaderDropContainer size="sm"></FileUploaderDropContainer>
|
|
79
79
|
<FileUploaderDropContainer size="md"></FileUploaderDropContainer>
|
|
80
80
|
<FileUploaderDropContainer size="lg"></FileUploaderDropContainer>
|
|
81
|
-
</div>
|
|
81
|
+
</div>)
|
|
82
82
|
);
|
|
83
83
|
}
|
|
84
84
|
|
|
@@ -88,7 +88,7 @@ function Link() {
|
|
|
88
88
|
|
|
89
89
|
function MultiSelect() {
|
|
90
90
|
return (
|
|
91
|
-
<div>
|
|
91
|
+
(<div>
|
|
92
92
|
<MultiSelect
|
|
93
93
|
size="lg"
|
|
94
94
|
items={items}
|
|
@@ -99,7 +99,7 @@ function MultiSelect() {
|
|
|
99
99
|
items={items}
|
|
100
100
|
itemToString={(item) => (item ? item.text : '')}
|
|
101
101
|
/>
|
|
102
|
-
</div>
|
|
102
|
+
</div>)
|
|
103
103
|
);
|
|
104
104
|
}
|
|
105
105
|
|
|
@@ -113,28 +113,28 @@ function OverflowMenu() {
|
|
|
113
113
|
|
|
114
114
|
function Search() {
|
|
115
115
|
return (
|
|
116
|
-
<div>
|
|
116
|
+
(<div>
|
|
117
117
|
<Search className="test" size="md" />
|
|
118
118
|
<Search className="test" size="lg" />
|
|
119
|
-
</div>
|
|
119
|
+
</div>)
|
|
120
120
|
);
|
|
121
121
|
}
|
|
122
122
|
|
|
123
123
|
function Select() {
|
|
124
124
|
return (
|
|
125
|
-
<div>
|
|
125
|
+
(<div>
|
|
126
126
|
<Select className="test" size="md" />
|
|
127
127
|
<Select className="test" size="lg" />
|
|
128
|
-
</div>
|
|
128
|
+
</div>)
|
|
129
129
|
);
|
|
130
130
|
}
|
|
131
131
|
|
|
132
132
|
function TextInput() {
|
|
133
133
|
return (
|
|
134
|
-
<div>
|
|
134
|
+
(<div>
|
|
135
135
|
<TextInput size="md" id="textinput1" labelText="lg -> md"></TextInput>
|
|
136
136
|
<TextInput size="lg" id="textinput1" labelText="xl -> lg"></TextInput>
|
|
137
|
-
</div>
|
|
137
|
+
</div>)
|
|
138
138
|
);
|
|
139
139
|
}
|
|
140
140
|
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright IBM Corp. 2016, 2023
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Apache-2.0 license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
'use strict';
|
|
9
|
+
|
|
10
|
+
const { defineTest } = require('jscodeshift/dist/testUtils');
|
|
11
|
+
|
|
12
|
+
defineTest(__dirname, 'featureflag-deprecate-flags-prop');
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright IBM Corp. 2024
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the Apache-2.0 license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
* Migrate the `flags` object prop to individual boolean props
|
|
8
|
+
*
|
|
9
|
+
* Transforms:
|
|
10
|
+
*
|
|
11
|
+
* <FeatureFlags flags={{ 'enable-v12-tile-default-icons': true }}>
|
|
12
|
+
*
|
|
13
|
+
* Into:
|
|
14
|
+
*
|
|
15
|
+
* <FeatureFlags enableV12TileDefaultIcons>
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
'use strict';
|
|
19
|
+
|
|
20
|
+
const defaultOptions = {
|
|
21
|
+
quote: 'single',
|
|
22
|
+
trailingComma: true,
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
//This list can be updated as needed, if any flags are made true by default
|
|
26
|
+
const flagsToRemove = [
|
|
27
|
+
'enable-v11-release',
|
|
28
|
+
'enable-css-custom-properties',
|
|
29
|
+
'enable-css-grid',
|
|
30
|
+
];
|
|
31
|
+
|
|
32
|
+
function transform(fileInfo, api, options) {
|
|
33
|
+
const { jscodeshift: j } = api;
|
|
34
|
+
const root = j(fileInfo.source);
|
|
35
|
+
const printOptions = options.printOptions || defaultOptions;
|
|
36
|
+
if (
|
|
37
|
+
!root.find(j.JSXOpeningElement, { name: { name: 'FeatureFlags' } }).size()
|
|
38
|
+
) {
|
|
39
|
+
return null; // if no FeatureFlags found, don't modify & return the file
|
|
40
|
+
}
|
|
41
|
+
root
|
|
42
|
+
.find(j.JSXOpeningElement, { name: { name: 'FeatureFlags' } })
|
|
43
|
+
.forEach((path) => {
|
|
44
|
+
const flagsAttribute = path.node.attributes.find(
|
|
45
|
+
(attr) => attr.type === 'JSXAttribute' && attr.name.name === 'flags'
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
if (flagsAttribute?.value?.expression?.type === 'ObjectExpression') {
|
|
49
|
+
const properties = flagsAttribute.value.expression.properties;
|
|
50
|
+
|
|
51
|
+
// Filter out flags to remove
|
|
52
|
+
const filteredProperties = properties.filter((prop) => {
|
|
53
|
+
const keyName =
|
|
54
|
+
prop.key.type === 'Identifier' ? prop.key.name : prop.key.value;
|
|
55
|
+
return !flagsToRemove.includes(keyName);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// Convert remaining flags to boolean props
|
|
59
|
+
const newAttributes = filteredProperties
|
|
60
|
+
.filter((flag) => flag.value.value === true)
|
|
61
|
+
.map((flag) => {
|
|
62
|
+
const flagName =
|
|
63
|
+
flag.key.type === 'Identifier' ? flag.key.name : flag.key.value;
|
|
64
|
+
const propName = flagName.replace(/-(\w)/g, (_, c) =>
|
|
65
|
+
c.toUpperCase()
|
|
66
|
+
);
|
|
67
|
+
return j.jsxAttribute(j.jsxIdentifier(propName));
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
path.node.attributes = [
|
|
71
|
+
...path.node.attributes.filter((attr) => attr.name.name !== 'flags'),
|
|
72
|
+
...newAttributes,
|
|
73
|
+
];
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
return root.toSource(printOptions);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
module.exports = transform;
|