@ukic/codemod 1.0.0-alpha.8 → 1.1.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/data/data.js ADDED
@@ -0,0 +1,494 @@
1
+ import {
2
+ appearanceDark,
3
+ appearanceDarkIncludesMonochrome,
4
+ appearanceLight,
5
+ appearanceDefault,
6
+ appearanceLightDeprecated,
7
+ appearanceLightNoMonochrome,
8
+ appearanceOutline,
9
+ appearanceOutlined,
10
+ sizeDefault,
11
+ sizeSmall,
12
+ sizeSmallAbsolute,
13
+ appearanceFilled,
14
+ appearanceDarkNoMonochrome,
15
+ } from "./commonChanges.js";
16
+
17
+ export const changes = {
18
+ //web-components
19
+ "ic-accordion-group": [
20
+ {
21
+ v2: "group-title",
22
+ v3: "label",
23
+ type: "prop",
24
+ },
25
+ ],
26
+ "ic-accordion": [sizeDefault],
27
+ "ic-badge": [
28
+ {
29
+ v2: "text-label",
30
+ v3: "label",
31
+ type: "prop",
32
+ },
33
+ sizeDefault,
34
+ ],
35
+ "ic-card": [
36
+ {
37
+ v2: "ic-card",
38
+ v3: "ic-card-vertical",
39
+ type: "web-component",
40
+ },
41
+ ],
42
+ "ic-data-entity": [
43
+ sizeDefault,
44
+ sizeSmall,
45
+ sizeSmallAbsolute,
46
+ {
47
+ v2: "ic-data-entity",
48
+ v3: "ic-data-list",
49
+ type: "web-component",
50
+ },
51
+ ],
52
+ "ic-data-row": [sizeDefault, sizeSmall, sizeSmallAbsolute],
53
+ "ic-empty-state": [
54
+ {
55
+ v2: "body-max-lines",
56
+ v3: "max-lines",
57
+ type: "prop",
58
+ },
59
+ ],
60
+ "ic-footer-link-group": [
61
+ {
62
+ v2: "group-title",
63
+ v3: "label",
64
+ type: "prop",
65
+ },
66
+ ],
67
+ "ic-menu-item": [
68
+ {
69
+ v2: "keyboard-shortcut",
70
+ v3: "keyboard-shortcut-label",
71
+ type: "prop",
72
+ },
73
+ {
74
+ v2: "toggle-checked",
75
+ v3: "checked",
76
+ type: "prop",
77
+ },
78
+ ],
79
+ "ic-pagination": [
80
+ {
81
+ v2: "adjacent-count",
82
+ v3: "adjacent-page-count",
83
+ type: "prop",
84
+ },
85
+ {
86
+ v2: "boundary-count",
87
+ v3: "boundary-page-count",
88
+ type: "prop",
89
+ },
90
+ appearanceDark,
91
+ appearanceLight,
92
+ appearanceDefault,
93
+ ],
94
+ "ic-search-bar": [
95
+ sizeDefault,
96
+ sizeSmall,
97
+ sizeSmallAbsolute,
98
+ {
99
+ v2: "disable-filter",
100
+ v3: "disable-auto-filtering",
101
+ type: "prop",
102
+ },
103
+ {
104
+ v2: "hint-text",
105
+ v3: "assistive-hint-text",
106
+ type: "prop",
107
+ },
108
+ ],
109
+ "ic-select": [
110
+ sizeSmall,
111
+ sizeDefault,
112
+ sizeSmallAbsolute,
113
+ {
114
+ v2: "disable-filter",
115
+ v3: "disable-auto-filtering",
116
+ type: "prop",
117
+ },
118
+ ],
119
+ "ic-select-with-multi": [
120
+ sizeDefault,
121
+ sizeSmall,
122
+ sizeSmallAbsolute,
123
+ {
124
+ v2: "ic-select-with-multi",
125
+ v3: "ic-select",
126
+ type: "web-component",
127
+ },
128
+ ],
129
+ "ic-side-navigation": [
130
+ {
131
+ v2: "side-nav-expanded",
132
+ v3: "ic-side-nav-expanded",
133
+ type: "prop",
134
+ },
135
+ ],
136
+ "ic-status-tag": [
137
+ sizeDefault,
138
+ sizeSmall,
139
+ sizeSmallAbsolute,
140
+ appearanceOutlined,
141
+ appearanceFilled,
142
+ ],
143
+ "ic-stepper": [appearanceLightNoMonochrome, appearanceDefault],
144
+ "ic-step": [
145
+ {
146
+ v2: "step-type",
147
+ v3: "type",
148
+ type: "prop",
149
+ },
150
+ {
151
+ v2: "step-title",
152
+ v3: "heading",
153
+ type: "prop",
154
+ },
155
+ {
156
+ v2: "step-subtitle",
157
+ v3: "subheading",
158
+ type: "prop",
159
+ },
160
+ {
161
+ v2: "step-status",
162
+ v3: "status",
163
+ type: "prop",
164
+ },
165
+ ],
166
+ "ic-switch": [sizeDefault, sizeSmall, sizeSmallAbsolute],
167
+ "ic-text-field": [
168
+ {
169
+ v2: "max-length",
170
+ v3: "max-characters",
171
+ type: "prop",
172
+ },
173
+ ],
174
+ "ic-toggle-button": [
175
+ {
176
+ v2: "toggle-checked",
177
+ v3: "checked",
178
+ type: "prop",
179
+ },
180
+ sizeDefault,
181
+ appearanceDark,
182
+ appearanceLight,
183
+ appearanceDefault,
184
+ ],
185
+ "ic-button": [
186
+ appearanceDarkIncludesMonochrome,
187
+ appearanceLight,
188
+ appearanceDefault,
189
+ sizeDefault,
190
+ ],
191
+ "ic-top-navigation": [
192
+ {
193
+ v2: "top-nav-resized",
194
+ v3: "ic-top-nav-resized",
195
+ type: "prop",
196
+ },
197
+ ],
198
+ "ic-breadcrumb-group": [appearanceDark, appearanceLight, appearanceDefault],
199
+ "ic-chip": [appearanceOutline, appearanceFilled, sizeDefault],
200
+ "ic-loading-indicator": [
201
+ appearanceDark,
202
+ appearanceLight,
203
+ sizeDefault,
204
+ appearanceDefault,
205
+ ],
206
+ "ic-skeleton": [
207
+ appearanceLightDeprecated,
208
+ appearanceDark,
209
+ appearanceLight,
210
+ appearanceDefault,
211
+ ],
212
+ "ic-tab-context": [appearanceDark, appearanceLight, appearanceDefault],
213
+ "ic-tree-view": [
214
+ sizeDefault,
215
+ appearanceDarkNoMonochrome,
216
+ appearanceLightNoMonochrome,
217
+ appearanceDefault,
218
+ ],
219
+ "ic-checkbox-group": [sizeDefault, sizeSmall, sizeSmallAbsolute],
220
+ "ic-checkbox": [sizeDefault, sizeSmall, sizeSmallAbsolute],
221
+ "ic-date-input": [sizeDefault],
222
+ "ic-date-picker": [sizeDefault],
223
+ "ic-hero": [sizeDefault, sizeSmall, sizeSmallAbsolute],
224
+ "ic-link": [appearanceDark, appearanceLight, appearanceDefault],
225
+ "ic-page-header": [sizeDefault, sizeSmall, sizeSmallAbsolute],
226
+ "ic-radio-group": [sizeDefault, sizeSmall, sizeSmallAbsolute],
227
+ "ic-dialog": [
228
+ {
229
+ v2: `buttons=[{]?["']true['"][}]?`,
230
+ v3: `hide-default-controls="false"`,
231
+ type: "absolute",
232
+ },
233
+ {
234
+ v2: `buttons=[{]?["']false['"][}]?`,
235
+ v3: `hide-default-controls="true"`,
236
+ type: "absolute",
237
+ },
238
+ ],
239
+ //react
240
+ IcAccordionGroup: [
241
+ {
242
+ v2: "groupTitle",
243
+ v3: "label",
244
+ type: "prop",
245
+ },
246
+ ],
247
+ IcBadge: [
248
+ {
249
+ v2: "textLabel",
250
+ v3: "label",
251
+ type: "prop",
252
+ },
253
+ sizeDefault,
254
+ ],
255
+ IcCard: [
256
+ {
257
+ v2: "IcCard",
258
+ v3: "IcCardVertical",
259
+ type: "component",
260
+ },
261
+ ],
262
+ IcDataEntity: [
263
+ sizeDefault,
264
+ sizeSmall,
265
+ sizeSmallAbsolute,
266
+ {
267
+ v2: "IcDataEntity",
268
+ v3: "IcDataList",
269
+ type: "component",
270
+ },
271
+ ],
272
+ IcDataRow: [sizeDefault, sizeSmall, sizeSmallAbsolute],
273
+ IcEmptyState: [
274
+ {
275
+ v2: "bodyMaxLines",
276
+ v3: "maxLines",
277
+ type: "prop",
278
+ },
279
+ ],
280
+ IcFooterLinkGroup: [
281
+ {
282
+ v2: "groupTitle",
283
+ v3: "label",
284
+ type: "prop",
285
+ },
286
+ ],
287
+ IcMenuItem: [
288
+ {
289
+ v2: "keyboardShortcut",
290
+ v3: "keyboardShortcutLabel",
291
+ type: "prop",
292
+ },
293
+ {
294
+ v2: "toggleChecked",
295
+ v3: "checked",
296
+ type: "prop",
297
+ },
298
+ ],
299
+ IcPagination: [
300
+ {
301
+ v2: "adjacentCount",
302
+ v3: "adjacentPageCount",
303
+ type: "prop",
304
+ },
305
+ {
306
+ v2: "boundaryCount",
307
+ v3: "boundaryPageCount",
308
+ type: "prop",
309
+ },
310
+ appearanceDark,
311
+ appearanceLight,
312
+ appearanceDefault,
313
+ ],
314
+ IcSearchBar: [
315
+ sizeDefault,
316
+ sizeSmall,
317
+ sizeSmallAbsolute,
318
+ {
319
+ v2: "disableFilter",
320
+ v3: "disableAutoFiltering",
321
+ type: "prop",
322
+ },
323
+ {
324
+ v2: "hintText",
325
+ v3: "assistiveHintText",
326
+ type: "prop",
327
+ },
328
+ ],
329
+ IcSelect: [
330
+ sizeDefault,
331
+ sizeSmall,
332
+ sizeSmallAbsolute,
333
+ {
334
+ v2: "disableFilter",
335
+ v3: "disableAutoFiltering",
336
+ type: "prop",
337
+ },
338
+ ],
339
+ IcSelectWithMulti: [
340
+ sizeDefault,
341
+ sizeSmall,
342
+ sizeSmallAbsolute,
343
+ {
344
+ v2: "IcSelectWithMulti",
345
+ v3: "IcSelect",
346
+ type: "component",
347
+ },
348
+ ],
349
+ IcSideNavigation: [
350
+ {
351
+ v2: "sideNavExpanded",
352
+ v3: "icSideNavExpanded",
353
+ type: "prop",
354
+ },
355
+ {
356
+ v2: "onSideNavExpanded",
357
+ v3: "onIcSideNavExpanded",
358
+ type: "prop",
359
+ },
360
+ ],
361
+ IcStatusTag: [
362
+ sizeDefault,
363
+ sizeSmall,
364
+ sizeSmallAbsolute,
365
+ appearanceOutlined,
366
+ appearanceFilled,
367
+ ],
368
+ IcStepper: [appearanceLightNoMonochrome, appearanceDefault],
369
+ IcStep: [
370
+ {
371
+ v2: "stepType",
372
+ v3: "type",
373
+ type: "prop",
374
+ },
375
+ {
376
+ v2: "stepTitle",
377
+ v3: "heading",
378
+ type: "prop",
379
+ },
380
+ {
381
+ v2: "stepSubtitle",
382
+ v3: "subheading",
383
+ type: "prop",
384
+ },
385
+ {
386
+ v2: "stepStatus",
387
+ v3: "status",
388
+ type: "prop",
389
+ },
390
+ ],
391
+ IcSwitch: [sizeDefault, sizeSmall, sizeSmallAbsolute],
392
+ IcTextField: [
393
+ sizeDefault,
394
+ sizeSmall,
395
+ sizeSmallAbsolute,
396
+ {
397
+ v2: "maxLength",
398
+ v3: "maxCharacters",
399
+ type: "prop",
400
+ },
401
+ ],
402
+ IcToggleButton: [
403
+ {
404
+ v2: "toggleChecked",
405
+ v3: "checked",
406
+ type: "prop",
407
+ },
408
+ sizeDefault,
409
+ appearanceDark,
410
+ appearanceLight,
411
+ appearanceDefault,
412
+ ],
413
+ IcButton: [
414
+ appearanceDarkIncludesMonochrome,
415
+ appearanceLight,
416
+ appearanceDefault,
417
+ sizeDefault,
418
+ ],
419
+ IcTopNavigation: [
420
+ {
421
+ v2: "topNavResized",
422
+ v3: "icTopNavResized",
423
+ type: "prop",
424
+ },
425
+ {
426
+ v2: "onTopNavResized",
427
+ v3: "onIcTopNavResized",
428
+ type: "prop",
429
+ },
430
+ ],
431
+ IcBreadcrumbGroup: [appearanceDark, appearanceLight, appearanceDefault],
432
+ IcChip: [appearanceOutline, appearanceFilled, sizeDefault],
433
+ IcLoadingIndicator: [
434
+ appearanceDark,
435
+ appearanceLight,
436
+ sizeDefault,
437
+ appearanceDefault,
438
+ ],
439
+ IcSkeleton: [
440
+ appearanceLightDeprecated,
441
+ appearanceDark,
442
+ appearanceLightNoMonochrome,
443
+ appearanceDefault,
444
+ ],
445
+ IcTabContext: [appearanceDark, appearanceLight, appearanceDefault],
446
+ IcTreeView: [
447
+ sizeDefault,
448
+ appearanceDarkNoMonochrome,
449
+ appearanceLightNoMonochrome,
450
+ appearanceDefault,
451
+ ],
452
+ IcCheckboxGroup: [sizeDefault, sizeSmall, sizeSmallAbsolute],
453
+ IcCheckbox: [sizeDefault, sizeSmall, sizeSmallAbsolute],
454
+ IcDateInput: [sizeDefault],
455
+ IcDatePicker: [sizeDefault],
456
+ IcHero: [sizeDefault, sizeSmall, sizeSmallAbsolute],
457
+ IcLink: [appearanceDark, appearanceLight, appearanceDefault],
458
+ IcPageHeader: [sizeDefault, sizeSmall, sizeSmallAbsolute],
459
+ IcRadioGroup: [sizeDefault, sizeSmall, sizeSmallAbsolute],
460
+ icDialog: [
461
+ {
462
+ v2: `buttons=[{]?["']true['"][}]?`,
463
+ v3: `hideDefaultControls="false"`,
464
+ type: "absolute",
465
+ },
466
+ {
467
+ v2: `buttons=[{]?["']false['"][}]?`,
468
+ v3: `hideDefaultControls="true"`,
469
+ type: "absolute",
470
+ },
471
+ ],
472
+ //types
473
+ HTMLIcDataEntityElement: [
474
+ {
475
+ v2: "HTMLIcDataEntityElement",
476
+ v3: "HTMLIcDataListElement",
477
+ type: "component",
478
+ },
479
+ ],
480
+ HTMLIcCardElement: [
481
+ {
482
+ v2: "HTMLIcCardElement",
483
+ v3: "HTMLIcCardVerticalElement",
484
+ type: "component",
485
+ },
486
+ ],
487
+ HTMLIcSelectWithMultiElement: [
488
+ {
489
+ v2: "HTMLIcSelectWithMultiElement",
490
+ v3: "HTMLIcSelectElement",
491
+ type: "component",
492
+ },
493
+ ],
494
+ };
@@ -0,0 +1,15 @@
1
+ /**
2
+ * For a detailed explanation regarding each configuration property, visit:
3
+ * https://jestjs.io/docs/configuration
4
+ */
5
+
6
+ /** @type {import('jest').Config} */
7
+ const config = {
8
+ clearMocks: true,
9
+ collectCoverage: true,
10
+ coverageDirectory: "coverage",
11
+ transform: {},
12
+ transformIgnorePatterns: ["\\\\node_modules\\\\", "\\.pnp\\.[^\\\\]+$"],
13
+ };
14
+
15
+ export default config;
package/package.json CHANGED
@@ -1,15 +1,16 @@
1
1
  {
2
2
  "name": "@ukic/codemod",
3
- "version": "1.0.0-alpha.8",
3
+ "version": "1.1.0",
4
4
  "description": "Codemod tool to help assist users upgrading from v2 to v3 of the UKIC design system",
5
5
  "bin": "./codemod.js",
6
6
  "author": "mi6",
7
7
  "type": "module",
8
8
  "scripts": {
9
- "test": "jest",
9
+ "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
10
10
  "example:cli": "node --no-warnings ./codemod.js --dir src"
11
11
  },
12
12
  "dependencies": {
13
+ "jest": "^29.7.0",
13
14
  "jest-cli": "^29.7.0",
14
15
  "yargs": "^17.7.2"
15
16
  },
@@ -19,5 +20,11 @@
19
20
  "access": "public",
20
21
  "registry": "https://registry.npmjs.org/"
21
22
  },
