@vkontakte/vkui-codemods 1.0.0-beta.0 → 1.0.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.
Files changed (54) hide show
  1. package/README.md +62 -19
  2. package/dist/autoDetectVKUIVersion.js +17 -7
  3. package/dist/cli.js +80 -32
  4. package/dist/codemod-helpers.js +86 -1
  5. package/dist/getAvailableCodemods.js +17 -7
  6. package/dist/index.js +45 -57
  7. package/dist/transforms/v7/action-sheet.js +16 -0
  8. package/dist/transforms/v7/alert.js +16 -0
  9. package/dist/transforms/v7/appearance-provider.js +35 -0
  10. package/dist/transforms/v7/appearance.js +45 -0
  11. package/dist/transforms/v7/banner.js +47 -0
  12. package/dist/transforms/v7/calendar.js +17 -0
  13. package/dist/transforms/v7/card-grid.js +16 -0
  14. package/dist/transforms/v7/card-scroll.js +59 -0
  15. package/dist/transforms/v7/cell-button.js +3 -15
  16. package/dist/transforms/v7/cell.js +19 -0
  17. package/dist/transforms/v7/chips-select.js +20 -0
  18. package/dist/transforms/v7/common/moveFromChildrenToLabel.js +68 -0
  19. package/dist/transforms/v7/common/remapSizePropValue.js +10 -5
  20. package/dist/transforms/v7/common/removeChildrenFromComponent.js +17 -0
  21. package/dist/transforms/v7/config-provider.js +136 -0
  22. package/dist/transforms/v7/content-card.js +21 -0
  23. package/dist/transforms/v7/counter.js +60 -0
  24. package/dist/transforms/v7/custom-scroll-view.js +21 -0
  25. package/dist/transforms/v7/custom-select.js +20 -0
  26. package/dist/transforms/v7/date-picker.js +26 -0
  27. package/dist/transforms/v7/form-item.js +2 -2
  28. package/dist/transforms/v7/form-status.js +18 -0
  29. package/dist/transforms/v7/header.js +47 -0
  30. package/dist/transforms/v7/horizontal-cell-show-more.js +33 -13
  31. package/dist/transforms/v7/horizontal-cell.js +16 -0
  32. package/dist/transforms/v7/image-overlay.js +10 -10
  33. package/dist/transforms/v7/mini-info-cell.js +18 -0
  34. package/dist/transforms/v7/modal-card.js +29 -0
  35. package/dist/transforms/v7/onboarding-tooltip.js +16 -0
  36. package/dist/transforms/v7/panel-header-back.js +18 -0
  37. package/dist/transforms/v7/panel-header-close.js +18 -0
  38. package/dist/transforms/v7/panel-header-content.js +16 -0
  39. package/dist/transforms/v7/panel-header-edit.js +19 -0
  40. package/dist/transforms/v7/panel-header-submit.js +18 -0
  41. package/dist/transforms/v7/panel-spinner.js +30 -0
  42. package/dist/transforms/v7/placeholder.js +19 -0
  43. package/dist/transforms/v7/rich-cell.js +20 -0
  44. package/dist/transforms/v7/screen-spinner.js +25 -2
  45. package/dist/transforms/v7/scroll-arrow.js +52 -0
  46. package/dist/transforms/v7/select.js +20 -0
  47. package/dist/transforms/v7/separator.js +1 -0
  48. package/dist/transforms/v7/simple-cell.js +19 -0
  49. package/dist/transforms/v7/subnavigation-bar.js +46 -0
  50. package/dist/transforms/v7/subnavigation-button.js +18 -0
  51. package/dist/transforms/v7/tabbar-item.js +16 -0
  52. package/dist/transforms/v7/tooltip.js +16 -0
  53. package/dist/transforms/v7/users-stack.js +2 -15
  54. package/package.json +9 -9
@@ -13,14 +13,24 @@ function transformer(file, api, options) {
13
13
  return source.toSource();
14
14
  }
15
15
  function removeSizeProp(attribute) {
16
- attribute.node.name.name === 'size' && j(attribute).remove();
16
+ if (attribute.node.name.name === 'size') {
17
+ j(attribute).remove();
18
+ }
19
+ }
20
+ function renameLabelToCaption(attribute) {
21
+ if (attribute.node.name.name === 'caption') {
22
+ j(attribute).replaceWith(j.jsxAttribute(j.jsxIdentifier('label'), attribute.node.value));
23
+ }
17
24
  }
