@vkontakte/vkui-codemods 0.0.7 → 1.0.0-beta.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 (100) hide show
  1. package/README.md +69 -21
  2. package/dist/autoDetectVKUIVersion.js +77 -0
  3. package/dist/cli.js +86 -30
  4. package/dist/codemod-helpers.js +76 -4
  5. package/dist/getAvailableCodemods.js +31 -4
  6. package/dist/index.js +57 -64
  7. package/dist/report.js +1 -2
  8. package/dist/testHelpers/testHelper.js +3 -3
  9. package/dist/transforms/{accordion.js → v6/accordion.js} +3 -3
  10. package/dist/transforms/{action-sheet-item.js → v6/action-sheet-item.js} +2 -2
  11. package/dist/transforms/{action-sheet.js → v6/action-sheet.js} +3 -3
  12. package/dist/transforms/{alert.js → v6/alert.js} +2 -2
  13. package/dist/transforms/{appearance-provider.js → v6/appearance-provider.js} +2 -2
  14. package/dist/transforms/{banner.js → v6/banner.js} +3 -3
  15. package/dist/transforms/{calendar-range.js → v6/calendar-range.js} +2 -2
  16. package/dist/transforms/{calendar.js → v6/calendar.js} +2 -2
  17. package/dist/transforms/{card-scroll.js → v6/card-scroll.js} +2 -2
  18. package/dist/transforms/{chip.js → v6/chip.js} +2 -2
  19. package/dist/transforms/{chips-input.js → v6/chips-input.js} +2 -2
  20. package/dist/transforms/{config-provider.js → v6/config-provider.js} +2 -2
  21. package/dist/transforms/{content-card.js → v6/content-card.js} +2 -2
  22. package/dist/transforms/{custom-scroll-view.js → v6/custom-scroll-view.js} +3 -3
  23. package/dist/transforms/{date-input.js → v6/date-input.js} +2 -2
  24. package/dist/transforms/{date-range-input.js → v6/date-range-input.js} +2 -2
  25. package/dist/transforms/{fixed-layout.js → v6/fixed-layout.js} +2 -2
  26. package/dist/transforms/{forbid-imports.js → v6/forbid-imports.js} +2 -2
  27. package/dist/transforms/{form-item.js → v6/form-item.js} +2 -2
  28. package/dist/transforms/{form-layout.js → v6/form-layout.js} +3 -3
  29. package/dist/transforms/{gallery.js → v6/gallery.js} +2 -2
  30. package/dist/transforms/{gradient-prop-change.js → v6/gradient-prop-change.js} +3 -3
  31. package/dist/transforms/{image-base.js → v6/image-base.js} +2 -2
  32. package/dist/transforms/{modal-card.js → v6/modal-card.js} +3 -3
  33. package/dist/transforms/{modal-page-header.js → v6/modal-page-header.js} +2 -2
  34. package/dist/transforms/{pagination.js → v6/pagination.js} +3 -3
  35. package/dist/transforms/{panel-header-content.js → v6/panel-header-content.js} +3 -3
  36. package/dist/transforms/{panel-header.js → v6/panel-header.js} +3 -3
  37. package/dist/transforms/{placeholder.js → v6/placeholder.js} +2 -2
  38. package/dist/transforms/{popout-wrapper.js → v6/popout-wrapper.js} +3 -3
  39. package/dist/transforms/{popover.js → v6/popover.js} +2 -2
  40. package/dist/transforms/{popper.js → v6/popper.js} +2 -2
  41. package/dist/transforms/{rich-tooltip.js → v6/rich-tooltip.js} +3 -3
  42. package/dist/transforms/{search.js → v6/search.js} +2 -2
  43. package/dist/transforms/{select.js → v6/select.js} +2 -2
  44. package/dist/transforms/{simple-cell.js → v6/simple-cell.js} +3 -3
  45. package/dist/transforms/{split-col.js → v6/split-col.js} +2 -2
  46. package/dist/transforms/{tabbar.js → v6/tabbar.js} +2 -2
  47. package/dist/transforms/{tappable.js → v6/tappable.js} +3 -3
  48. package/dist/transforms/{text-tooltip.js → v6/text-tooltip.js} +2 -2
  49. package/dist/transforms/{tooltip-container.js → v6/tooltip-container.js} +2 -2
  50. package/dist/transforms/{tooltip.js → v6/tooltip.js} +2 -2
  51. package/dist/transforms/{typography.js → v6/typography.js} +3 -3
  52. package/dist/transforms/{users-stack.js → v6/users-stack.js} +3 -3
  53. package/dist/transforms/v7/action-sheet.js +16 -0
  54. package/dist/transforms/v7/alert.js +16 -0
  55. package/dist/transforms/v7/appearance-provider.js +35 -0
  56. package/dist/transforms/v7/appearance.js +45 -0
  57. package/dist/transforms/v7/banner.js +47 -0
  58. package/dist/transforms/v7/card-grid.js +16 -0
  59. package/dist/transforms/v7/card-scroll.js +59 -0
  60. package/dist/transforms/v7/cell-button.js +49 -0
  61. package/dist/transforms/v7/cell.js +18 -0
  62. package/dist/transforms/v7/chips-select.js +20 -0
  63. package/dist/transforms/v7/common/remapSizePropValue.js +43 -0
  64. package/dist/transforms/v7/common/swapGapPropElements.js +25 -0
  65. package/dist/transforms/v7/config-provider.js +136 -0
  66. package/dist/transforms/v7/content-card.js +21 -0
  67. package/dist/transforms/v7/custom-scroll-view.js +21 -0
  68. package/dist/transforms/v7/custom-select.js +20 -0
  69. package/dist/transforms/v7/flex.js +18 -0
  70. package/dist/transforms/v7/form-item.js +128 -0
  71. package/dist/transforms/v7/form-status.js +18 -0
  72. package/dist/transforms/v7/header.js +28 -0
  73. package/dist/transforms/v7/horizontal-cell-show-more.js +58 -0
  74. package/dist/transforms/v7/horizontal-cell.js +16 -0
  75. package/dist/transforms/v7/horizontal-scroll.js +38 -0
  76. package/dist/transforms/v7/image-overlay.js +125 -0
  77. package/dist/transforms/v7/mini-info-cell.js +18 -0
  78. package/dist/transforms/v7/modal-card.js +29 -0
  79. package/dist/transforms/v7/onboarding-tooltip.js +16 -0
  80. package/dist/transforms/v7/panel-header-content.js +16 -0
  81. package/dist/transforms/v7/placeholder.js +19 -0
  82. package/dist/transforms/v7/rich-cell.js +20 -0
  83. package/dist/transforms/v7/screen-spinner.js +61 -0
  84. package/dist/transforms/v7/scroll-arrow.js +52 -0
  85. package/dist/transforms/v7/select.js +20 -0
  86. package/dist/transforms/v7/separator.js +18 -0
  87. package/dist/transforms/v7/simple-cell.js +18 -0
  88. package/dist/transforms/v7/simple-grid.js +18 -0
  89. package/dist/transforms/v7/spacing.js +26 -0
  90. package/dist/transforms/v7/spinner.js +29 -0
  91. package/dist/transforms/v7/subnavigation-bar.js +60 -0
  92. package/dist/transforms/v7/subnavigation-button.js +18 -0
  93. package/dist/transforms/v7/tabbar-item.js +16 -0
  94. package/dist/transforms/v7/tooltip.js +16 -0
  95. package/dist/transforms/v7/typography.js +79 -0
  96. package/dist/transforms/v7/users-stack.js +50 -0
  97. package/package.json +7 -7
  98. package/dist/transforms/{horizontal-cell-show-more.js → v6/horizontal-cell-show-more.js} +1 -1
  99. package/dist/transforms/{range-slider.js → v6/range-slider.js} +1 -1
  100. package/dist/transforms/{visually-hidden-input.js → v6/visually-hidden-input.js} +1 -1