22
- "gitHead": "0a55d7e265bdf3d5bbf46a26f34dbfb44e3d9670"
23
+ "devDependencies": {
24
+ "@babel/cli": "^7.27.0",
25
+ "@babel/core": "^7.26.10",
26
+ "@babel/preset-env": "^7.26.9",
27
+ "babel-jest": "^29.7.0"
28
+ },
29
+ "gitHead": "6ddd470175efc6e34d94c67fe05db42304dd4e3c"
23
30
  }
@@ -1,50 +1,63 @@
1
1
  import { generateRegex } from "./generate-regex.js";
2
+ import { changes } from "../data/data.js";
2
3
 
3
- /**
4
- *
5
- * @param {*} stringArray
6
- * @param {*} jsonData
7
- * @returns File string with changes made by comparing v2 and v3 names in predefined json file
8
- */
9
- export function compareComponent(stringArray, jsonData) {
4
+ export function convertComponents(stringArray) {
10
5
  let fileString = stringArray;
11
- const componentsAffected = new Set(
12
- jsonData.map((entry) => entry.componentsAffected)
13
- );
6
+ // loop round each component
7
+ Object.keys(changes).forEach((component) => {
8
+ // find component regex (e.g. <Component ... />)
9
+ const regex = generateRegex(component, "prop");
14
10
 
15
- componentsAffected.forEach((component) => {
16
- const regex = generateRegex(
17
- component,
18
- jsonData.filter((field) => field.componentsAffected === component)[0].type
19
- );
11
+ // find if component exists in file
20
12
  const match = String(fileString).match(regex);
13
+
14
+ // if there are components
21
15
  if (match) {
22
- const oldProps = jsonData.reduce((total, field) => {
23
- if (field.componentsAffected === component) total.push(field.v2Name);
24
- return total;
25
- }, []);
26
- match.forEach((component) => {
27
- oldProps.filter((prop) => {
28
- component.includes(prop);
29
- });
30
- let newComponent = component;
31
- oldProps.forEach((prop) => {
32
- const newProp = jsonData.find((field) => field.v2Name === prop);
33
- if (newProp.type === "absolute") {
34
- const regex = generateRegex(newProp.v2Name, "absolute-props");
35
- const exactMatch = String(newComponent).match(regex);
36
- if (exactMatch) {
16
+ //loop each of the found components
17
+ match.forEach((matchComponent) => {
18
+ // maintain the original component for comparison
19
+ let newComponent = matchComponent;
20
+ // loop through each of the changes for the component
21
+ changes[component].forEach((field) => {
22
+ // check type of change required
23
+ switch (field.type) {
24
+ /*
25
+ ** if only prop name changes (e.g. prop="old" -> newProp="old")
26
+ */
27
+ case "prop":
28
+ newComponent = newComponent.replace(field.v2, field.v3);
29
+ break;
30
+
31
+ /*
32
+ ** if change is both prop name and value changes (e.g. prop="old" -> newProp="new")
33
+ */
34
+ case "absolute":
37
35
  newComponent = newComponent.replace(
38
- exactMatch[0],
39
- newProp.v3Name
36
+ generateRegex(field.v2, "absolute"),
37
+ field.v3
40
38
  );
41
- }
42
- } else newComponent = newComponent.replace(prop, newProp.v3Name);
39
+ break;
40
+
41
+ /*
42
+ ** component name change (e.g. <oldComponent ... /> -> <newComponent ... />)
43
+ */
44
+ case "component":
45
+ fileString = fileString.replace(
46
+ generateRegex(field.v2, "component"),
47
+ field.v3
48
+ );
49
+ break;
50
+ case "web-component":
51
+ fileString = fileString.replace(
52
+ generateRegex(field.v2, "web-component"),
53
+ field.v3
54
+ );
55
+ break;
56
+ }
43
57
  });
44
- fileString = fileString.replace(component, newComponent);
58
+ fileString = fileString.replace(matchComponent, newComponent);
45
59
  });
46
60
  }
47
61
  });
48
-
49
62
  return fileString;
50
63
  }
@@ -1,25 +1,25 @@
1
+ const webComponentImport = "@ukic/web-components";
2
+ const reactImport = "@ukic/react";
3
+ const canaryWebComponentsImport = "@ukic/canary-web-components";
4
+ const canaryReactImport = "@ukic/canary-react";
5
+
1
6
  /**
2
7
  *
3
8
  * @param {*} component
4
9
  * @param {*} style
5
10
  * @returns correct regex expression for the change based of predefined types in json files
6
11
  */
7
-
8
- function generateRegex(component, style) {
12
+ export function generateRegex(component, style) {
9
13
  switch (style) {
10
14
  case "prop":
11
15
  return new RegExp(`<${component}[^\/|<]+`, "gm");
12
16
  case "component":
13
- return new RegExp(`${component}\\W`, "gm");
17
+ return new RegExp(`${component}\\b`, "gm");
14
18
  case "web-component":
15
- return new RegExp(`${component}\\b[^-]`, "gm");
19
+ return new RegExp(`${component}\\b(?!-)`, "gm");
16
20
  case "absolute":
17
- return new RegExp(`<${component}[^\/|<]+`, "gm");
18
- case "absolute-props":
19
21
  return new RegExp(`${component}`, "gm");
20
22
  case "test-simple":
21
23
  return new RegExp(`[[.]${component}\\b`, "gm");
22
24
  }
23
25
  }
24
-
25
- export { generateRegex };