mdt-module-builder 1.0.3 → 1.0.4
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 +23 -0
- package/SHARED-DEPENDENCIES.md +119 -119
- package/package.json +2 -1
- package/src/index.mjs +54 -5
package/README.md
CHANGED
|
@@ -37,6 +37,12 @@ devtool/builder вызывают `npm run build` в репе модуля — м
|
|
|
37
37
|
компоненты модуля читали бы чужой `ThemeContext`. CSS-сабпасы (`styles.css`) не externalize-ятся.
|
|
38
38
|
- **lucide-react, mdt-client** — бандлятся внутрь `index.js` (должны быть установлены).
|
|
39
39
|
Их внутренний `import "react"` тоже перехватывается шимом.
|
|
40
|
+
Почему lucide бандлится, а ui-kit шарится (решение зафиксировано, не пересматривать без новых данных):
|
|
41
|
+
ui-kit **обязан** быть общим по корректности — у него React-контекст (тема, провайдеры), две копии =
|
|
42
|
+
сломанная тема. Иконки lucide — stateless SVG без контекста, дубли безвредны. При этом lucide импортят
|
|
43
|
+
именованно из корня (`import { X } from "lucide-react"`), так что шаринг = отдать весь namespace →
|
|
44
|
+
MDT забандлил бы **все ~1900 иконок без tree-shaking**. Per-module бандл, наоборот, tree-shaking-ом
|
|
45
|
+
тянет только used-иконки (единицы, ~КБ). Пара дублей по модулям несравнимо дешевле, чем вся lucide в MDT.
|
|
40
46
|
- **CSS** инлайнится в `index.js` (рантайм-инъекция `<style>`), как старый style-loader —
|
|
41
47
|
оверлей копирует только `index.js`, отдельного `.css` нет.
|
|
42
48
|
- **Tailwind (вариант A)** — билдер сам генерит утилиты Tailwind, найденные **только в `src`
|
|
@@ -45,6 +51,23 @@ devtool/builder вызывают `npm run build` в репе модуля — м
|
|
|
45
51
|
(`--primary` и пр.) даёт MDT глобально. ui-kit из `node_modules` повторно не сканируется —
|
|
46
52
|
его классы уже эмитит основная сборка MDT. Возможны дубли утилит между модулями — это принято.
|
|
47
53
|
|
|
54
|
+
## Совместимость исходников модуля (webpack → Vite)
|
|
55
|
+
|
|
56
|
+
Ядро воспроизводит удобства старого (webpack) билдера, чтобы исходники модуля не переписывать:
|
|
57
|
+
|
|
58
|
+
- **tsconfig `paths` → `resolve.alias`.** Билдер читает `compilerOptions.paths`/`baseUrl` из
|
|
59
|
+
`tsconfig.json` модуля и разворачивает в alias'ы Vite (аналог `tsconfig-paths-webpack-plugin`).
|
|
60
|
+
Импорты вида `import x from "_core/scripts/..."` резолвятся без правок. Берётся первый target
|
|
61
|
+
маппинга; `prefix/*` → wildcard с захватом хвоста, точный ключ → строковый алиас.
|
|
62
|
+
- **CSS-вложенность.** Компонентный CSS модуля (`import "./x.css"`) прогоняется через
|
|
63
|
+
`postcss-nested` (Sass-подобный `&`) + `autoprefixer` — та же семантика, что у старого
|
|
64
|
+
`postcss-loader`. Native CSS nesting не задействуется. Утилиты Tailwind генерятся отдельно.
|
|
65
|
+
- **`.svg` как строка.** SVG импортится встроенным Vite-суффиксом `?raw`
|
|
66
|
+
(`import logo from "./logo.svg?raw"`) → строка с разметкой, инлайнится, без отдельного ассет-файла.
|
|
67
|
+
Байт-в-байт как старый `svg-inline-loader`. Билдер SVG специально не обрабатывает: **bare**-импорт
|
|
68
|
+
`.svg` без `?raw` уедет в отдельный файл, который контракт модуля (копируется только `index.js`)
|
|
69
|
+
потеряет — всегда с `?raw`.
|
|
70
|
+
|
|
48
71
|
## Доступ к функционалу MDT — `@mdt/*`
|
|
49
72
|
|
|
50
73
|
Любой `@mdt/<имя>` билдер externalize-ит и резолвит в `globalThis.__mdtSdk["<имя>"]`. Наполняет этот
|
package/SHARED-DEPENDENCIES.md
CHANGED
|
@@ -1,119 +1,119 @@
|
|
|
1
|
-
# Общие зависимости модулей: вынос в MDT
|
|
2
|
-
|
|
3
|
-
Когда внешнему модулю нужна библиотека, которую логично держать **одним инстансом на всё
|
|
4
|
-
приложение** (или не таскать её копию в каждый модуль), она «выносится» в MDT: MDT ставит её,
|
|
5
|
-
экспонирует через `globalThis.__mdtShared`, а сборка модуля её **не бандлит**, а читает оттуда.
|
|
6
|
-
Ровно так уже сделано для react-семьи; этот документ — про добавление новой такой зависимости.
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## Шаг 0. Решить: выносить или бандлить
|
|
11
|
-
|
|
12
|
-
Выносим, если выполняется хотя бы одно:
|
|
13
|
-
|
|
14
|
-
- **Нужен единый инстанс/контекст.** Несколько копий ломаются: react (hooks), `@tanstack/react-query`
|
|
15
|
-
(общий `QueryClient`/контекст). → выносить **обязательно**.
|
|
16
|
-
- **Тяжёлая.** `echarts` ~1 МБ — копия в каждом модуле недопустима. → выносим ради веса.
|
|
17
|
-
- **Нужна ≥ 2 модулям.** Дедуп.
|
|
18
|
-
|
|
19
|
-
Если ничего из этого — **не выносим**. Просто импортируй в модуле, она забандлится внутрь. Ничего
|
|
20
|
-
делать не надо.
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## План выноса (по шагам)
|
|
25
|
-
|
|
26
|
-
Каждый шаг — действие и явное «Готово, когда». Не переходи к следующему, пока текущее не закрыто.
|
|
27
|
-
|
|
28
|
-
### Шаг 1. Поставить зависимость в MDT
|
|
29
|
-
|
|
30
|
-
```
|
|
31
|
-
cd ui && npm i <dep>@<версия>
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
Версия, которую ты зафиксировал в MDT, **становится контрактом** — модули будут пользоваться
|
|
35
|
-
этим мажором.
|
|
36
|
-
|
|
37
|
-
> **Готово, когда:** `<dep>` стоит в `ui/package.json → dependencies`.
|
|
38
|
-
|
|
39
|
-
### Шаг 2. Экспонировать в `__mdtShared`
|
|
40
|
-
|
|
41
|
-
В `ui/vite-app/src/legacy/config-global.ts`:
|
|
42
|
-
|
|
43
|
-
```ts
|
|
44
|
-
import * as _Dep from "<dep>";
|
|
45
|
-
// ...
|
|
46
|
-
(globalThis as any).__mdtShared = Object.assign((globalThis as any).__mdtShared ?? {}, {
|
|
47
|
-
// ...уже существующие...
|
|
48
|
-
"<dep>": _Dep
|
|
49
|
-
});
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
Ключ — **точный спецификатор импорта**. Для каждого подпути, который импортируют модули
|
|
53
|
-
(`<dep>/sub`, например `zustand/middleware`), — отдельный `import * as` и отдельный ключ.
|
|
54
|
-
|
|
55
|
-
> **Готово, когда:** в рантайме `globalThis.__mdtShared["<dep>"]` возвращает библиотеку.
|
|
56
|
-
|
|
57
|
-
### Шаг 3. Externalize в билдере
|
|
58
|
-
|
|
59
|
-
В `ui/module-builder/src/index.mjs` добавь спецификатор (и каждый подпуть) в массив `SHARED_GLOBALS`.
|
|
60
|
-
|
|
61
|
-
> **Готово, когда:** сборка модуля ссылается на `globalThis.__mdtShared["<dep>"]`, а кода библиотеки
|
|
62
|
-
> в `dist/index.js` нет. Имена экспортов перечислять **не нужно** — Rollup обращается к членам глобала сам.
|
|
63
|
-
|
|
64
|
-
### Шаг 4. Доставить билдер в CI модуля
|
|
65
|
-
|
|
66
|
-
Dev-стенд MDT собирает модуль **локальным** исходником билдера → новый `SHARED_GLOBALS` работает
|
|
67
|
-
сразу. Для `npm run build` в репозитории модуля нужен **опубликованный** `mdt-module-builder` с этим
|
|
68
|
-
изменением:
|
|
69
|
-
|
|
70
|
-
```
|
|
71
|
-
cd ui/module-builder && npm publish # вручную, как и весь mdt-module-builder
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
> **Готово, когда:** в репо модуля стоит версия `mdt-module-builder`, где зависимость уже в `SHARED_GLOBALS`.
|
|
75
|
-
|
|
76
|
-
### Шаг 5. Подключить в модуле (только типы)
|
|
77
|
-
|
|
78
|
-
```
|
|
79
|
-
npm i -D <dep>@<версия> # в репозитории модуля; тот же мажор, что в MDT
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
Импортируй и пользуйся как обычно — в бандл библиотека не попадёт, тип берётся из devDependency.
|
|
83
|
-
|
|
84
|
-
> **Готово, когда:** типы резолвятся, импорт компилируется.
|
|
85
|
-
|
|
86
|
-
### Шаг 6. Проверить
|
|
87
|
-
|
|
88
|
-
Собери модуль и убедись:
|
|
89
|
-
|
|
90
|
-
- вес `dist/index.js` **не вырос** на размер библиотеки;
|
|
91
|
-
- в нём есть `globalThis.__mdtShared["<dep>"]` и **нет** кода библиотеки.
|
|
92
|
-
|
|
93
|
-
> **Готово, когда:** оба пункта выполнены.
|
|
94
|
-
|
|
95
|
-
---
|
|
96
|
-
|
|
97
|
-
## Подводные камни
|
|
98
|
-
|
|
99
|
-
- **Версия — это контракт.** Мажор в MDT и в модуле должен совпадать (как с react). Рассинхрон
|
|
100
|
-
даёт трудноуловимые поломки (аналог «Invalid hook call»).
|
|
101
|
-
- **Подпуть — отдельный спецификатор.** `zustand/middleware` ≠ `zustand`. Каждый используемый
|
|
102
|
-
подпуть нужно добавить и в `__mdtShared` (Шаг 2), и в `SHARED_GLOBALS` (Шаг 3).
|
|
103
|
-
- **`@tanstack/react-query`: единого инстанса мало.** Модуль должен обернуть своё дерево в
|
|
104
|
-
`<QueryClientProvider client={...}>`. Контекст работает именно потому, что инстанс один; сам
|
|
105
|
-
провайдер — ответственность модуля (каждый React-root монтируется отдельно через
|
|
106
|
-
`wrapComponent`/`createPageControl`).
|
|
107
|
-
- **Default-импорт** (`import X from "echarts-for-react"`) работает через стандартный interop
|
|
108
|
-
Rollup; после выноса проверь в рантайме, что `X` — это сам компонент, а не неймспейс.
|
|
109
|
-
- **react-семья — особый, исторический случай** (alias-шимы `SHARED_EXACT`/`SHARED_NAMES` с
|
|
110
|
-
перечислением имён). **Новые** зависимости добавляй в `SHARED_GLOBALS` — там имена перечислять не надо.
|
|
111
|
-
|
|
112
|
-
---
|
|
113
|
-
|
|
114
|
-
## Текущий список общих зависимостей
|
|
115
|
-
|
|
116
|
-
- **react-семья** (`SHARED_EXACT`, alias-шимы): `react`, `react-dom`, `react-dom/client`,
|
|
117
|
-
`react/jsx-runtime`, `react/jsx-dev-runtime`.
|
|
118
|
-
- **Externalize** (`SHARED_GLOBALS`): `@tanstack/react-query`, `zustand`, `zustand/middleware`,
|
|
119
|
-
`zustand/react/shallow`, `echarts`, `echarts-for-react`.
|
|
1
|
+
# Общие зависимости модулей: вынос в MDT
|
|
2
|
+
|
|
3
|
+
Когда внешнему модулю нужна библиотека, которую логично держать **одним инстансом на всё
|
|
4
|
+
приложение** (или не таскать её копию в каждый модуль), она «выносится» в MDT: MDT ставит её,
|
|
5
|
+
экспонирует через `globalThis.__mdtShared`, а сборка модуля её **не бандлит**, а читает оттуда.
|
|
6
|
+
Ровно так уже сделано для react-семьи; этот документ — про добавление новой такой зависимости.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Шаг 0. Решить: выносить или бандлить
|
|
11
|
+
|
|
12
|
+
Выносим, если выполняется хотя бы одно:
|
|
13
|
+
|
|
14
|
+
- **Нужен единый инстанс/контекст.** Несколько копий ломаются: react (hooks), `@tanstack/react-query`
|
|
15
|
+
(общий `QueryClient`/контекст). → выносить **обязательно**.
|
|
16
|
+
- **Тяжёлая.** `echarts` ~1 МБ — копия в каждом модуле недопустима. → выносим ради веса.
|
|
17
|
+
- **Нужна ≥ 2 модулям.** Дедуп.
|
|
18
|
+
|
|
19
|
+
Если ничего из этого — **не выносим**. Просто импортируй в модуле, она забандлится внутрь. Ничего
|
|
20
|
+
делать не надо.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## План выноса (по шагам)
|
|
25
|
+
|
|
26
|
+
Каждый шаг — действие и явное «Готово, когда». Не переходи к следующему, пока текущее не закрыто.
|
|
27
|
+
|
|
28
|
+
### Шаг 1. Поставить зависимость в MDT
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
cd ui && npm i <dep>@<версия>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Версия, которую ты зафиксировал в MDT, **становится контрактом** — модули будут пользоваться
|
|
35
|
+
этим мажором.
|
|
36
|
+
|
|
37
|
+
> **Готово, когда:** `<dep>` стоит в `ui/package.json → dependencies`.
|
|
38
|
+
|
|
39
|
+
### Шаг 2. Экспонировать в `__mdtShared`
|
|
40
|
+
|
|
41
|
+
В `ui/vite-app/src/legacy/config-global.ts`:
|
|
42
|
+
|
|
43
|
+
```ts
|
|
44
|
+
import * as _Dep from "<dep>";
|
|
45
|
+
// ...
|
|
46
|
+
(globalThis as any).__mdtShared = Object.assign((globalThis as any).__mdtShared ?? {}, {
|
|
47
|
+
// ...уже существующие...
|
|
48
|
+
"<dep>": _Dep
|
|
49
|
+
});
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Ключ — **точный спецификатор импорта**. Для каждого подпути, который импортируют модули
|
|
53
|
+
(`<dep>/sub`, например `zustand/middleware`), — отдельный `import * as` и отдельный ключ.
|
|
54
|
+
|
|
55
|
+
> **Готово, когда:** в рантайме `globalThis.__mdtShared["<dep>"]` возвращает библиотеку.
|
|
56
|
+
|
|
57
|
+
### Шаг 3. Externalize в билдере
|
|
58
|
+
|
|
59
|
+
В `ui/module-builder/src/index.mjs` добавь спецификатор (и каждый подпуть) в массив `SHARED_GLOBALS`.
|
|
60
|
+
|
|
61
|
+
> **Готово, когда:** сборка модуля ссылается на `globalThis.__mdtShared["<dep>"]`, а кода библиотеки
|
|
62
|
+
> в `dist/index.js` нет. Имена экспортов перечислять **не нужно** — Rollup обращается к членам глобала сам.
|
|
63
|
+
|
|
64
|
+
### Шаг 4. Доставить билдер в CI модуля
|
|
65
|
+
|
|
66
|
+
Dev-стенд MDT собирает модуль **локальным** исходником билдера → новый `SHARED_GLOBALS` работает
|
|
67
|
+
сразу. Для `npm run build` в репозитории модуля нужен **опубликованный** `mdt-module-builder` с этим
|
|
68
|
+
изменением:
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
cd ui/module-builder && npm publish # вручную, как и весь mdt-module-builder
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
> **Готово, когда:** в репо модуля стоит версия `mdt-module-builder`, где зависимость уже в `SHARED_GLOBALS`.
|
|
75
|
+
|
|
76
|
+
### Шаг 5. Подключить в модуле (только типы)
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
npm i -D <dep>@<версия> # в репозитории модуля; тот же мажор, что в MDT
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Импортируй и пользуйся как обычно — в бандл библиотека не попадёт, тип берётся из devDependency.
|
|
83
|
+
|
|
84
|
+
> **Готово, когда:** типы резолвятся, импорт компилируется.
|
|
85
|
+
|
|
86
|
+
### Шаг 6. Проверить
|
|
87
|
+
|
|
88
|
+
Собери модуль и убедись:
|
|
89
|
+
|
|
90
|
+
- вес `dist/index.js` **не вырос** на размер библиотеки;
|
|
91
|
+
- в нём есть `globalThis.__mdtShared["<dep>"]` и **нет** кода библиотеки.
|
|
92
|
+
|
|
93
|
+
> **Готово, когда:** оба пункта выполнены.
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Подводные камни
|
|
98
|
+
|
|
99
|
+
- **Версия — это контракт.** Мажор в MDT и в модуле должен совпадать (как с react). Рассинхрон
|
|
100
|
+
даёт трудноуловимые поломки (аналог «Invalid hook call»).
|
|
101
|
+
- **Подпуть — отдельный спецификатор.** `zustand/middleware` ≠ `zustand`. Каждый используемый
|
|
102
|
+
подпуть нужно добавить и в `__mdtShared` (Шаг 2), и в `SHARED_GLOBALS` (Шаг 3).
|
|
103
|
+
- **`@tanstack/react-query`: единого инстанса мало.** Модуль должен обернуть своё дерево в
|
|
104
|
+
`<QueryClientProvider client={...}>`. Контекст работает именно потому, что инстанс один; сам
|
|
105
|
+
провайдер — ответственность модуля (каждый React-root монтируется отдельно через
|
|
106
|
+
`wrapComponent`/`createPageControl`).
|
|
107
|
+
- **Default-импорт** (`import X from "echarts-for-react"`) работает через стандартный interop
|
|
108
|
+
Rollup; после выноса проверь в рантайме, что `X` — это сам компонент, а не неймспейс.
|
|
109
|
+
- **react-семья — особый, исторический случай** (alias-шимы `SHARED_EXACT`/`SHARED_NAMES` с
|
|
110
|
+
перечислением имён). **Новые** зависимости добавляй в `SHARED_GLOBALS` — там имена перечислять не надо.
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Текущий список общих зависимостей
|
|
115
|
+
|
|
116
|
+
- **react-семья** (`SHARED_EXACT`, alias-шимы): `react`, `react-dom`, `react-dom/client`,
|
|
117
|
+
`react/jsx-runtime`, `react/jsx-dev-runtime`.
|
|
118
|
+
- **Externalize** (`SHARED_GLOBALS`): `@tanstack/react-query`, `zustand`, `zustand/middleware`,
|
|
119
|
+
`zustand/react/shallow`, `echarts`, `echarts-for-react`.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mdt-module-builder",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"description": "Сборщик внешних UI-модулей MDT (Vite).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"autoprefixer": "^10.4.0",
|
|
27
27
|
"postcss": "^8.4.0",
|
|
28
|
+
"postcss-nested": "^6.2.0",
|
|
28
29
|
"tailwindcss": "^3.4.0",
|
|
29
30
|
"vite": "^6.0.0"
|
|
30
31
|
},
|
package/src/index.mjs
CHANGED
|
@@ -14,6 +14,10 @@ import * as os from "node:os";
|
|
|
14
14
|
import * as path from "node:path";
|
|
15
15
|
import { createRequire } from "node:module";
|
|
16
16
|
import { pathToFileURL } from "node:url";
|
|
17
|
+
// postcss-плагины для компонентного CSS модуля (см. css.postcss в moduleViteConfig). Оба —
|
|
18
|
+
// прямые зависимости пакета, поэтому импортим статически (нужны только при реальной сборке).
|
|
19
|
+
import autoprefixer from "autoprefixer";
|
|
20
|
+
import postcssNested from "postcss-nested";
|
|
17
21
|
|
|
18
22
|
// Спецификаторы, которые резолвятся на единственную копию MDT через window.__mdtShared.
|
|
19
23
|
export const SHARED_EXACT = ["react", "react-dom", "react-dom/client", "react/jsx-runtime", "react/jsx-dev-runtime"];
|
|
@@ -89,6 +93,45 @@ function sharedAliases(shimDir) {
|
|
|
89
93
|
}));
|
|
90
94
|
}
|
|
91
95
|
|
|
96
|
+
// Толерантный парсер tsconfig (JSONC): вырезаем // и /* */ комментарии (не трогая их внутри строк)
|
|
97
|
+
// и висячие запятые, затем JSON.parse.
|
|
98
|
+
function parseJsonc(text) {
|
|
99
|
+
const noComments = text.replace(/("(?:\\.|[^"\\])*")|\/\/[^\n\r]*|\/\*[\s\S]*?\*\//g, (_m, str) => (str ? str : ""));
|
|
100
|
+
return JSON.parse(noComments.replace(/,(\s*[}\]])/g, "$1"));
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function escapeRegExp(s) {
|
|
104
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Разворачивает tsconfig `compilerOptions.paths` модуля в resolve.alias — аналог
|
|
108
|
+
// tsconfig-paths-webpack-plugin старого (webpack) билдера. Без этого Vite не резолвит алиасы вида
|
|
109
|
+
// "_core/*", которыми пользуется код модуля. Берём первый target маппинга (как tsconfig-paths по
|
|
110
|
+
// умолчанию); wildcard `prefix/*` → regex с захватом хвоста, точный ключ → строковый алиас.
|
|
111
|
+
function tsconfigAliases(root) {
|
|
112
|
+
let json;
|
|
113
|
+
try {
|
|
114
|
+
json = parseJsonc(fs.readFileSync(path.join(root, "tsconfig.json"), "utf8"));
|
|
115
|
+
} catch {
|
|
116
|
+
return [];
|
|
117
|
+
}
|
|
118
|
+
const co = json?.compilerOptions ?? {};
|
|
119
|
+
const paths = co.paths ?? {};
|
|
120
|
+
const baseDir = path.resolve(root, co.baseUrl ?? ".");
|
|
121
|
+
const aliases = [];
|
|
122
|
+
for (const [pattern, targets] of Object.entries(paths)) {
|
|
123
|
+
const target = Array.isArray(targets) ? targets[0] : undefined;
|
|
124
|
+
if (!target) continue;
|
|
125
|
+
if (pattern.endsWith("/*") && target.endsWith("/*")) {
|
|
126
|
+
const replBase = path.resolve(baseDir, target.slice(0, -2)).replace(/\\/g, "/");
|
|
127
|
+
aliases.push({ find: new RegExp(`^${escapeRegExp(pattern.slice(0, -2))}/(.*)$`), replacement: `${replBase}/$1` });
|
|
128
|
+
} else {
|
|
129
|
+
aliases.push({ find: pattern, replacement: path.resolve(baseDir, target) });
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return aliases;
|
|
133
|
+
}
|
|
134
|
+
|
|
92
135
|
// Публичный SDK MDT: спецификаторы `@mdt/<имя>` отдаются модулю как externalize. Их экспорты
|
|
93
136
|
// кладёт MDT в globalThis.__mdtSdk — по одному ключу на файл папки ui/mdt-sdk (см. _register.ts).
|
|
94
137
|
// Добавить публичный API = создать файл в ui/mdt-sdk; перечислять имена/спецификаторы не нужно.
|
|
@@ -171,8 +214,13 @@ export function moduleViteConfig({ root, entry, outDir, watch = false, name = "_
|
|
|
171
214
|
configFile: false,
|
|
172
215
|
root,
|
|
173
216
|
logLevel: "warn",
|
|
174
|
-
|
|
217
|
+
// react/*-шимы + tsconfig `paths` модуля (напр. "_core/*") — иначе Vite их не резолвит.
|
|
218
|
+
resolve: { alias: [...sharedAliases(shimDir), ...tsconfigAliases(root)] },
|
|
175
219
|
plugins: [cssInjectPlugin(root)],
|
|
220
|
+
// Компонентный CSS модуля (import "./x.css") гоняем через postcss-nested (Sass-подобная
|
|
221
|
+
// вложенность `&`, как старый webpack builder) + autoprefixer. Инлайн-инъекцию делает
|
|
222
|
+
// cssInjectPlugin; `@tailwind utilities` генерятся отдельно (generateModuleTailwindCss).
|
|
223
|
+
css: { postcss: { plugins: [postcssNested(), autoprefixer()] } },
|
|
176
224
|
build: {
|
|
177
225
|
outDir,
|
|
178
226
|
emptyOutDir: true,
|
|
@@ -183,10 +231,11 @@ export function moduleViteConfig({ root, entry, outDir, watch = false, name = "_
|
|
|
183
231
|
// (точные спецификаторы) + ics-ui-kit с сабпасами (SHARED_PREFIXES). react/* — alias-шимы; lucide бандлится.
|
|
184
232
|
external: (id) => SHARED_GLOBALS.includes(id) || isSharedPrefix(id) || id.startsWith(MDT_SDK_PREFIX),
|
|
185
233
|
// host кладёт значения в __mdtShared/__mdtSdk с флагом __esModule, поэтому
|
|
186
|
-
// interop
|
|
187
|
-
//
|
|
188
|
-
//
|
|
189
|
-
|
|
234
|
+
// interop берёт `.default` для default-импорта. rolldown (dev) делает это сам (__toESM),
|
|
235
|
+
// а Rollup (Vite 6, CI модуля) — только с output.interop:"auto"; без него default-импорт
|
|
236
|
+
// биндится ко всему объекту-неймспейсу вместо .default (MDT.Navigation === undefined,
|
|
237
|
+
// echarts-for-react → «Element type is invalid … got: object»).
|
|
238
|
+
output: { globals: globalRef, interop: "auto" }
|
|
190
239
|
},
|
|
191
240
|
lib: {
|
|
192
241
|
entry,
|