package/README.md CHANGED
@@ -1,53 +1,71 @@
1
- # VKUI v6 Codemods
1
+ # VKUI Codemods
2
2
 
3
3
  Чтобы упростить переход на новую мажорную версию, можно воспользоваться инструментом по автоматической миграции ваших компонентов.
4
4
 
5
- > Для начала обновите ваше приложение до новой мажорной версии (**v6**) в соответствии с требованиями вашего пакетного менеджера и среды
5
+ > Для начала обновите ваше приложение до необходимой мажорной версии (например, **v7**) в соответствии с требованиями вашего пакетного менеджера и среды.
6
6
 
7
- > Обратите внимание, минимальная поддерживаемая версия **React** увеличена до `v18.2.0`
7
+ > Обратите внимание, минимальная поддерживаемая версия **React** `v18.2.0`.
8
8
 
9
- > Пока для перевода доступны только `Typescript`-файлы (_.ts/_.tsx)
9
+ > Пока для перевода доступны только `Typescript`-файлы (_.ts/_.tsx).
10
10
 
11
11
  > Из-за особенностей работы `jscodeshift` после применения миграции у вас могут появиться лишние скобки вокруг `JSX`-элементов, пожалуйста, запустите `prettier`, чтобы отформатировать код в соответствии с вашими настройками.
