mdt-module-builder 1.0.4 → 2.1.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.
- package/CHANGELOG.md +58 -0
- package/README.md +51 -15
- package/SHARED-DEPENDENCIES.md +38 -2
- package/package.json +2 -2
- package/src/index.mjs +51 -53
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
Все заметные изменения пакета документируются в этом файле.
|
|
4
|
+
|
|
5
|
+
Формат — [Keep a Changelog](https://keepachangelog.com/ru/1.1.0/), версии — [Semantic Versioning](https://semver.org/lang/ru/).
|
|
6
|
+
Правила major/minor/patch для этого пакета — см. README, раздел «Версионирование»: изменения
|
|
7
|
+
контракта (имя глобала, `SHARED_EXACT`, мажор React, источник Tailwind-классов модуля) — всегда
|
|
8
|
+
major, т.к. потребители фиксируют зависимость через `^1.x` и автоматически подхватят любой minor/patch.
|
|
9
|
+
|
|
10
|
+
## [Unreleased]
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- В `SHARED_GLOBALS` добавлены 8 спецификаторов (MP-16155): `@tanstack/react-virtual`,
|
|
15
|
+
`@tanstack/react-table`, `@dnd-kit/core`, `@dnd-kit/utilities`, `dnd-timeline`,
|
|
16
|
+
`tailwind-variants`, `react-hook-form`, `zod`. Модуль их больше не бандлит — читает инстанс
|
|
17
|
+
MDT из `globalThis.__mdtShared`.
|
|
18
|
+
Мотив: react-table, dnd-kit, react-hook-form и zod — зависимости самого `ics-ui-kit`, и своя
|
|
19
|
+
копия в модуле давала бы второй `DndContext`/`FormProvider` рядом с ui-kit (тот же класс
|
|
20
|
+
поломки, что две копии React); react-virtual нужен ≥ 2 модулям; `tailwind-variants` тянет
|
|
21
|
+
`tailwind-merge`, который должен быть общим с ui-kit; `dnd-timeline` обязан сидеть на том же
|
|
22
|
+
`@dnd-kit/core`.
|
|
23
|
+
- **Minor, не major.** Обратно совместимо для любого модуля, который эти 8 библиотек не
|
|
24
|
+
импортирует, — для него поведение не меняется вообще. Единственный теоретический риск —
|
|
25
|
+
модуль, который уже импортирует одну из них и рассчитывает на бандлинг: после апгрейда билдера
|
|
26
|
+
тот же импорт станет externalize-иться и на MDT без этого патча (MP-16155) превратится в
|
|
27
|
+
`undefined` без ошибки сборки. Проверено: единственный сегодняшний потребитель билдера
|
|
28
|
+
(`promo-tool`) закреплён на `mdt-module-builder ^1.0.0` и не подхватит эту версию автоматически
|
|
29
|
+
в любом случае; среди модулей, которые реально импортируют что-то из списка выше, ни один не
|
|
30
|
+
собирается билдером на `^2.x`. Риска молчаливой поломки уже работающей сборки нет — поэтому,
|
|
31
|
+
в отличие от 2.0.0, это не major (см. README, §Версионирование, и SHARED-DEPENDENCIES.md,
|
|
32
|
+
«Расширение SHARED_GLOBALS»). Реально начать пользоваться выносом (импортировать что-то из
|
|
33
|
+
списка и рассчитывать на общий инстанс) можно только на MDT с этим патчем.
|
|
34
|
+
|
|
35
|
+
### Removed
|
|
36
|
+
|
|
37
|
+
- Билдер больше не собирает Tailwind CSS модуля (`generateModuleTailwindCss`, `loadIcsPreset` —
|
|
38
|
+
удалены из пакета). Модуль перестаёт вести собственную, независимую Tailwind-сборку — источник
|
|
39
|
+
Tailwind-классов теперь один: курируемый safelist core-сборки MDT (`ui/tailwind-safelist.mjs`).
|
|
40
|
+
Причина — MP-16147: две независимые Tailwind-сборки ломали гарантию порядка CSS-правил
|
|
41
|
+
(`base` перед `variant`), из-за чего голая утилита модуля могла перебить адаптивный вариант
|
|
42
|
+
ui-kit (`.h-10` модуля поверх `.lg:h-9` из `ics-ui-kit`).
|
|
43
|
+
- Зависимость `tailwindcss` убрана из `package.json` — больше не используется пакетом.
|
|
44
|
+
|
|
45
|
+
### Changed
|
|
46
|
+
|
|
47
|
+
- **Ломающее изменение контракта.** Модуль, собранный этой версией, требует MDT с уже подключённым
|
|
48
|
+
курируемым Tailwind-safelist (`safelist` в core-сборке). Классы, которых нет в safelist,
|
|
49
|
+
физически не применятся в рантайме модуля — добавляются в MDT по мере реальной потребности
|
|
50
|
+
(см. `ui/build_tools/tailwind-inventory.md`).
|
|
51
|
+
- Модуль-специфичная стилизация — только обычный CSS (`import "./x.css"`, без изменений в этой
|
|
52
|
+
части — `postcss-nested` + `autoprefixer` как и раньше), не Tailwind-утилиты.
|
|
53
|
+
|
|
54
|
+
## Версии до 2.0.0
|
|
55
|
+
|
|
56
|
+
Пакет публиковался (`npm run release`, без git-тега) без чейнджлога — история 1.0.0…1.0.4 не
|
|
57
|
+
восстановлена задним числом (нет надёжного источника: релизы не коммитятся в git). Ведение
|
|
58
|
+
чейнджлога начинается с этой версии.
|
package/README.md
CHANGED
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
модуля, выдавая **тот же по контракту артефакт**: один `dist/index.js` (IIFE), который при загрузке
|
|
5
5
|
через `<script>` самовыполняется и зовёт `window.MDT.registerModule`.
|
|
6
6
|
|
|
7
|
+
История изменений — [CHANGELOG.md](./CHANGELOG.md).
|
|
8
|
+
|
|
7
9
|
## Использование
|
|
8
10
|
|
|
9
11
|
В `package.json` модуля:
|
|
@@ -11,7 +13,7 @@
|
|
|
11
13
|
```json
|
|
12
14
|
{
|
|
13
15
|
"scripts": { "build": "mdt-module-build" },
|
|
14
|
-
"devDependencies": { "mdt-module-builder": "^
|
|
16
|
+
"devDependencies": { "mdt-module-builder": "^2.0.0" },
|
|
15
17
|
"dependencies": { "mdt-client": "^31", "ics-ui-kit": "...", "lucide-react": "..." },
|
|
16
18
|
"peerDependencies": { "react": "^19", "react-dom": "^19" }
|
|
17
19
|
}
|
|
@@ -27,9 +29,14 @@ devtool/builder вызывают `npm run build` в репе модуля — м
|
|
|
27
29
|
Заменяются alias-шимами, читающими `globalThis.__mdtShared[spec]` (MDT ставит его при старте).
|
|
28
30
|
→ один инстанс React во всём рантайме, нет «Invalid hook call».
|
|
29
31
|
→ react/react-dom **не обязаны быть установлены** при сборке (имена их экспортов зашиты в пакет).
|
|
30
|
-
- **`SHARED_GLOBALS`** (`@tanstack/react-query`, `zustand` + подпути, `echarts`, `echarts-for-react
|
|
32
|
+
- **`SHARED_GLOBALS`** (`@tanstack/react-query`, `zustand` + подпути, `echarts`, `echarts-for-react`,
|
|
33
|
+
`@tanstack/react-virtual`, `@tanstack/react-table`, `@dnd-kit/core`, `@dnd-kit/utilities`,
|
|
34
|
+
`dnd-timeline`, `tailwind-variants`, `react-hook-form`, `zod`)
|
|
31
35
|
— НЕ бандлятся: externalize + чтение `globalThis.__mdtShared[spec]`. В отличие от react-семьи,
|
|
32
|
-
имена экспортов перечислять не нужно.
|
|
36
|
+
имена экспортов перечислять не нужно. Полный список с версиями и обоснованием, а также порядок
|
|
37
|
+
выноса новой такой зависимости — см. [SHARED-DEPENDENCIES.md](./SHARED-DEPENDENCIES.md).
|
|
38
|
+
Перечислены только корневые спецификаторы (кроме `zustand`): сабпас — отдельный спецификатор,
|
|
39
|
+
добавляется по факту потребности модуля, не «про запас».
|
|
33
40
|
- **ics-ui-kit** (сам пакет и любой сабпас — `ics-ui-kit/components/*`, `ics-ui-kit/lib/*`, …) —
|
|
34
41
|
НЕ бандлится: externalize по префиксу (`SHARED_PREFIXES`) + чтение `globalThis.__mdtShared[spec]`.
|
|
35
42
|
Сабпасы перечислять не нужно. MDT кладёт туда свой инстанс (vite-app `legacy/shared-ui-kit.ts`),
|
|
@@ -45,11 +52,15 @@ devtool/builder вызывают `npm run build` в репе модуля — м
|
|
|
45
52
|
тянет только used-иконки (единицы, ~КБ). Пара дублей по модулям несравнимо дешевле, чем вся lucide в MDT.
|
|
46
53
|
- **CSS** инлайнится в `index.js` (рантайм-инъекция `<style>`), как старый style-loader —
|
|
47
54
|
оверлей копирует только `index.js`, отдельного `.css` нет.
|
|
48
|
-
- **Tailwind
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
55
|
+
- **Tailwind модуль больше не собирает** (с версии 2.0.0, MP-16147). Раньше билдер сам генерил
|
|
56
|
+
утилиты Tailwind из `src` модуля второй, независимой сборкой — это ломало гарантию порядка
|
|
57
|
+
правил (`base` перед `variant`), на которой держится mobile-first: голая утилита модуля могла
|
|
58
|
+
перебить вариант ui-kit (`.h-10` модуля поверх `.lg:h-9` из `ics-ui-kit`). Теперь Tailwind-классы
|
|
59
|
+
модулю даёт единственная, core-сборка MDT — по курируемому `tailwind-safelist.mjs`
|
|
60
|
+
(собран из реально используемых модулями классов, см. `tailwind-inventory.mjs`). Класс, которого
|
|
61
|
+
нет в safelist, физически не применится в рантайме — не задача сборки, а несовпадение safelist;
|
|
62
|
+
добавляется в MDT по мере реальной потребности. Модуль-специфичная стилизация — обычный CSS
|
|
63
|
+
(`import "./x.css"`, см. ниже), не Tailwind.
|
|
53
64
|
|
|
54
65
|
## Совместимость исходников модуля (webpack → Vite)
|
|
55
66
|
|
|
@@ -61,7 +72,12 @@ devtool/builder вызывают `npm run build` в репе модуля — м
|
|
|
61
72
|
маппинга; `prefix/*` → wildcard с захватом хвоста, точный ключ → строковый алиас.
|
|
62
73
|
- **CSS-вложенность.** Компонентный CSS модуля (`import "./x.css"`) прогоняется через
|
|
63
74
|
`postcss-nested` (Sass-подобный `&`) + `autoprefixer` — та же семантика, что у старого
|
|
64
|
-
`postcss-loader`. Native CSS nesting не задействуется.
|
|
75
|
+
`postcss-loader`. Native CSS nesting не задействуется.
|
|
76
|
+
- **CSS-модули работают** — `import styles from "./x.module.css"` даёт хешированные имена
|
|
77
|
+
(`.loadsTable` → `._loadsTable_1brdq_1`) и объект-маппинг, `postcss-nested` внутри тоже работает.
|
|
78
|
+
Это **предпочтительный** способ модуль-специфичной стилизации: имена не надо придумывать
|
|
79
|
+
уникальными, коллизия с core/ui-kit невозможна by construction (обычный `.css` инжектится
|
|
80
|
+
как есть, и generic-имя вроде `.card` вполне может столкнуться с чужим).
|
|
65
81
|
- **`.svg` как строка.** SVG импортится встроенным Vite-суффиксом `?raw`
|
|
66
82
|
(`import logo from "./logo.svg?raw"`) → строка с разметкой, инлайнится, без отдельного ассет-файла.
|
|
67
83
|
Байт-в-байт как старый `svg-inline-loader`. Билдер SVG специально не обрабатывает: **bare**-импорт
|
|
@@ -115,19 +131,39 @@ MDT-сторона контракта — `ui/vite-app/src/legacy/config-global.
|
|
|
115
131
|
|
|
116
132
|
SemVer пакета относительно платформы:
|
|
117
133
|
|
|
118
|
-
- **major** —
|
|
119
|
-
|
|
120
|
-
|
|
134
|
+
- **major** — изменение, которое молча ломает уже существующий, никак не менявшийся код модуля
|
|
135
|
+
при обычном (не ручном) апгрейде: имя глобала, переименование/удаление ключа в
|
|
136
|
+
`SHARED_EXACT`/`SHARED_GLOBALS`/`SHARED_PREFIXES`, мажор React (обновляются `SHARED_NAMES`),
|
|
137
|
+
изменение источника Tailwind-классов модуля. Модули осознанно поднимают `mdt-module-builder`
|
|
138
|
+
и проверяют совместимость.
|
|
139
|
+
- **minor** — обратно совместимое добавление: новый ключ в `SHARED_GLOBALS`/`SHARED_PREFIXES`
|
|
140
|
+
(библиотека, которую раньше никто не шарил, начинает шариться), новая опция сборки и т.п.
|
|
141
|
+
Модуль, который эту библиотеку не импортирует, ничего не замечает. Единственный риск —
|
|
142
|
+
модуль, который её уже импортирует и рассчитывает на бандлинг: после апгрейда билдера тот же
|
|
143
|
+
импорт станет externalize-иться, и на MDT без соответствующего патча платформы превратится
|
|
144
|
+
в `undefined` без ошибки сборки. Поэтому перед каждым добавлением в `SHARED_GLOBALS` —
|
|
145
|
+
проверить всех известных потребителей билдера на совместимом диапазоне версий на предмет
|
|
146
|
+
прямого импорта именно этой библиотеки. Нашёлся такой — для НЕЁ это major, а не minor.
|
|
147
|
+
- **patch** — внутренние правки сборки; выходной артефакт остаётся совместимым.
|
|
148
|
+
|
|
149
|
+
Пример применения правила — см. SHARED-DEPENDENCIES.md, «Расширение SHARED_GLOBALS».
|
|
121
150
|
|
|
122
151
|
| mdt-module-builder | React | Платформа MDT |
|
|
123
152
|
|---|---|---|
|
|
124
|
-
| 1.x | 19 |
|
|
153
|
+
| 1.x | 19 | неизвестно — публиковался до введения CHANGELOG.md, надёжного источника нет |
|
|
154
|
+
| 2.x (опубликован 2026-07-27) | 19 | требует MDT с курируемым Tailwind-safelist (`ui/tailwind-safelist.mjs` в `safelist` core-сборки, MP-16147) — модуль больше не собирает свой Tailwind. **Модули должны сами поднять зависимость на `^2.0.0`** — на `^1.0.x` не подхватится автоматически (иначе сломались бы молча, см. CHANGELOG) |
|
|
155
|
+
| 2.1.x (не опубликован) | 19 | всё из 2.x + 8 новых ключей `SHARED_GLOBALS` (MP-16155): react-virtual, react-table, dnd-kit core/utilities, dnd-timeline, tailwind-variants, react-hook-form, zod. **Minor** — обратно совместимо, модули на `^2.0.0` подхватят автоматически; библиотеку в `devDependencies` подтягивают только когда реально начинают её импортировать. Реально начать пользоваться выносом можно только на MDT с этим патчем |
|
|
125
156
|
|
|
126
157
|
## Публикация
|
|
127
158
|
|
|
128
159
|
Публикуется **вручную** в публичный npm (как `mdt-client`), автопубликации в CI нет.
|
|
129
|
-
|
|
130
|
-
|
|
160
|
+
|
|
161
|
+
Перед любым релизом — перенеси `## [Unreleased]` в [CHANGELOG.md](./CHANGELOG.md) в датированную
|
|
162
|
+
секцию `## [x.y.z] - YYYY-MM-DD` (формат [Keep a Changelog](https://keepachangelog.com/ru/1.1.0/)),
|
|
163
|
+
оставив пустой `## [Unreleased]` сверху для следующих изменений.
|
|
164
|
+
|
|
165
|
+
Версию руками в `package.json` не правим для patch — скрипт `release` сам поднимает patch (без
|
|
166
|
+
git-тега) и публикует:
|
|
131
167
|
|
|
132
168
|
```
|
|
133
169
|
cd ui/module-builder
|
package/SHARED-DEPENDENCIES.md
CHANGED
|
@@ -108,6 +108,26 @@ npm i -D <dep>@<версия> # в репозитории модуля; тот
|
|
|
108
108
|
Rollup; после выноса проверь в рантайме, что `X` — это сам компонент, а не неймспейс.
|
|
109
109
|
- **react-семья — особый, исторический случай** (alias-шимы `SHARED_EXACT`/`SHARED_NAMES` с
|
|
110
110
|
перечислением имён). **Новые** зависимости добавляй в `SHARED_GLOBALS` — там имена перечислять не надо.
|
|
111
|
+
- **Вынос отключает tree-shaking в core-сборке.** `import * as _Dep` + запись в `__mdtShared`
|
|
112
|
+
тянет в бандл MDT **весь** пакет, а не используемую часть — модуль обращается к любому члену
|
|
113
|
+
глобала, и отсечь ничего нельзя. Это та же причина, по которой `lucide-react` осознанно НЕ
|
|
114
|
+
выносится (см. README). Замер MP-16155: 8 вынесенных библиотек дали **+356 КБ** минифицированного
|
|
115
|
+
кода в core (18.36 → 18.71 МБ суммарно по JS-ассетам `dist-vite`). Плата разовая и окупается,
|
|
116
|
+
только если библиотекой реально пользуются ≥ 2 модуля или нужен единый инстанс, — поэтому
|
|
117
|
+
Шаг 0 обязателен, а «про запас» не выносим.
|
|
118
|
+
- **Расширение `SHARED_GLOBALS` — обычно minor, а не major.** Новая запись ничего не меняет для
|
|
119
|
+
модуля, который эту библиотеку не импортирует. Единственный реальный риск — модуль, который её
|
|
120
|
+
СЕГОДНЯ импортирует и рассчитывает на бандлинг: после апгрейда билдера тот же импорт станет
|
|
121
|
+
externalize-иться, и на MDT без соответствующего патча платформы превратится в `undefined`
|
|
122
|
+
без ошибки сборки. Поэтому перед каждым добавлением — **шаг 0.5**: проверить всех известных
|
|
123
|
+
потребителей билдера на совместимом диапазоне версий (`^N.x`) на предмет прямого импорта именно
|
|
124
|
+
этой библиотеки. Нашёлся такой — для этого релиза правило переключается на major (см. README,
|
|
125
|
+
§Версионирование).
|
|
126
|
+
Пример (MP-16155): `@tanstack/react-virtual`, `@tanstack/react-table`, `@dnd-kit/core`,
|
|
127
|
+
`@dnd-kit/utilities`, `dnd-timeline`, `tailwind-variants`, `react-hook-form`, `zod` вынесены как
|
|
128
|
+
**2.1.0 (minor)** — единственный на тот момент потребитель билдера (`promo-tool`) сидел на
|
|
129
|
+
`mdt-module-builder ^1.0.0` и не мог подхватить релиз автоматически в любом случае, а среди уже
|
|
130
|
+
собираемых модулей никто из этих библиотек не бандлил при активной зависимости от билдера `^2.x`.
|
|
111
131
|
|
|
112
132
|
---
|
|
113
133
|
|
|
@@ -115,5 +135,21 @@ npm i -D <dep>@<версия> # в репозитории модуля; тот
|
|
|
115
135
|
|
|
116
136
|
- **react-семья** (`SHARED_EXACT`, alias-шимы): `react`, `react-dom`, `react-dom/client`,
|
|
117
137
|
`react/jsx-runtime`, `react/jsx-dev-runtime`.
|
|
118
|
-
-
|
|
119
|
-
|
|
138
|
+
- **Префикс** (`SHARED_PREFIXES`): `ics-ui-kit` и любой его сабпас.
|
|
139
|
+
- **Externalize** (`SHARED_GLOBALS`), только корневые спецификаторы, кроме `zustand`:
|
|
140
|
+
|
|
141
|
+
| спецификатор | версия в MDT | почему вынесена |
|
|
142
|
+
|---|---|---|
|
|
143
|
+
| `@tanstack/react-query` | ^5.101.4 | один `QueryClient`/контекст |
|
|
144
|
+
| `zustand` + `zustand/middleware` + `zustand/react/shallow` | ^5.0.11 | общий стор |
|
|
145
|
+
| `echarts`, `echarts-for-react` | ^5.5.0 / ^3.0.2 | вес (~1 МБ) |
|
|
146
|
+
| `@tanstack/react-virtual` | ^3.14.8 | нужна ≥ 2 модулям |
|
|
147
|
+
| `@tanstack/react-table` | ^8.21.3 | React-контекст, общий с ui-kit |
|
|
148
|
+
| `@dnd-kit/core`, `@dnd-kit/utilities` | ^6.3.1 / ^3.2.2 | `DndContext`, общий с ui-kit |
|
|
149
|
+
| `dnd-timeline` | ^3.1.1 | сидит на общем `@dnd-kit/core` |
|
|
150
|
+
| `tailwind-variants` | ^3.3.0 | общий `tailwind-merge` с ui-kit |
|
|
151
|
+
| `react-hook-form` | ^7.83.0 | `FormProvider`-контекст, общий с ui-kit |
|
|
152
|
+
| `zod` | ^3.25.76 | identity схем для `@hookform/resolvers` |
|
|
153
|
+
|
|
154
|
+
Всё, кроме `@tanstack/react-virtual` и `dnd-timeline`, уже стояло в MDT транзитивно как зависимость
|
|
155
|
+
`ics-ui-kit` — вынос свёлся к подъёму в прямые `dependencies`, вес MDT от этого не вырос.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mdt-module-builder",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "Сборщик внешних UI-модулей MDT (Vite).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
"src",
|
|
18
18
|
"bin",
|
|
19
19
|
"README.md",
|
|
20
|
+
"CHANGELOG.md",
|
|
20
21
|
"SHARED-DEPENDENCIES.md"
|
|
21
22
|
],
|
|
22
23
|
"engines": {
|
|
@@ -26,7 +27,6 @@
|
|
|
26
27
|
"autoprefixer": "^10.4.0",
|
|
27
28
|
"postcss": "^8.4.0",
|
|
28
29
|
"postcss-nested": "^6.2.0",
|
|
29
|
-
"tailwindcss": "^3.4.0",
|
|
30
30
|
"vite": "^6.0.0"
|
|
31
31
|
},
|
|
32
32
|
"keywords": [
|
package/src/index.mjs
CHANGED
|
@@ -12,8 +12,6 @@
|
|
|
12
12
|
import * as fs from "node:fs";
|
|
13
13
|
import * as os from "node:os";
|
|
14
14
|
import * as path from "node:path";
|
|
15
|
-
import { createRequire } from "node:module";
|
|
16
|
-
import { pathToFileURL } from "node:url";
|
|
17
15
|
// postcss-плагины для компонентного CSS модуля (см. css.postcss в moduleViteConfig). Оба —
|
|
18
16
|
// прямые зависимости пакета, поэтому импортим статически (нужны только при реальной сборке).
|
|
19
17
|
import autoprefixer from "autoprefixer";
|
|
@@ -29,13 +27,24 @@ export const SHARED_EXACT = ["react", "react-dom", "react-dom/client", "react/js
|
|
|
29
27
|
// библиотек с большим/растущим API и подпутями. Каждый подпуть (zustand/middleware и т.п.) —
|
|
30
28
|
// отдельный спецификатор: его и externalize, и экспонировать в __mdtShared нужно отдельно.
|
|
31
29
|
// Добавление новой shared-зависимости: см. SHARED-DEPENDENCIES.md.
|
|
30
|
+
// Перечислены только КОРНЕВЫЕ спецификаторы: сабпасы (zod/v4, tailwind-variants/utils,
|
|
31
|
+
// zustand/middleware, …) модули сегодня не импортируют. Понадобится сабпас — добавляется
|
|
32
|
+
// отдельной строкой сюда и отдельным ключом в __mdtShared, "про запас" не добавляем.
|
|
32
33
|
export const SHARED_GLOBALS = [
|
|
33
34
|
"@tanstack/react-query",
|
|
34
35
|
"zustand",
|
|
35
36
|
"zustand/middleware",
|
|
36
37
|
"zustand/react/shallow",
|
|
37
38
|
"echarts",
|
|
38
|
-
"echarts-for-react"
|
|
39
|
+
"echarts-for-react",
|
|
40
|
+
"@tanstack/react-virtual",
|
|
41
|
+
"@tanstack/react-table",
|
|
42
|
+
"@dnd-kit/core",
|
|
43
|
+
"@dnd-kit/utilities",
|
|
44
|
+
"dnd-timeline",
|
|
45
|
+
"tailwind-variants",
|
|
46
|
+
"react-hook-form",
|
|
47
|
+
"zod"
|
|
39
48
|
];
|
|
40
49
|
|
|
41
50
|
// Библиотеки, которые MDT хостит ЦЕЛИКОМ и отдаёт модулям единым инстансом через ПРЕФИКС: матчим и
|
|
@@ -57,10 +66,9 @@ export const SHARED_NAMES = {
|
|
|
57
66
|
react: "Activity,Children,Component,Fragment,Profiler,PureComponent,StrictMode,Suspense,act,cache,cacheSignal,captureOwnerStack,cloneElement,createContext,createElement,createRef,forwardRef,isValidElement,lazy,memo,startTransition,use,useActionState,useCallback,useContext,useDebugValue,useDeferredValue,useEffect,useEffectEvent,useId,useImperativeHandle,useInsertionEffect,useLayoutEffect,useMemo,useOptimistic,useReducer,useRef,useState,useSyncExternalStore,useTransition,version".split(
|
|
58
67
|
","
|
|
59
68
|
),
|
|
60
|
-
"react-dom":
|
|
61
|
-
"
|
|
62
|
-
|
|
63
|
-
),
|
|
69
|
+
"react-dom": "createPortal,flushSync,preconnect,prefetchDNS,preinit,preinitModule,preload,preloadModule,requestFormReset,unstable_batchedUpdates,useFormState,useFormStatus,version".split(
|
|
70
|
+
","
|
|
71
|
+
),
|
|
64
72
|
"react-dom/client": ["createRoot", "hydrateRoot", "version"],
|
|
65
73
|
"react/jsx-runtime": ["Fragment", "jsx", "jsxs"],
|
|
66
74
|
"react/jsx-dev-runtime": ["Fragment", "jsxDEV"]
|
|
@@ -96,7 +104,9 @@ function sharedAliases(shimDir) {
|
|
|
96
104
|
// Толерантный парсер tsconfig (JSONC): вырезаем // и /* */ комментарии (не трогая их внутри строк)
|
|
97
105
|
// и висячие запятые, затем JSON.parse.
|
|
98
106
|
function parseJsonc(text) {
|
|
99
|
-
const noComments = text.replace(/("(?:\\.|[^"\\])*")|\/\/[^\n\r]*|\/\*[\s\S]*?\*\//g, (_m, str) =>
|
|
107
|
+
const noComments = text.replace(/("(?:\\.|[^"\\])*")|\/\/[^\n\r]*|\/\*[\s\S]*?\*\//g, (_m, str) =>
|
|
108
|
+
str ? str : ""
|
|
109
|
+
);
|
|
100
110
|
return JSON.parse(noComments.replace(/,(\s*[}\]])/g, "$1"));
|
|
101
111
|
}
|
|
102
112
|
|
|
@@ -124,7 +134,10 @@ function tsconfigAliases(root) {
|
|
|
124
134
|
if (!target) continue;
|
|
125
135
|
if (pattern.endsWith("/*") && target.endsWith("/*")) {
|
|
126
136
|
const replBase = path.resolve(baseDir, target.slice(0, -2)).replace(/\\/g, "/");
|
|
127
|
-
aliases.push({
|
|
137
|
+
aliases.push({
|
|
138
|
+
find: new RegExp(`^${escapeRegExp(pattern.slice(0, -2))}/(.*)$`),
|
|
139
|
+
replacement: `${replBase}/$1`
|
|
140
|
+
});
|
|
128
141
|
} else {
|
|
129
142
|
aliases.push({ find: pattern, replacement: path.resolve(baseDir, target) });
|
|
130
143
|
}
|
|
@@ -145,45 +158,16 @@ function globalRef(id) {
|
|
|
145
158
|
: `globalThis.__mdtShared[${JSON.stringify(id)}]`;
|
|
146
159
|
}
|
|
147
160
|
|
|
148
|
-
// Tailwind для модуля (вариант A): билдер сам генерит утилиты ТОЛЬКО из исходников модуля.
|
|
149
|
-
// preflight и токены даёт MDT глобально, поэтому здесь preflight выключен и эмитятся лишь
|
|
150
|
-
// `@tailwind utilities`. Пресет берём из ics-ui-kit самого модуля (фолбэк — ics-ui-kit билдера,
|
|
151
|
-
// чтобы dev-стенд работал даже до npm install в модуле) → те же утилиты/токены, что в MDT.
|
|
152
|
-
async function loadIcsPreset(root) {
|
|
153
|
-
for (const base of [path.join(root, "package.json"), import.meta.url]) {
|
|
154
|
-
try {
|
|
155
|
-
const resolved = createRequire(base).resolve("ics-ui-kit/tailwind.preset");
|
|
156
|
-
const mod = await import(pathToFileURL(resolved).href);
|
|
157
|
-
return mod.default ?? mod;
|
|
158
|
-
} catch {
|
|
159
|
-
// пробуем следующий источник
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
return undefined;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
// Генерит CSS утилит Tailwind, найденных в исходниках модуля. Зависимости подключаем лениво:
|
|
166
|
-
// они есть у MDT (dev) и у mdt-module-builder (CI модуля), но не нужны для `--list`/импорта ядра.
|
|
167
|
-
async function generateModuleTailwindCss(root) {
|
|
168
|
-
const [{ default: postcss }, { default: tailwindcss }, { default: autoprefixer }] = await Promise.all([
|
|
169
|
-
import("postcss"),
|
|
170
|
-
import("tailwindcss"),
|
|
171
|
-
import("autoprefixer")
|
|
172
|
-
]);
|
|
173
|
-
const content = path.join(root, "src").replace(/\\/g, "/") + "/**/*.{ts,tsx,js,jsx,html}";
|
|
174
|
-
const preset = await loadIcsPreset(root);
|
|
175
|
-
const config = { presets: preset ? [preset] : [], content: [content], corePlugins: { preflight: false } };
|
|
176
|
-
const { css } = await postcss([tailwindcss(config), autoprefixer()]).process("@tailwind utilities;\n", { from: undefined });
|
|
177
|
-
return css;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
161
|
// Инлайнит собранный CSS в JS-чанк (рантайм-инъекция <style>) — как старый webpack/style-loader:
|
|
181
|
-
// оверлей копирует только index.js, отдельного css-файла нет.
|
|
182
|
-
|
|
162
|
+
// оверлей копирует только index.js, отдельного css-файла нет. Модуль больше не собирает свой
|
|
163
|
+
// Tailwind (MP-16147): здесь только компонентный CSS модуля (import "./x.css",
|
|
164
|
+
// postcss-nested + autoprefixer, см. css.postcss в moduleViteConfig). Tailwind-утилиты модулю
|
|
165
|
+
// больше не нужны — они приходят из курируемого safelist core-сборки MDT (ui/tailwind-safelist.mjs).
|
|
166
|
+
function cssInjectPlugin() {
|
|
183
167
|
return {
|
|
184
168
|
name: "mdt-css-inject",
|
|
185
169
|
enforce: "post",
|
|
186
|
-
|
|
170
|
+
generateBundle(_opts, bundle) {
|
|
187
171
|
let css = "";
|
|
188
172
|
for (const [file, chunk] of Object.entries(bundle)) {
|
|
189
173
|
if (chunk.type === "asset" && file.endsWith(".css")) {
|
|
@@ -191,7 +175,6 @@ function cssInjectPlugin(root) {
|
|
|
191
175
|
delete bundle[file];
|
|
192
176
|
}
|
|
193
177
|
}
|
|
194
|
-
css += await generateModuleTailwindCss(root);
|
|
195
178
|
if (!css) return;
|
|
196
179
|
const inject = `(function(){try{var s=document.createElement("style");s.textContent=${JSON.stringify(
|
|
197
180
|
css
|
|
@@ -214,12 +197,27 @@ export function moduleViteConfig({ root, entry, outDir, watch = false, name = "_
|
|
|
214
197
|
configFile: false,
|
|
215
198
|
root,
|
|
216
199
|
logLevel: "warn",
|
|
200
|
+
// Библиотеки, которые бандлятся ВНУТРЬ модуля (react-virtual и др.), метят dev-ветки через
|
|
201
|
+
// `process.env.NODE_ENV` — де-факто стандарт npm (так же устроен entry самого React). Это
|
|
202
|
+
// маркер для сборщика, а не рантайм-чтение: он должен подставить литерал и стрипнуть ветку.
|
|
203
|
+
// В lib-режиме Vite такую подстановку сознательно пропускает (`isBuildLib`,
|
|
204
|
+
// src/node/plugins/define.ts) — рассчитывает, что артефакт дособерёт бандлер потребителя.
|
|
205
|
+
// У нас его нет: MDT грузит index.js как <script>, а `process` в браузере не существует →
|
|
206
|
+
// ReferenceError в момент первого исполнения dev-ветки (сам модуль при этом грузится
|
|
207
|
+
// нормально — проверки лежат внутри функций). Делаем подстановку явно: NODE_ENV="production" (стрипает
|
|
208
|
+
// dev-ветки), плюс `process.env` → {} как фолбэк для прочих `process.env.X`.
|
|
209
|
+
// Ключи Vite матчит по длине (NODE_ENV раньше env).
|
|
210
|
+
define: {
|
|
211
|
+
"process.env.NODE_ENV": JSON.stringify("production"),
|
|
212
|
+
"process.env": "{}"
|
|
213
|
+
},
|
|
217
214
|
// react/*-шимы + tsconfig `paths` модуля (напр. "_core/*") — иначе Vite их не резолвит.
|
|
218
215
|
resolve: { alias: [...sharedAliases(shimDir), ...tsconfigAliases(root)] },
|
|
219
|
-
plugins: [cssInjectPlugin(
|
|
216
|
+
plugins: [cssInjectPlugin()],
|
|
220
217
|
// Компонентный CSS модуля (import "./x.css") гоняем через postcss-nested (Sass-подобная
|
|
221
218
|
// вложенность `&`, как старый webpack builder) + autoprefixer. Инлайн-инъекцию делает
|
|
222
|
-
// cssInjectPlugin
|
|
219
|
+
// cssInjectPlugin. Tailwind-утилиты модуль больше не собирает (MP-16147) — приходят
|
|
220
|
+
// из курируемого safelist core-сборки MDT.
|
|
223
221
|
css: { postcss: { plugins: [postcssNested(), autoprefixer()] } },
|
|
224
222
|
build: {
|
|
225
223
|
outDir,
|
|
@@ -230,12 +228,12 @@ export function moduleViteConfig({ root, entry, outDir, watch = false, name = "_
|
|
|
230
228
|
// externalize (инстанс даёт MDT через globalThis.__mdtShared, в модуль НЕ бандлятся): SHARED_GLOBALS
|
|
231
229
|
// (точные спецификаторы) + ics-ui-kit с сабпасами (SHARED_PREFIXES). react/* — alias-шимы; lucide бандлится.
|
|
232
230
|
external: (id) => SHARED_GLOBALS.includes(id) || isSharedPrefix(id) || id.startsWith(MDT_SDK_PREFIX),
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
231
|
+
// host кладёт значения в __mdtShared/__mdtSdk с флагом __esModule, поэтому
|
|
232
|
+
// interop берёт `.default` для default-импорта. rolldown (dev) делает это сам (__toESM),
|
|
233
|
+
// а Rollup (Vite 6, CI модуля) — только с output.interop:"auto"; без него default-импорт
|
|
234
|
+
// биндится ко всему объекту-неймспейсу вместо .default (MDT.Navigation === undefined,
|
|
235
|
+
// echarts-for-react → «Element type is invalid … got: object»).
|
|
236
|
+
output: { globals: globalRef, interop: "auto" }
|
|
239
237
|
},
|
|
240
238
|
lib: {
|
|
241
239
|
entry,
|