@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/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.16.0",
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.13.1"
62
+ "jscodeshift": "^17.0.0"
63
63
  },
64
- "gitHead": "2e82ab9625d65b607a7510b70d2cb4bacf209378"
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
 
@@ -4,8 +4,7 @@ function Test1() {
4
4
 
5
5
  function Test2() {
6
6
  return (
7
- <Button className="test" size="sm">
8
- Test
9
- </Button>
7
+ (<Button className="test" size="sm">Test
8
+ </Button>)
10
9
  );
11
10
  }
@@ -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;