12
12
 
13
+ > Если вы хотите обновиться с `v5` на `v7` вам необходимо будет обновиться сначала на `v6`, а затем на `v7`, запустив скрипт последовательно для каждой из версий.
14
+
15
+ ## Запуск
16
+
13
17
  Перейдите в директорию с исходниками вашего проекта (обычно это `src/`) и запустите следующую команду:
14
18
 
15
19
  ```shell
16
20
  npx @vkontakte/vkui-codemods
17
21
  ```
18
22
 
19
- Инструмент представляет собой консольное приложение, с помощью которого вы можете выбрать необходимые изменения и применить их, доступны следующие команды:
23
+ Инструмент представляет собой консольное приложение, с помощью которого вы можете выбрать необходимые изменения и применить их. Доступны следующие команды:
20
24
 
21
- ```
25
+ ```console
22
26
  $ npx @vkontakte/vkui-codemods --help
23
27
 
24
- Usage: @vkontakte/vkui-codemod [codemod-name]
28
+ Usage: @vkontakte/vkui-codemod [codemod-names...]
25
29
 
26
30
  Arguments:
27
- codemod-name which codemod should be applied
31
+ codemod-names which codemods should be applied
28
32
 
29
33
  Options:
30
- -V, --version output the version number
31
- -l --list list available codemods
32
- --all apply all available codemods
33
- -p --path <paths> path to files in which to apply the codemods (default: current directory)
34
- --dry-run no changes are made to files
35
- --ignore-config <config> ignore files if they match patterns sourced from a configuration file (e.g. a .gitignore)
36
- --debug all logs are shown
37
- --alias <alias> in case you have adapter over original library (default: "@vkontakte/vkui")
38
- -h, --help display help for command
34
+ -V, --version output the version number
35
+ -l --list list available codemods
36
+ --all apply all available codemods
37
+ -tv --transforms-version <transformsVersion> vkui major version transforms (available versions: "6", "7")
38
+ -p --path [paths...] file paths where codemods need to apply (space separated list), default: current
39
+ directory
40
+ --input-file <file> apply codemods only to file/directory listed in the file
41
+ --log-file <file> log migration instructions with required manual changes to the file instead of
42
+ the console
43
+ --dry-run no changes are made to files
44
+ --ignore-config <config> ignore files if they match patterns sourced from a configuration file (e.g. a
45
+ .gitignore)
46
+ --debug all logs are shown
47
+ --alias <alias> in case you have adapter over original library (default: "@vkontakte/vkui")
48
+ -h, --help display help for command
39
49
  ```
40
50
 
41
- При запуске приложения без аргументов будет предложено выбрать один из имеющихся codemod (их название отражает название компонента, к которому будет применено изменение). Если вам необходимо применить все имеющиеся codemods, запустите команду с опцией `--all`:
51
+ ### `-tv (--transforms-version)`
52
+
53
+ Если приложение запустить без опции `-tv (--transforms-version)`, скрипт попытается автоматически определить версию, на которую необходимо мигрировать. Если этого сделать не удалось - нужно будет выбрать версию из предложенного списка.
54
+
55
+ ### `--all`
56
+
57
+ При запуске приложения без аргументов будет предложено выбрать одну или несколько имеющихся миграций (их название отражает название компонента, к которому будет применено изменение). Если вам необходимо применить все имеющиеся миграции, запустите команду с опцией `--all`:
42
58
 
43
59
  ```shell
