https://github.com/max36895/control-replacer
Скрипт, предназначенный для переименовывания или переноса контролов, а также для замены прочих вхождений
https://github.com/max36895/control-replacer
Last synced: 4 months ago
JSON representation
Скрипт, предназначенный для переименовывания или переноса контролов, а также для замены прочих вхождений
- Host: GitHub
- URL: https://github.com/max36895/control-replacer
- Owner: max36895
- Created: 2023-01-28T09:18:40.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2024-03-29T15:46:29.000Z (about 1 year ago)
- Last Synced: 2024-12-27T00:41:34.477Z (6 months ago)
- Language: TypeScript
- Homepage:
- Size: 194 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Скрипт для автозамены
Скрипт предназначен для замены всех вхождений контролов, когда они переносятся из одного модуля в другой, либо
переименовывается. Также скрипт позволяет переносить утилиты, переименовать опцию у контрола, переименовать/удалить css
переменную или класс, а также позволяет передать свою настройку для замены.Также есть возможность исправить проблему, когда был
запущен [скрипт массовой обработки git-репозиториев](https://wi.sbis.ru/doc/platform/developmentapl/development-tools/scripts/)
, но по какой-то причине ему не удалось запушить изменения. И при повторном запуске скрипта, ничего не происходило.
Чтобы исправить эту проблему, нужно запустить скрипт с флагом `fixCommit`Готовый скрипт можно скачать из репозитория, либо собрать самому. Для этого нужно скачать проект, выполнить `npm i`
и `npm run build`## Как работает
Необходимо запустить файл `dist/replacer.js`, а также подготовить json файл с настройкой.
### Запуск скрипта
Переименовывания контролов:
```bash
node replacer.js config.json
```Переименовывания опций контрола:
```bash
node replacer.js replaceOpt config.json
```Переименовывания css переменных или классов:
```bash
node replacer.js cssReplace config.json
```Свое переименование:
```bash
node replacer.js customReplace config.json
```Сброс правок, на случай если скрипт запущен ошибочно, либо с некорректным config.json:
```bash
node replacer.js resetGit config.json
```Сброс коммита, на случай когда нужно перезапустить скрипт для создания mr:
```bash
node replacer.js fixCommit config.json
```## JSON файл настроек
### Описание
#### Описание файла конфигурации для переименовывания контролов:
Если модуль полностью переносится, то можно использовать сокращенную запись для module и controls[i].newModuleName, указав /\* в конце. Например Name переносится в Controls-Name, тогда module: "Name/\*", а controls[i].newModuleName: "Controls-Name/\*"
```json
{
"path": "Путь к репозиториям, где нужно выполнить замену",
"replaces": [
{
"module": "Текущее имя модуля",
"newModule": "Новое имя модуля. Стоит указывать когда весь модуль со всеми контролами переносится",
"controls": [
{
"name": "Текущее имя контрола",
"newName": "Новое имя контрола. Если контрол не переименовывается, то свойство указывать не нужно",
"newModuleName": "Новое имя модуля. Стоит указывать если из модуля выносится 1 определенный контрол"
}
]
}
],
"maxFileSize": "Максимальный размер файла. По умолчанию 50"
}
```#### Описание файла конфигурации для переименовывания опций:
```json
{
"path": "Путь к репозиториям, где нужно выполнить замену",
"replaces": [
{
"thisOpt": "Текущее имя опции",
"newOpt": "Новое имя опции",
"module": "Имя модуля, для которого нужно осуществить переименовывание",
"control": "Имя контрола, в котором нужно переименовать опцию"
}
],
"maxFileSize": "Максимальный размер файла. По умолчанию 50"
}
```#### Описание файла конфигурации для переименовывания css переменных или классов:
```json
{
"path": "Путь к репозиториям, где нужно выполнить замену",
"replaces": [
{
"varName": "Текущее имя переменной или класса. Важно указывать имя css переменной полностью(--css-var), а класс указывать с '.'",
"newVarName": "Новое имя переменной или класса",
"isRemove": "Класс или переменная полностью удаляется"
}
],
"maxFileSize": "Максимальный размер файла. По умолчанию 50"
}
```#### Описание файла конфигурации для пользовательского переименовывания:
```json
{
"path": "Путь к репозиториям, где нужно выполнить замену",
"replaces": [
{
"reg": "Регулярное выражение",
"flag": "Флаг для регулярного выражения. По умолчанию g",
"replace": "То как производится замена",
"scriptPath": "Путь до пользовательского скрипта"
}
],
"maxFileSize": "Максимальный размер файла. По умолчанию 50"
}
```При кастомной замене стоит правильно указывать значение в replace. Замена осуществляется следующим образом:
```js
str.replace(new RegExp(congig.reg, config.flag || "g"), config.replace);
```Если нужно выполнить какое-то свое преобразование, то можно в `scriptPath` передать путь до своего скрипта. Скрипт
должен быть следующего вида:```ts
interface ICustomScriptParam {
path: string; // Полный путь до файла
file: string; // Имя файла с расширением
fileContent: string; // Содержимое файла
}interface ICustomScriptResult {
status: boolean; // Статус выполнения скрипта. Если вернется true, то значение файла перезапишется на значение в result
result?: string; // Новое содержимое файла
error?: string; // Ошибки найденные при обработке файла
}export function run(param: ICustomScriptParam): ICustomScriptResult {
return {
status: true,
result: 'Результат работы скрипта'
};
}
```#### Для режимов resetGit и fixCommit, можно указать любой их указанных выше файлов конфигурации, либо создать отдельный. Важно чтобы в файле было указано поле `path`.
### Примеры файлов конфигурации
Замена утилиты `Controls/utils:oldUtil` на `Controls/newUtils:newUtil`
```json
{
"path": "",
"replaces": [
{
"module": "Controls/utils",
"controls": [
{
"name": "oldUtils",
"newName": "newUtil",
"newModuleName": "Controls/newUtils"
}
]
}
]
}
```Перенос всего модуля из одного места в другое. Например: `Name/*` в `Controls-Name/*`
```json
{
"path": "",
"replaces": [
{
"module": "Name/*",
"controls": [
{
"name": "",
"newModuleName": "Controls-Name/*"
}
]
}
]
}
```Перенос отдельных частей модуля из одного места в другое. Например: `Name/Input` в `Controls-Name/Input`
```json
{
"path": "",
"replaces": [
{
"module": "Name/Input",
"controls": [
{
"name": "*",
"newModuleName": "Controls-Name/Input"
}
]
}
]
}
```Замена `Controls/buttons:ArrowButton` на `Controls/extButtons:ArrowButton`
```json
{
"path": "",
"replaces": [
{
"module": "Controls/buttons",
"controls": [
{
"name": "ArrowButton",
"newModuleName": "Controls/extButtons"
}
]
}
]
}
```Замена `Controls/toggle:Tumbler` на `Controls/toggle:NewTumbler`
```json
{
"path": "",
"replaces": [
{
"module": "Controls/toggle",
"controls": [
{
"name": "Tumbler",
"newName": "NewTumbler"
}
]
}
]
}
```Замена `Controls/list:Button` на `Controls-button/list:Button`
```json
{
"path": "",
"replaces": [
{
"module": "Controls/list",
"controls": [
{
"name": "Button",
"newModuleName": "Controls-button/list"
}
]
}
]
}
```Замена `Controls/toggle:Tumbler` на `Controls-toggle/Tumbler`. Обратите внимание на `newName`, если свойство не
указывать, то произойдет переименование модуля(`Controls-toggle/Tumbler:Tumbler`), но при указании пустой строки,
контрол подключается как модуль.```json
{
"path": "",
"replaces": [
{
"module": "Controls/toggle",
"controls": [
{
"name": "Tumbler",
"newName": "",
"newModuleName": "Controls-toggle/Tumbler"
}
]
}
]
}
```Замена опции `myClassName` на `className` у контрола `Controls/toggle:Toggle`
```json
{
"path": "",
"replaces": [
{
"thisOpt": "myClassName",
"newOpt": "className",
"module": "Controls/toggle",
"control": "Toggle"
}
]
}
```Замена css переменной `--oldName` на `--newName`
```json
{
"path": "",
"replaces": [
{
"varName": "--oldName",
"newVarName": "--newName"
}
]
}
```Замена css класса `oldClassName` на `newClassName`
```json
{
"path": "",
"replaces": [
{
"varName": ".oldClassName",
"newVarName": ".newClassName"
}
]
}
```### Дополнительно
Важно чтобы в module и newModuleName разделение было сделано через `/` иначе возможна некорректная работа. Также
в `controls` можно не указывать newName и newModuleName, в таком случае значения поставятся из name и module. При этом,
одно из значений должно быть заполнено, иначе скрипт посчитает что правки не нужны и завершит работу.Подобное сделано для удобства, когда переименовывается только модуль или контролл.
При использовании кастомной замены, перепроверьте получаемый результат в консоли, и только после этого запускайте
скрипт. В противном случае можно получить не тот результат, который ожидался, и придется откатывать изменения.## Что корректно работает
Скрипт автоматически вносит правки в wml файлы. А также может вносить правки в ts, tsx и другие файлы.
Корректно обрабатываются следующие сценарии:
```js
import { Tumbler } from "Controls/toggle";;
``````js
import { Tumbler as View } from "Controls/toggle";;
``````js
import { default as toggle } from "Controls/toggle";;
``````js
import {Tumbler, Switch} from 'Controls/toggle';```
Если из исходной библиотеки выносится 1 контрол, то скрипт сам создаст или найдет нужный импорт, и поместит туда новый
контролПри переименовывании css переменных или классов корректно отрабатываются все случаи связанные с переменными. Также если
указан isRemove=true, то определение переменной удалится.## Что нестабильно работает с заменой контролов
Сейчас есть проблемы с импортом следующего вида:
```js
import * as toggle from "Controls/toggle";
```Скрипт самостоятельно не сможет обработать подобные сценарии, на что кинет ошибку. Но при этом скрипт сможет внести
правки по использованию контрола, и заменит```js
```
на
```js
```
Скрипт не тронет сам импорт, так как не знает как нужно его заменить. Если вы полностью переносите весь модуль, то можно
указать это название в `replaces.newModule`, в таком случае скрипт заменит импорт для модуля. Свойство стоит
использовать тогда, когда полностью переименовывается модуль, в противном случае скрипт отработает некорректно.Также если контрол использовался так `Controls.LoadingIndicator`, а нужно превратить его в `Controls.loading:Indicator`,
то скрипт самостоятельно не сможет подобное обработать, а любая попытка провернуть подобное может обернуться ошибками.
Возможно, когда-то подобный функционал появится, но на данный момент в нем нет необходимости.При переносе модуля, когда используется конструкции с указанием в имени модуля "/\*", и указанием нового имени контрола, произойдет переименовывание самого модуля, старое имя контрола при этом не заменится.
## Что не корректно работает с переименовыванием опций
Скрипт не сможет обработать случаи, когда контрол вставляется в другой контрол в качестве шаблона с передачей опций.
```js
```
и
```js
```
Также не отработают случай с использованием spread оператора
```js
```
## Что не корректно работает с переименовыванием классов
Скрипт корректно отрабатывает все случаи с заменой классов. Но могут возникнуть сложности, когда isRemove=true. Скрипт
не сможет корректно отработать в следующих конструкциях:```css
.myClass .removeClass {
. . .
}
```и
```less
.removeClass {
/* ... */.template {
/* ... */
}
}
```Данные конструкции скрипт пропустит, но выкинет ошибку, чтобы можно было вручную внести правку. Все остальные
конструкции отрабатывают корректно.## Дополнительно
Через скрипт можно переименовывать различные утилиты, но есть вероятность что будет проблемы в редких случаях(см "Что
работает нестабильно").Скрипт проходится по всем файлам в директории, но не смотрит файлы больше 50mb, но можно настроить другое ограничение
используя `maxFileSize`(не рекомендуется устанавливать большие значения)О найденных проблемах или идеях по улучшению можно
писать [мне](https://online.sbis.ru/person/5bf5b206-a664-422b-b5e2-41217142717a)