@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.
- package/README.md +69 -21
- package/dist/autoDetectVKUIVersion.js +77 -0
- package/dist/cli.js +86 -30
- package/dist/codemod-helpers.js +76 -4
- package/dist/getAvailableCodemods.js +31 -4
- package/dist/index.js +57 -64
- package/dist/report.js +1 -2
- package/dist/testHelpers/testHelper.js +3 -3
- package/dist/transforms/{accordion.js → v6/accordion.js} +3 -3
- package/dist/transforms/{action-sheet-item.js → v6/action-sheet-item.js} +2 -2
- package/dist/transforms/{action-sheet.js → v6/action-sheet.js} +3 -3
- package/dist/transforms/{alert.js → v6/alert.js} +2 -2
- package/dist/transforms/{appearance-provider.js → v6/appearance-provider.js} +2 -2
- package/dist/transforms/{banner.js → v6/banner.js} +3 -3
- package/dist/transforms/{calendar-range.js → v6/calendar-range.js} +2 -2
- package/dist/transforms/{calendar.js → v6/calendar.js} +2 -2
- package/dist/transforms/{card-scroll.js → v6/card-scroll.js} +2 -2
- package/dist/transforms/{chip.js → v6/chip.js} +2 -2
- package/dist/transforms/{chips-input.js → v6/chips-input.js} +2 -2
- package/dist/transforms/{config-provider.js → v6/config-provider.js} +2 -2
- package/dist/transforms/{content-card.js → v6/content-card.js} +2 -2
- package/dist/transforms/{custom-scroll-view.js → v6/custom-scroll-view.js} +3 -3
- package/dist/transforms/{date-input.js → v6/date-input.js} +2 -2
- package/dist/transforms/{date-range-input.js → v6/date-range-input.js} +2 -2
- package/dist/transforms/{fixed-layout.js → v6/fixed-layout.js} +2 -2
- package/dist/transforms/{forbid-imports.js → v6/forbid-imports.js} +2 -2
- package/dist/transforms/{form-item.js → v6/form-item.js} +2 -2
- package/dist/transforms/{form-layout.js → v6/form-layout.js} +3 -3
- package/dist/transforms/{gallery.js → v6/gallery.js} +2 -2
- package/dist/transforms/{gradient-prop-change.js → v6/gradient-prop-change.js} +3 -3
- package/dist/transforms/{image-base.js → v6/image-base.js} +2 -2
- package/dist/transforms/{modal-card.js → v6/modal-card.js} +3 -3
- package/dist/transforms/{modal-page-header.js → v6/modal-page-header.js} +2 -2
- package/dist/transforms/{pagination.js → v6/pagination.js} +3 -3
- package/dist/transforms/{panel-header-content.js → v6/panel-header-content.js} +3 -3
- package/dist/transforms/{panel-header.js → v6/panel-header.js} +3 -3
- package/dist/transforms/{placeholder.js → v6/placeholder.js} +2 -2
- package/dist/transforms/{popout-wrapper.js → v6/popout-wrapper.js} +3 -3
- package/dist/transforms/{popover.js → v6/popover.js} +2 -2
- package/dist/transforms/{popper.js → v6/popper.js} +2 -2
- package/dist/transforms/{rich-tooltip.js → v6/rich-tooltip.js} +3 -3
- package/dist/transforms/{search.js → v6/search.js} +2 -2
- package/dist/transforms/{select.js → v6/select.js} +2 -2
- package/dist/transforms/{simple-cell.js → v6/simple-cell.js} +3 -3
- package/dist/transforms/{split-col.js → v6/split-col.js} +2 -2
- package/dist/transforms/{tabbar.js → v6/tabbar.js} +2 -2
- package/dist/transforms/{tappable.js → v6/tappable.js} +3 -3
- package/dist/transforms/{text-tooltip.js → v6/text-tooltip.js} +2 -2
- package/dist/transforms/{tooltip-container.js → v6/tooltip-container.js} +2 -2
- package/dist/transforms/{tooltip.js → v6/tooltip.js} +2 -2
- package/dist/transforms/{typography.js → v6/typography.js} +3 -3
- package/dist/transforms/{users-stack.js → v6/users-stack.js} +3 -3
- package/dist/transforms/v7/action-sheet.js +16 -0
- package/dist/transforms/v7/alert.js +16 -0
- package/dist/transforms/v7/appearance-provider.js +35 -0
- package/dist/transforms/v7/appearance.js +45 -0
- package/dist/transforms/v7/banner.js +47 -0
- package/dist/transforms/v7/card-grid.js +16 -0
- package/dist/transforms/v7/card-scroll.js +59 -0
- package/dist/transforms/v7/cell-button.js +49 -0
- package/dist/transforms/v7/cell.js +18 -0
- package/dist/transforms/v7/chips-select.js +20 -0
- package/dist/transforms/v7/common/remapSizePropValue.js +43 -0
- package/dist/transforms/v7/common/swapGapPropElements.js +25 -0
- package/dist/transforms/v7/config-provider.js +136 -0
- package/dist/transforms/v7/content-card.js +21 -0
- package/dist/transforms/v7/custom-scroll-view.js +21 -0
- package/dist/transforms/v7/custom-select.js +20 -0
- package/dist/transforms/v7/flex.js +18 -0
- package/dist/transforms/v7/form-item.js +128 -0
- package/dist/transforms/v7/form-status.js +18 -0
- package/dist/transforms/v7/header.js +28 -0
- package/dist/transforms/v7/horizontal-cell-show-more.js +58 -0
- package/dist/transforms/v7/horizontal-cell.js +16 -0
- package/dist/transforms/v7/horizontal-scroll.js +38 -0
- package/dist/transforms/v7/image-overlay.js +125 -0
- package/dist/transforms/v7/mini-info-cell.js +18 -0
- package/dist/transforms/v7/modal-card.js +29 -0
- package/dist/transforms/v7/onboarding-tooltip.js +16 -0
- package/dist/transforms/v7/panel-header-content.js +16 -0
- package/dist/transforms/v7/placeholder.js +19 -0
- package/dist/transforms/v7/rich-cell.js +20 -0
- package/dist/transforms/v7/screen-spinner.js +61 -0
- package/dist/transforms/v7/scroll-arrow.js +52 -0
- package/dist/transforms/v7/select.js +20 -0
- package/dist/transforms/v7/separator.js +18 -0
- package/dist/transforms/v7/simple-cell.js +18 -0
- package/dist/transforms/v7/simple-grid.js +18 -0
- package/dist/transforms/v7/spacing.js +26 -0
- package/dist/transforms/v7/spinner.js +29 -0
- package/dist/transforms/v7/subnavigation-bar.js +60 -0
- package/dist/transforms/v7/subnavigation-button.js +18 -0
- package/dist/transforms/v7/tabbar-item.js +16 -0
- package/dist/transforms/v7/tooltip.js +16 -0
- package/dist/transforms/v7/typography.js +79 -0
- package/dist/transforms/v7/users-stack.js +50 -0
- package/package.json +7 -7
- package/dist/transforms/{horizontal-cell-show-more.js → v6/horizontal-cell-show-more.js} +1 -1
- package/dist/transforms/{range-slider.js → v6/range-slider.js} +1 -1
- package/dist/transforms/{visually-hidden-input.js → v6/visually-hidden-input.js} +1 -1
package/README.md
CHANGED
|
@@ -1,53 +1,71 @@
|
|
|
1
|
-
# VKUI
|
|
1
|
+
# VKUI Codemods
|
|
2
2
|
|
|
3
3
|
Чтобы упростить переход на новую мажорную версию, можно воспользоваться инструментом по автоматической миграции ваших компонентов.
|
|
4
4
|
|
|
5
|
-
> Для начала обновите ваше приложение до
|
|
5
|
+
> Для начала обновите ваше приложение до необходимой мажорной версии (например, **v7**) в соответствии с требованиями вашего пакетного менеджера и среды.
|
|
6
6
|
|
|
7
|
-
> Обратите внимание, минимальная поддерживаемая версия **React**
|
|
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-
|
|
28
|
+
Usage: @vkontakte/vkui-codemod [codemod-names...]
|
|
25
29
|
|
|
26
30
|
Arguments:
|
|
27
|
-
|
|
31
|
+
codemod-names which codemods should be applied
|
|
28
32
|
|
|
29
33
|
Options:
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
--
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
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
|
-
|
|
63
|
+
### `--ignore-config <file>`
|
|
64
|
+
|
|
65
|
+
Если вы хотите исключить некоторые файлы или директории из обработки, то временно создайте файл (по примеру .gitignore) с перечисленными исключениями в папке:
|
|
48
66
|
|
|
49
67
|
```shell
|
|
50
|
-
npx @vkontakte/vkui-codemods --all --path
|
|
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 в директории `
|
|
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 =
|
|
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
|
|
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
|
|
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: '
|
|
58
|
-
name: '
|
|
59
|
-
message: 'Pick
|
|
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
|
-
|
|
69
|
-
|
|
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,
|
|
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-
|
|
81
|
-
.usage("".concat(chalk_1.default.green('[codemod-
|
|
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('-
|
|
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
|
-
|
|
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
|
-
|
|
97
|
-
logger_js_1.default.info(codemods);
|
|
132
|
+
logger_js_1.default.info(availableCodemods);
|
|
98
133
|
process.exit(0);
|
|
99
134
|
}
|
|
100
|
-
if (
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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
|
}); };
|
package/dist/codemod-helpers.js
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createAttributeManipulator = exports.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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;
|