44
60
  npx @vkontakte/vkui-codemods --all
45
61
  ```
46
62
 
47
- Если вы хотите исключить некоторые файлы или директории из обработки, то временно создайте файл (по примеру .gitignore) с перечисленными исключениями:
63
+ ### `--ignore-config <file>`
64
+
65
+ Если вы хотите исключить некоторые файлы или директории из обработки, то временно создайте файл (по примеру .gitignore) с перечисленными исключениями в папке:
48
66
 
49
67
  ```shell
50
- npx @vkontakte/vkui-codemods --all --path "./examples" --ignore-config "./.codemodignore"
68
+ npx @vkontakte/vkui-codemods --all --path src --ignore-config "./.codemodignore"
51
69
  ```
52
70
 
53
71
  ```
@@ -56,10 +74,40 @@ MyBeautifulComponentToIgnore.tsx
56
74
  directoryToIgnore/
57
75
  ```
58
76
 
59
- Приведенная выше команда применит все codemods в директории `examples` (находится в корне текущей директории), игонорируя файл `MyBeautifulComponentToIgnore.tsx` и директорию `directoryToIgnore`, указанные в `.codemodignore` (находится в корне текущей директории)
77
+ Приведенная выше команда применит все codemods в директории `src` (находится в корне текущей директории), игонорируя файл `MyBeautifulComponentToIgnore.tsx` и директорию `directoryToIgnore`, указанные в `.codemodignore` (находится в корне текущей директории).
78
+
79
+ ### `--log-file <file>`
80
+
81
+ Есть вероятность, что применить автоматические миграции не представляется возможным. В таком случае приложение выведет в консоль подсказку, какие изменения необходимо внести вручную. Этих изменений может быть большое количество, для удобства можно воспользоваться опцией `--log-file <file>`, тогда все инструкции будут записаны в указанный файл (если его не существует, то он будет создан автоматически).
82
+
83
+ ### `--input-file <file>`
84
+
85
+ Если вы хотите перечислить файлы и директории, которые нужно включить в обработку, в отдельном конфигурационном файле, это можно сделать, указав опцию `--input-file <file>`:
86
+
87
+ ```
88
+ // .input-file
89
+ MyBeautifulComponent.tsx
90
+ src/components
91
+ ```
92
+
93
+ ### `--alias`
60
94
 
61
95
  > Обратите внимание, если вы используете собственный адаптер над библиотекой `VKUI` и делаете ре-экспорт существующих компонентов, то можете воспользоваться опцией `--alias` для указания правильного пути.
62
96
 
63
97
  ```shell
64
98
  npx @vkontakte/vkui-codemods --all --alias "@myscope/VKUIFake"
