@astral/code-gen
v1.4.2
Published
Пакет содержит инструменты для генерации кода.
Readme
Code Gen
Пакет содержит инструменты для генерации кода.
Install
npm install @astral/code-genОбщего назначения
Парсинг карты импортов для npm пакета
getPackageImportsMap позволяет построить карту импортов для npm пакета по его package.json exports.
Пример:
package.json:
{
"exports": {
"./components/*": "./components/*/public.ts"
}
}Скрипт:
const { getPackageImportsMap } = require('@astral/code-gen/getPackageImportsMap');
const exportMap = await getPackageImportsMap({ packageName: '@astral/ui' });Результат:
{
Button: {
path: '@astral/ui/Button',
isType: false
}
}Замена импортов
replaceImports позволяет заменить импорты и реэкспорты в проекте согласно списку замен.
Пример: заменить импорты из '@local/shared' на '#shared':
const { replaceImports } = require('@astral/code-gen/replaceImports');
replaceImports({
project: project,
replacements: [{ old: '@local/shared', new: '#shared' }],
});Результат:
import { Button } from '@actual/shared'; -> import { Button } from '#shared';
import { Button } from '@actual/shared/components'; -> import { Button } from '#shared/components';
Отказ от barrel файлов (index.ts)
После выполнения каждого скрипта необходимо запускать проверку типов и исправлять ошибки вручную.
Рефакторинг shared директории
Перед выполнением скрипта необходимо обновить все @astral/ пакеты до последней версии.*
refactorShared позволяет рефакторить shared директорию:
- Изменяет moduleResolution на bundler в tsconfig.json
- Добавляет wildcard paths для shared директории в tsconfig.json
- Заменяет все импорты из astral пакетов из index.ts на новые пути (@astral/ui -> @astral/ui/Button)
- Заменяет импорты из shared/index.ts на новые пути (#shared -> #shared/components/Button)
- Трансформирует external.ts файлы на отдельные файлы экспорты и заменяет импорты на новые пути
- Перемещает содержимое shared/ui директории в shared директорию
- Переименовывает shared/_tests в shared/tests и обновляет все импорты во всём проекте
Пример:
const { refactorShared } = require('@astral/code-gen/abandonBarrel/refactorShared');
refactorShared();После выполнения скрипта необходимо следовать инструкциям, указанным в консоли.
Настройка VSCode для правильного autocomplete импортов
Чтобы VSCode правильно подсказывал импорты при отказе от barrel файлов, добавьте в .vscode/settings.json:
{
"typescript.preferences.autoImportFileExcludePatterns": [
"@astral/**",
"@mui/material",
"@mui/material/**"
]
}Это предотвратит автоимпорт из библиотек, которые реэкспортируются из shared и заставит VSCode предлагать прямые импорты из конкретных файлов.
Рефакторинг modules директории
refactorModules рефакторит структуру директории modules:
- Удаляет и трансформирует
external.tsфайлы в модулях - Отказывается от barrel-файлов
- Помечает приватные features и domain:
- Ищет импорты по всему проекту (в т.ч. по paths из tsconfig, например
#desktop/modules/...) - Фичи/домены, используемые только внутри своего модуля, переименовываются с префиксом
_(Button → _Button)
- Ищет импорты по всему проекту (в т.ч. по paths из tsconfig, например
Пример:
const { refactorModules } = require('@astral/code-gen/abandonBarrel/refactorModules');
refactorModules();После выполнения найдите в коде "TODO: code-gen" и исправьте вручную описанные проблемы.
Рефакторинг screens директории
refactorScreens рефакторит структуру директории screens:
- Заменяет импорты из
screens/index.tsна импорты из конкретных файлов экранов - Отказывается от barrel-файла
screens/index.ts
Пример:
const { refactorScreens } = require('@astral/code-gen/abandonBarrel/refactorScreens');
refactorScreens();Рефакторинг api директории
refactorApi выполняет комплексный рефакторинг структуры api директории:
- Находит api директорию и endpoints в ней
- Извлекает
dto.ts,enums.ts,constants.tsиз каждой директории endpoints - Перемещает их в
api/dto - Переименовывает
endpointsв_endpointsи обновляет все импорты - Переименовывает
_fakersвfakers
Пример:
const { refactorApi } = require('@astral/code-gen/abandonBarrel/refactorApi');
refactorApi();После выполнения найдите в коде "TODO: code-gen" и исправьте вручную описанные проблемы.
Переименование shared/_tests в shared/tests
renameSharedTests переименовывает директорию shared/_tests в shared/tests и обновляет все импорты во всём проекте:
- Находит директорию shared в проекте
- Переименовывает
_testsнаtests - Обновляет все импорты, которые ссылаются на эту директорию
Пример:
const { renameSharedTests } = require('@astral/code-gen/abandonBarrel/renameSharedTests');
renameSharedTests();Arch Code Gen
Генерация api слоя из data
Что делает:
- Формирует endpoints из sources
- Объединяет типы в sources dto.ts в namespaces + переименовывает типы, удаляя лишние постфиксы
- Находит все места использования и изменяет названия, обращения через namespace
- Переименовывает namespace, удаляя постфиксы NetworkSources. Находит все места использования и изменяет их
- Перемещает fakers из sources в api/_fakers, вместе с utils
- Находит места использования и изменяет импорты
- Генерирует fetchers на основе endpoints
- Перемещает enums.ts и types.ts из data и sources в api
- Помечает все Repositories как deprecated
Подготовка
Перед запуском codemod необходимо:
- Создать в api services директорию и сделать экспорт из нее http сервисов и cacheService
- Переименовать в data/sources директории и файлы, которые не соответсвуют паттерну с окончанием "NetworkSources"
Базовое использование
Подходит, если в проекте нет actual директории.
Создайте в корне проекта или подпроекта монорепы файл:
codemod.js
const { migrateManualDataToApiLayer } = require('@astral/code-gen');
migrateManualDataToApiLayer({ projectPrefix: 'wr' });node codemodeИспользование с actual директорией
const { migrateManualDataToApiLayer } = require('@astral/code-gen');
migrateManualDataToApiLayer({ projectPrefix: 'wr', useActualDirectory: true });node codemodeИспользование с импортом sources в modules
Если в проекте нарушены архитектурные границы и sources использовались в modules:
const { migrateManualDataToApiLayer } = require('@astral/code-gen');
migrateManualDataToApiLayer({
projectPrefix: 'wr',
useActualDirectory: true,
useSourcesOutData: true
});