18
25
  // Обработка ScreenSpinner
19
26
  source
20
27
  .find(j.JSXOpeningElement)
21
28
  .filter(function (path) { return path.value.name.type === 'JSXIdentifier' && path.value.name.name === localName; })
22
29
  .find(j.JSXAttribute)
23
- .forEach(removeSizeProp);
30
+ .forEach(function (attr) {
31
+ removeSizeProp(attr);
32
+ renameLabelToCaption(attr);
33
+ });
24
34
  // Обработка ScreenSpinner.Loader
25
35
  source
26
36
  .find(j.JSXElement, {
@@ -34,5 +44,18 @@ function transformer(file, api, options) {
34
44
  })
35
45
  .find(j.JSXAttribute)
36
46
  .forEach(removeSizeProp);
47
+ // Обработка ScreenSpinner.Container
48
+ source
49
+ .find(j.JSXElement, {
50
+ openingElement: {
51
+ name: {
52
+ type: 'JSXMemberExpression',
53
+ object: { name: localName },
54
+ property: { name: 'Container' },
55
+ },
56
+ },
57
+ })
58
+ .find(j.JSXAttribute)
59
+ .forEach(renameLabelToCaption);
37
60
  return source.toSource();
38
61
  }
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parser = void 0;
4
+ exports.default = transformer;
5
+ var codemod_helpers_1 = require("../../codemod-helpers");
6
+ var report_1 = require("../../report");
7
+ exports.parser = 'tsx';
8
+ var componentName = 'ScrollArrow';
9
+ var affectedComponents = ['HorizontalScroll', 'Gallery'];
10
+ function arrowSizeManipulator(api, attribute) {
11
+ var _a;
12
+ var node = attribute.node;
13
+ if (((_a = node.value) === null || _a === void 0 ? void 0 : _a.type) === 'StringLiteral') {
14
+ var oldValue = node.value.value;
15
+ var newValue = oldValue === 'm' ? 's' : oldValue === 'l' ? 'm' : undefined;
16
+ if (newValue) {
17
+ node.value = api.jscodeshift.stringLiteral(newValue);
18
+ }
19
+ }
20
+ else {
21
+ (0, report_1.report)(api, "Manual changes required for ".concat(componentName, "'s \"size\" prop. Use \"s\" or \"m\" value only."));
22
+ }
23
+ }
24
+ function transformer(file, api, options) {
25
+ var alias = options.alias;
26
+ var j = api.jscodeshift;
27
+ var source = j(file.source);
28
+ var localName = (0, codemod_helpers_1.getImportInfo)(j, file, componentName, alias).localName;
29
+ var horizontalScrollLocalName = (0, codemod_helpers_1.getImportInfo)(j, file, affectedComponents[0], alias).localName;
30
+ var galleryLocalName = (0, codemod_helpers_1.getImportInfo)(j, file, affectedComponents[1], alias).localName;
31
+ if (!localName) {
32
+ return source.toSource();
33
+ }
34
+ source
35
+ .find(j.JSXOpeningElement)
36
+ .filter(function (path) { return path.value.name.type === 'JSXIdentifier' && path.value.name.name === localName; })
37
+ .find(j.JSXAttribute, { name: { name: 'size' } })
38
+ .forEach(function (attribute) {
39
+ arrowSizeManipulator(api, attribute);
40
+ });
41
+ source
42
+ .find(j.JSXOpeningElement)
43
+ .filter(function (path) {
44
+ return path.value.name.type === 'JSXIdentifier' &&
45
+ [horizontalScrollLocalName, galleryLocalName].includes(path.value.name.name);
46
+ })
47
+ .find(j.JSXAttribute, { name: { name: 'arrowSize' } })
48
+ .forEach(function (attribute) {
49
+ arrowSizeManipulator(api, attribute);
50
+ });
51
+ return source.toSource();
52
+ }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parser = void 0;
4
+ exports.default = transformer;
5
+ var codemod_helpers_1 = require("../../codemod-helpers");
6
+ exports.parser = 'tsx';
7
+ var PROPS_TO_REMOVE = ['autoHideScrollbar', 'autoHideScrollbarDelay'];
8
+ function transformer(file, api, options) {
9
+ var alias = options.alias;
10
+ var j = api.jscodeshift;
11
+ var source = j(file.source);
12
+ var localName = (0, codemod_helpers_1.getImportInfo)(j, file, 'Select', alias).localName;
13
+ if (!localName) {
14
+ return source.toSource();
15
+ }
16
+ (0, codemod_helpers_1.removeProps)(j, api, source, localName, PROPS_TO_REMOVE, function () {
17
+ return "need to remove props ".concat(PROPS_TO_REMOVE.join(', '));
18
+ });
19
+ return source.toSource();
20
+ }
@@ -12,6 +12,7 @@ function transformer(file, api, options) {
12
12
  var localName = (0, codemod_helpers_1.getImportInfo)(j, file, componentName, alias).localName;
13
13
  if (localName) {
14
14
  (0, codemod_helpers_1.renameProp)(j, source, localName, { mode: 'appearance' });
15
+ (0, codemod_helpers_1.swapBooleanValue)(api, source, localName, 'wide', 'padding');
15
16
  }
16
17
  return source.toSource();
17
18
  }
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parser = void 0;
4
+ exports.default = transformer;
5
+ var codemod_helpers_1 = require("../../codemod-helpers");
6
+ exports.parser = 'tsx';
7
+ function transformer(file, api, options) {
8
+ var alias = options.alias;
9
+ var j = api.jscodeshift;
10
+ var source = j(file.source);
11
+ var localName = (0, codemod_helpers_1.getImportInfo)(j, file, 'SimpleCell', alias).localName;
12
+ if (localName) {
13
+ (0, codemod_helpers_1.renameProp)(j, source, localName, {
14
+ expandable: 'chevron',
15
+ subhead: 'overTitle',
16
+ });
17
+ }
18
+ return source.toSource();
19
+ }
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parser = void 0;
4
+ exports.default = transformer;
5
+ var codemod_helpers_1 = require("../../codemod-helpers");
6
+ var report_1 = require("../../report");
7
+ exports.parser = 'tsx';
8
+ function replaceModeToFixed(j, source, api, localName) {
9
+ source
10
+ .find(j.JSXElement, {
11
+ openingElement: {
12
+ name: {
13
+ name: localName,
14
+ },
15
+ },
16
+ })
17
+ .find(j.JSXAttribute)
18
+ .filter(function (attribute) { return attribute.node.name.name === 'mode'; })
19
+ .forEach(function (attr) {
20
+ var value = (0, codemod_helpers_1.getStringValueFromAttribute)(attr.node);
21
+ if (value === null) {
22
+ (0, report_1.report)(api, ": ".concat(localName, " has been changed. Manual changes required: change prop mode to flag fixed."));
23
+ return;
24
+ }
25
+ if (value === 'overflow') {
26
+ j(attr).remove();
27
+ }
28
+ else if (value === 'fixed') {
29
+ j(attr).replaceWith(j.jsxAttribute(j.jsxIdentifier('fixed')));
30
+ }
31
+ });
32
+ }
33
+ function transformer(file, api, options) {
34
+ var alias = options.alias;
35
+ var j = api.jscodeshift;
36
+ var source = j(file.source);
37
+ var localName = (0, codemod_helpers_1.getImportInfo)(j, file, 'SubnavigationBar', alias).localName;
38
+ if (!localName) {
39
+ return source.toSource();
40
+ }
41
+ (0, codemod_helpers_1.renameProp)(j, source, localName, {
42
+ subheader: 'subtitle',
43
+ });
44
+ replaceModeToFixed(j, source, api, localName);
45
+ return source.toSource();
46
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parser = void 0;
4
+ exports.default = transformer;
5
+ var codemod_helpers_1 = require("../../codemod-helpers");
6
+ exports.parser = 'tsx';
7
+ function transformer(file, api, options) {
8
+ var alias = options.alias;
9
+ var j = api.jscodeshift;
10
+ var source = j(file.source);
11
+ var localName = (0, codemod_helpers_1.getImportInfo)(j, file, 'SubnavigationButton', alias).localName;
12
+ if (localName) {
13
+ (0, codemod_helpers_1.renameProp)(j, source, localName, {
14
+ expandable: 'chevron',
15
+ });
16
+ }
17
+ return source.toSource();
18
+ }
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parser = void 0;
4
+ exports.default = transformer;
5
+ var codemod_helpers_1 = require("../../codemod-helpers");
6
+ exports.parser = 'tsx';
7
+ function transformer(file, api, options) {
8
+ var alias = options.alias;
9
+ var j = api.jscodeshift;
10
+ var source = j(file.source);
11
+ var localName = (0, codemod_helpers_1.getImportInfo)(j, file, 'TabbarItem', alias).localName;
12
+ if (localName) {
13
+ (0, codemod_helpers_1.renameProp)(j, source, localName, { text: 'label' });
14
+ }
15
+ return source.toSource();
16
+ }
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parser = void 0;
4
+ exports.default = transformer;
5
+ var codemod_helpers_1 = require("../../codemod-helpers");
6
+ exports.parser = 'tsx';
7
+ function transformer(file, api, options) {
8
+ var alias = options.alias;
9
+ var j = api.jscodeshift;
10
+ var source = j(file.source);
11
+ var localName = (0, codemod_helpers_1.getImportInfo)(j, file, 'Tooltip', alias).localName;
12
+ if (localName) {
13
+ (0, codemod_helpers_1.renameProp)(j, source, localName, { text: 'description', header: 'title' });
14
+ }
15
+ return source.toSource();
16
+ }
@@ -20,28 +20,15 @@ function transformer(file, api, options) {
20
20
  'row-reverse': 'inline-end',
21
21
  'column': 'block-start',
22
22
  };
23
- var getValueFromAttribute = function (attribute) {
24
- var _a, _b;
25
- if (((_a = attribute.value) === null || _a === void 0 ? void 0 : _a.type) === 'StringLiteral') {
26
- return attribute.value.value;
27
- }
28
- if (((_b = attribute.value) === null || _b === void 0 ? void 0 : _b.type) === 'JSXExpressionContainer') {
29
- var expression = attribute.value.expression;
30
- if (expression.type === 'StringLiteral') {
31
- return expression.value;
32
- }
33
- }
34
- return null;
35
- };
36
23
  source
37
24
  .find(j.JSXElement, { openingElement: { name: { name: localName } } })
38
25
  .find(j.JSXAttribute, { name: { name: attributeToReplace } })
39
26
  .forEach(function (path) {
40
27
  var avatar = path.node;
41
28
  avatar.name.name = newAttributeName;
42
- var value = getValueFromAttribute(avatar);
29
+ var value = (0, codemod_helpers_1.getStringValueFromAttribute)(avatar);
43
30
  if (!value || !directionToAvatarsPosition[value]) {
44
- (0, report_1.report)(api, ": ".concat(localName, " has been changed. Manual changes required: need to change direction prop to avatarsPosition"));
31
+ (0, report_1.report)(api, ": ".concat(localName, " has been changed. Manual changes required: need to change direction prop to avatarsPosition."));
45
32
  return;
46
33
  }
47
34
  avatar.value = j.stringLiteral(directionToAvatarsPosition[value]);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vkontakte/vkui-codemods",
3
- "version": "1.0.0-beta.0",
3
+ "version": "1.0.0",
4
4
  "description": "Codemods for automatic VKUI major version upgrade",
5
5
  "repository": "https://github.com/VKCOM/VKUI",
6
6
  "homepage": "https://vkcom.github.io/VKUI/",
@@ -16,18 +16,18 @@
16
16
  "dependencies": {
17
17
  "chalk": "^4.1.2",
18
18
  "commander": "^12.1.0",
19
- "cross-spawn": "^7.0.3",
20
- "jscodeshift": "^17.0.0",
19
+ "cross-spawn": "^7.0.5",
20
+ "jscodeshift": "^17.1.1",
21
21
  "prompts": "^2.4.2",
22
- "typescript": "^5.6.2"
22
+ "typescript": "^5.7.2"
23
23
  },
24
24
  "devDependencies": {
25
- "@swc/core": "^1.7.26",
26
- "@swc/jest": "^0.2.36",
25
+ "@swc/core": "^1.9.3",
26
+ "@swc/jest": "^0.2.37",
27
27
  "@types/cross-spawn": "^6.0.6",
28
- "@types/jest": "^29.5.13",
29
- "@types/jscodeshift": "^0.11.11",
30
- "@types/node": "^22.7.4",
28
+ "@types/jest": "^29.5.14",
29
+ "@types/jscodeshift": "^0.12.0",
30
+ "@types/node": "^22.10.1",
31
31
  "@types/prompts": "^2.4.9",
32
32
  "jest": "^29.7.0",
33
33
  "ts-node": "^10.9.2"