65
99
  ```
100
+
101
+ ## Примеры
102
+
103
+ Представленный ниже скрипт позволит запустить все имеющиеся миграции в файлах `App.tsx` и `Main.tsx` в папке `src`:
104
+
105
+ ```shell
106
+ npx @vkontakte/vkui-codemods --path src/App.tsx src/Main.tsx --all
107
+ ```
108
+
109
+ Следующий скрипт запустит миграции компонентов `Flex` и `Separator` при обновлении на версию VKUI v7 в текущей директории:
110
+
111
+ ```shell
112
+ npx @vkontakte/vkui-codemods flex separator -tv 7
113
+ ```
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || function (mod) {
30
+ if (mod && mod.__esModule) return mod;
31
+ var result = {};
32
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
33
+ __setModuleDefault(result, mod);
34
+ return result;
35
+ };
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.autoDetectVKUIVersion = autoDetectVKUIVersion;
41
+ var fs_1 = __importDefault(require("fs"));
42
+ var path = __importStar(require("path"));
43
+ var semver = __importStar(require("semver"));
44
+ function findPackageJsonWithVKUI(startDir) {
45
+ var currentDir = startDir;
46
+ while (currentDir !== path.parse(currentDir).root) {
47
+ var packageJsonPath = path.join(currentDir, 'package.json');
48
+ if (fs_1.default.existsSync(packageJsonPath)) {
49
+ var vkuiVersion = getVKUIVersion(packageJsonPath);
50
+ if (vkuiVersion) {
51
+ return packageJsonPath;
52
+ }
53
+ }
54
+ currentDir = path.dirname(currentDir);
55
+ }
56
+ return null;
57
+ }
58
+ function getVKUIVersion(packageJsonPath) {
59
+ var packageJson = JSON.parse(fs_1.default.readFileSync(packageJsonPath, 'utf8'));
60
+ var dependencies = __assign(__assign({}, packageJson.dependencies), packageJson.devDependencies);
61
+ return dependencies['@vkontakte/vkui'];
62
+ }
63
+ function getMajorVersion(version) {
64
+ var parsed = semver.valid(semver.coerce(version));
65
+ return parsed ? semver.major(parsed) : null;
66
+ }
67
+ function autoDetectVKUIVersion() {
68
+ var startDir = process.cwd();
69
+ var packageJsonPath = findPackageJsonWithVKUI(startDir);
70
+ if (packageJsonPath) {
71
+ var vkuiVersion = getVKUIVersion(packageJsonPath);
72
+ if (vkuiVersion) {
73
+ return String(getMajorVersion(vkuiVersion));
74
+ }
75
+ }
76
+ return null;
77
+ }
package/dist/cli.js CHANGED
@@ -9,8 +9,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  var __generator = (this && this.__generator) || function (thisArg, body) {
12
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
13
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
14
  function verb(n) { return function (v) { return step([n, v]); }; }
15
15
  function step(op) {
16
16
  if (f) throw new TypeError("Generator is already executing.");
@@ -40,24 +40,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
40
40
  };
41
41
  Object.defineProperty(exports, "__esModule", { value: true });
42
42
  exports.runCli = void 0;
43
+ var fs_1 = __importDefault(require("fs"));
43
44
  var chalk_1 = __importDefault(require("chalk"));
44
45
  var commander_1 = require("commander");
45
46
  var prompts_1 = __importDefault(require("prompts"));
47
+ var autoDetectVKUIVersion_1 = require("./autoDetectVKUIVersion");
46
48
  var getAvailableCodemods_js_1 = __importDefault(require("./getAvailableCodemods.js"));
47
- var logger_js_1 = __importDefault(require("./helpers/logger.js"));
48
49
  var package_json_1 = __importDefault(require("../package.json"));
49
- var trimStringValue = function (value) {
50
- return typeof value === 'string' ? value.trim() : value;
51
- };
50
+ var logger_js_1 = __importDefault(require("./helpers/logger.js"));
52
51
  var promptAvailableCodemods = function (codemods) { return __awaiter(void 0, void 0, void 0, function () {
53
- var codemod;
52
+ var value;
54
53
  return __generator(this, function (_a) {
55
54
  switch (_a.label) {
56
55
  case 0: return [4 /*yield*/, (0, prompts_1.default)({
57
- type: 'select',
58
- name: 'codemod',
59
- message: 'Pick a codemod',
60
- initial: 0,
56
+ type: 'multiselect',
57
+ name: 'value',
58
+ message: 'Pick codemods',
61
59
  choices: codemods.map(function (name) { return ({ title: name, value: name }); }),
62
60
  }, {
63
61
  onCancel: function () {
@@ -65,23 +63,53 @@ var promptAvailableCodemods = function (codemods) { return __awaiter(void 0, voi
65
63
  },
66
64
  })];
67
65
  case 1:
68
- codemod = (_a.sent()).codemod;
69
- return [2 /*return*/, codemod];
66
+ value = (_a.sent()).value;
67
+ if (value.length === 0) {
68
+ logger_js_1.default.error('No codemods picked.');
69
+ process.exit(1);
70
+ }
71
+ return [2 /*return*/, value];
72
+ }
73
+ });
74
+ }); };
75
+ var promptTransformVersions = function () { return __awaiter(void 0, void 0, void 0, function () {
76
+ var value;
77
+ return __generator(this, function (_a) {
78
+ switch (_a.label) {
79
+ case 0: return [4 /*yield*/, (0, prompts_1.default)({
80
+ type: 'select',
81
+ name: 'value',
82
+ message: 'Pick version',
83
+ choices: [
84
+ { title: 'v6', value: '6' },
85
+ { title: 'v7', value: '7' },
86
+ ],
87
+ }, {
88
+ onCancel: function () {
89
+ process.exit(1);
90
+ },
91
+ })];
92
+ case 1:
93
+ value = (_a.sent()).value;
94
+ return [2 /*return*/, value];
70
95
  }
71
96
  });
72
97
  }); };
73
98
  var runCli = function () { return __awaiter(void 0, void 0, void 0, function () {
74
- var program, options, codemodName, codemods, codemods;
99
+ var program, options, codemods, transformsVersion, availableCodemods, wrongCodemods, _i, codemods_1, codemodName;
75
100
  return __generator(this, function (_a) {
76
101
  switch (_a.label) {
77
102
  case 0:
78
103
  program = new commander_1.Command('@vkontakte/vkui-codemod')
79
104
  .version(package_json_1.default.version || 'unknown')
80
- .argument('[codemod-name]', 'which codemod should be applied', trimStringValue)
81
- .usage("".concat(chalk_1.default.green('[codemod-name]')))
105
+ .argument('[codemod-names...]', 'which codemods should be applied')
106
+ .usage("".concat(chalk_1.default.green('[codemod-names...]')))
82
107
  .option('-l --list', 'list available codemods')
83
108
  .option('--all', 'apply all available codemods')
84
- .option('-p --path <paths>', 'path to files in which to apply the codemods')
109
+ .option('-tv --transforms-version <transformsVersion>', 'vkui major version transforms (available versions: "6", "7")')
110
+ .option('-p --path [paths...]', 'file paths where codemods need to apply (space separated list), default: current directory')
111
+ .option('--input-file <file>', 'apply codemods only to file/directory listed in the file')
112
+ .option('--log-file <file>', 'log migration instructions with required manual changes to the file instead of the console')
85
113
  .option('--dry-run', 'no changes are made to files')
86
114
  .option('--ignore-config <config>', 'ignore files if they match patterns sourced from a configuration file (e.g. a .gitignore)')
87
115
  .option('--debug', "all logs are shown")
@@ -91,22 +119,50 @@ var runCli = function () { return __awaiter(void 0, void 0, void 0, function ()
91
119
  })
92
120
  .parse(process.argv);
93
121
  options = program.opts();
94
- codemodName = program.args[0];
122
+ codemods = program.processedArgs[0];
123
+ transformsVersion = options.transformsVersion || (0, autoDetectVKUIVersion_1.autoDetectVKUIVersion)();
124
+ if (!!transformsVersion) return [3 /*break*/, 2];
125
+ return [4 /*yield*/, promptTransformVersions()];
126
+ case 1:
127
+ transformsVersion = _a.sent();
128
+ _a.label = 2;
129
+ case 2:
130
+ availableCodemods = (0, getAvailableCodemods_js_1.default)(transformsVersion);
95
131
  if (options.list) {
96
- codemods = (0, getAvailableCodemods_js_1.default)();
97
- logger_js_1.default.info(codemods);
132
+ logger_js_1.default.info(availableCodemods);
98
133
  process.exit(0);
99
134
  }
100
- if (!(!codemodName && !options.all)) return [3 /*break*/, 2];
101
- codemods = (0, getAvailableCodemods_js_1.default)();
102
- return [4 /*yield*/, promptAvailableCodemods(codemods)];
103
- case 1:
104
- codemodName = _a.sent();
105
- _a.label = 2;
106
- case 2: return [2 /*return*/, {
107
- flags: options,
108
- codemodName: codemodName,
109
- }];
135
+ if (options.inputFile && !fs_1.default.existsSync(options.inputFile)) {
136
+ logger_js_1.default.error("Input file ".concat(options.inputFile, " does not exist."));
137
+ process.exit(1);
138
+ }
139
+ if (codemods.length > 0) {
140
+ wrongCodemods = [];
141
+ for (_i = 0, codemods_1 = codemods; _i < codemods_1.length; _i++) {
142
+ codemodName = codemods_1[_i];
143
+ if (!availableCodemods.includes(codemodName)) {
144
+ wrongCodemods.push(codemodName);
145
+ }
146
+ }
147
+ if (wrongCodemods.length > 0) {
148
+ logger_js_1.default.error("The following codemods doesn't exist: ".concat(wrongCodemods, ". Please check the available codemods by running with --list option"));
149
+ process.exit(1);
150
+ }
151
+ }
152
+ if (!(codemods.length === 0 && !options.all)) return [3 /*break*/, 4];
153
+ return [4 /*yield*/, promptAvailableCodemods(availableCodemods)];
154
+ case 3:
155
+ codemods = _a.sent();
156
+ _a.label = 4;
157
+ case 4:
158
+ if (options.all) {
159
+ codemods = availableCodemods;
160
+ }
161
+ return [2 /*return*/, {
162
+ flags: options,
163
+ codemods: codemods,
164
+ transformsVersion: transformsVersion,
165
+ }];
110
166
  }
111
167
  });
112
168
  }); };
@@ -1,6 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createAttributeManipulator = exports.swapBooleanValue = exports.renameProp = exports.getImportInfo = void 0;
3
+ exports.createAttributeManipulator = exports.removeAttribute = exports.removeProps = void 0;
4
+ exports.getImportInfo = getImportInfo;
5
+ exports.renameImportName = renameImportName;
6
+ exports.renameIdentifier = renameIdentifier;
7
+ exports.renameTypeIdentifier = renameTypeIdentifier;
8
+ exports.renameProp = renameProp;
9
+ exports.renameSubComponent = renameSubComponent;
10
+ exports.swapBooleanValue = swapBooleanValue;
4
11
  var report_1 = require("./report");
5
12
  function getImportInfo(j, file, componentName, alias) {
6
13
  var source = j(file.source);
@@ -15,7 +22,30 @@ function getImportInfo(j, file, componentName, alias) {
15
22
  });
16
23
  return { localName: localImportName };
17
24
  }
18
- exports.getImportInfo = getImportInfo;
25
+ function renameImportName(j, source, componentName, newName, alias, renameOnlyImportedName) {
26
+ source
27
+ .find(j.ImportDeclaration, { source: { value: alias } })
28
+ .find(j.ImportSpecifier, { local: { name: componentName } })
29
+ .forEach(function (path) {
30
+ var newSpecifier = j.importSpecifier(j.identifier(newName), renameOnlyImportedName ? j.identifier(componentName) : j.identifier(newName));
31
+ newSpecifier.importKind = path.value.importKind;
32
+ j(path).replaceWith(newSpecifier);
33
+ });
34
+ }
35
+ function renameIdentifier(j, source, oldName, newName) {
36
+ source.find(j.Identifier, { name: oldName }).forEach(function (path) {
37
+ j(path).replaceWith(j.identifier(newName));
38
+ });
39
+ }
40
+ function renameTypeIdentifier(j, source, oldName, newName) {
41
+ source
42
+ .find(j.TSTypeReference, { typeName: { type: 'Identifier', name: oldName } })
43
+ .forEach(function (path) {
44
+ if (path.node.typeName.type === 'Identifier') {
45
+ path.node.typeName.name = newName;
46
+ }
47
+ });
48
+ }
19
49
  function renameProp(j, source, componentName, renameMap) {
20
50
  var from = Object.keys(renameMap);
21
51
  return source
@@ -30,7 +60,14 @@ function renameProp(j, source, componentName, renameMap) {
30
60
  j(attribute).replaceWith(j.jsxAttribute(j.jsxIdentifier(renameMap[attribute.node.name.name]), attribute.node.value));
31
61
  });
32
62
  }
33
- exports.renameProp = renameProp;
63
+ function renameSubComponent(j, source, componentName, prevSubcomponentName, newSubcomponentName) {
64
+ source
65
+ .find(j.MemberExpression, {
66
+ object: { name: componentName },
67
+ property: { name: prevSubcomponentName },
68
+ })
69
+ .replaceWith(j.memberExpression(j.identifier(componentName), j.identifier(newSubcomponentName)));
70
+ }
34
71
  function swapBooleanValue(api, source, componentName, previousPropName, currentPropName) {
35
72
  var j = api.jscodeshift;
36
73
  source
@@ -55,7 +92,42 @@ function swapBooleanValue(api, source, componentName, previousPropName, currentP
55
92
  }
56
93
  });
57
94
  }
58
- exports.swapBooleanValue = swapBooleanValue;
95
+ var removeProps = function (j, api, source, componentName, propsNames, createReportMessage) {
96
+ if (createReportMessage === void 0) { createReportMessage = function () { return ''; }; }
97
+ var needToShowReport = false;
98
+ source
99
+ .find(j.JSXElement, {
100
+ openingElement: {
101
+ name: {
102
+ name: componentName,
103
+ },
104
+ },
105
+ })
106
+ .forEach(function (path) {
107
+ var attributes = path.node.openingElement.attributes;
108
+ var newAttributes = attributes === null || attributes === void 0 ? void 0 : attributes.filter(function (attr) {
109
+ if (attr.type === 'JSXAttribute') {
110
+ var attrName = attr.name ? attr.name.name : null;
111
+ if (typeof attrName === 'string') {
112
+ return !propsNames.includes(attrName);
113
+ }
114
+ }
115
+ if (attr.type === 'JSXSpreadAttribute') {
116
+ needToShowReport = true;
117
+ }
118
+ return false;
119
+ });
120
+ path.node.openingElement.attributes = newAttributes;
121
+ });
122
+ if (needToShowReport) {
123
+ (0, report_1.report)(api, ": ".concat(componentName, " has been changed. Manual changes required: ").concat(createReportMessage()));
124
+ }
125
+ };
126
+ exports.removeProps = removeProps;
127
+ var removeAttribute = function (attributes, attribute) {
128
+ attributes === null || attributes === void 0 ? void 0 : attributes.splice(attributes === null || attributes === void 0 ? void 0 : attributes.indexOf(attribute), 1);
129
+ };
130
+ exports.removeAttribute = removeAttribute;
59
131
  var createAttributeManipulator = function (props, api) {
60
132
  var map = new Map(Object.entries(props));
61
133
  return {
@@ -1,10 +1,35 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
27
  };
5
28
  Object.defineProperty(exports, "__esModule", { value: true });
6
29
  exports.TRANSFORM_DIR = void 0;
30
+ exports.default = getAvailableCodemods;
7
31
  var fs_1 = __importDefault(require("fs"));
32
+ var path = __importStar(require("path"));
8
33
  exports.TRANSFORM_DIR = "".concat(__dirname, "/transforms");
9
34
  var CODEMODS = [];
10
35
  var swapElementsOfArray = function (a, b, array) {
@@ -16,15 +41,17 @@ var swapElementsOfArray = function (a, b, array) {
16
41
  array[b] = valueA;
17
42
  array[a] = valueB;
18
43
  };
19
- function getAvailableCodemods(dirname) {
44
+ function getAvailableCodemods(version, dirname) {
20
45
  if (dirname === void 0) { dirname = exports.TRANSFORM_DIR; }
21
46
  if (CODEMODS.length === 0) {
47
+ var transformsPath = path.join(dirname, "v".concat(version));
22
48
  CODEMODS = fs_1.default
23
- .readdirSync(dirname)
49
+ .readdirSync(transformsPath)
24
50
  .filter(function (fname) { return fname.endsWith('.js') || fname.endsWith('.ts'); })
25
51
  .map(function (fname) { return fname.slice(0, -3); });
26
- swapElementsOfArray(CODEMODS.findIndex(function (fname) { return fname === 'text-tooltip'; }), CODEMODS.findIndex(function (fname) { return fname === 'tooltip'; }), CODEMODS);
52
+ if (version === '6') {
53
+ swapElementsOfArray(CODEMODS.findIndex(function (fname) { return fname === 'text-tooltip'; }), CODEMODS.findIndex(function (fname) { return fname === 'tooltip'; }), CODEMODS);
54
+ }
27
55
  }
28
56
  return CODEMODS;
29
57
  }
30
- exports.default = getAvailableCodemods;