@koslibs/builder 0.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/LICENSE +21 -0
- package/README.md +301 -0
- package/dist/cli/args.d.ts +3 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +24 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/commands.d.ts +2 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +20 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/handlers/library.d.ts +2 -0
- package/dist/cli/handlers/library.d.ts.map +1 -0
- package/dist/cli/handlers/library.js +21 -0
- package/dist/cli/handlers/library.js.map +1 -0
- package/dist/cli/handlers/storybook.d.ts +2 -0
- package/dist/cli/handlers/storybook.d.ts.map +1 -0
- package/dist/cli/handlers/storybook.js +23 -0
- package/dist/cli/handlers/storybook.js.map +1 -0
- package/dist/cli/handlers/tests.d.ts +2 -0
- package/dist/cli/handlers/tests.d.ts.map +1 -0
- package/dist/cli/handlers/tests.js +39 -0
- package/dist/cli/handlers/tests.js.map +1 -0
- package/dist/cli/handlers/typecheck.d.ts +2 -0
- package/dist/cli/handlers/typecheck.d.ts.map +1 -0
- package/dist/cli/handlers/typecheck.js +6 -0
- package/dist/cli/handlers/typecheck.js.map +1 -0
- package/dist/cli/handlers/ui.d.ts +2 -0
- package/dist/cli/handlers/ui.d.ts.map +1 -0
- package/dist/cli/handlers/ui.js +25 -0
- package/dist/cli/handlers/ui.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +10 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/process.d.ts +3 -0
- package/dist/cli/process.d.ts.map +1 -0
- package/dist/cli/process.js +36 -0
- package/dist/cli/process.js.map +1 -0
- package/dist/cli/run.d.ts +2 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +54 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/configs/browser-tests.d.ts +4 -0
- package/dist/configs/browser-tests.d.ts.map +1 -0
- package/dist/configs/browser-tests.js +29 -0
- package/dist/configs/browser-tests.js.map +1 -0
- package/dist/configs/defaults.d.ts +5 -0
- package/dist/configs/defaults.d.ts.map +1 -0
- package/dist/configs/defaults.js +15 -0
- package/dist/configs/defaults.js.map +1 -0
- package/dist/configs/find-test.d.ts +2 -0
- package/dist/configs/find-test.d.ts.map +1 -0
- package/dist/configs/find-test.js +8 -0
- package/dist/configs/find-test.js.map +1 -0
- package/dist/configs/generated.d.ts +6 -0
- package/dist/configs/generated.d.ts.map +1 -0
- package/dist/configs/generated.js +21 -0
- package/dist/configs/generated.js.map +1 -0
- package/dist/configs/library.d.ts +4 -0
- package/dist/configs/library.d.ts.map +1 -0
- package/dist/configs/library.js +34 -0
- package/dist/configs/library.js.map +1 -0
- package/dist/configs/load.d.ts +3 -0
- package/dist/configs/load.d.ts.map +1 -0
- package/dist/configs/load.js +13 -0
- package/dist/configs/load.js.map +1 -0
- package/dist/configs/normalize.d.ts +3 -0
- package/dist/configs/normalize.d.ts.map +1 -0
- package/dist/configs/normalize.js +24 -0
- package/dist/configs/normalize.js.map +1 -0
- package/dist/configs/storybook.d.ts +6 -0
- package/dist/configs/storybook.d.ts.map +1 -0
- package/dist/configs/storybook.js +36 -0
- package/dist/configs/storybook.js.map +1 -0
- package/dist/configs/typescript.d.ts +3 -0
- package/dist/configs/typescript.d.ts.map +1 -0
- package/dist/configs/typescript.js +13 -0
- package/dist/configs/typescript.js.map +1 -0
- package/dist/configs/ui.d.ts +4 -0
- package/dist/configs/ui.d.ts.map +1 -0
- package/dist/configs/ui.js +28 -0
- package/dist/configs/ui.js.map +1 -0
- package/dist/configs/unit-tests.d.ts +4 -0
- package/dist/configs/unit-tests.d.ts.map +1 -0
- package/dist/configs/unit-tests.js +14 -0
- package/dist/configs/unit-tests.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/storybook/index.d.ts +3 -0
- package/dist/storybook/index.d.ts.map +1 -0
- package/dist/storybook/index.js +2 -0
- package/dist/storybook/index.js.map +1 -0
- package/dist/testing/index.d.ts +5 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +4 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/playwright.d.ts +2 -0
- package/dist/testing/playwright.d.ts.map +1 -0
- package/dist/testing/playwright.js +2 -0
- package/dist/testing/playwright.js.map +1 -0
- package/dist/testing/rstest.d.ts +2 -0
- package/dist/testing/rstest.d.ts.map +1 -0
- package/dist/testing/rstest.js +2 -0
- package/dist/testing/rstest.js.map +1 -0
- package/dist/typings/cli.d.ts +7 -0
- package/dist/typings/cli.d.ts.map +1 -0
- package/dist/typings/cli.js +2 -0
- package/dist/typings/cli.js.map +1 -0
- package/dist/typings/client.d.ts +3 -0
- package/dist/typings/client.d.ts.map +1 -0
- package/dist/typings/client.js +3 -0
- package/dist/typings/client.js.map +1 -0
- package/dist/typings/config.d.ts +9 -0
- package/dist/typings/config.d.ts.map +1 -0
- package/dist/typings/config.js +2 -0
- package/dist/typings/config.js.map +1 -0
- package/dist/typings/index.d.ts +5 -0
- package/dist/typings/index.d.ts.map +1 -0
- package/dist/typings/index.js +2 -0
- package/dist/typings/index.js.map +1 -0
- package/dist/typings/packages.d.ts +4 -0
- package/dist/typings/packages.d.ts.map +1 -0
- package/dist/typings/packages.js +2 -0
- package/dist/typings/packages.js.map +1 -0
- package/dist/typings/storybook.d.ts +2 -0
- package/dist/typings/storybook.d.ts.map +1 -0
- package/dist/typings/storybook.js +2 -0
- package/dist/typings/storybook.js.map +1 -0
- package/dist/typings/testing.d.ts +3 -0
- package/dist/typings/testing.d.ts.map +1 -0
- package/dist/typings/testing.js +2 -0
- package/dist/typings/testing.js.map +1 -0
- package/dist/utils/packages.d.ts +3 -0
- package/dist/utils/packages.d.ts.map +1 -0
- package/dist/utils/packages.js +17 -0
- package/dist/utils/packages.js.map +1 -0
- package/dist/utils/shell.d.ts +2 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +7 -0
- package/dist/utils/shell.js.map +1 -0
- package/package.json +107 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 holypower777
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
# @koslibs/builder
|
|
2
|
+
|
|
3
|
+
Единый CLI для React-приложений, ESM-библиотек, Storybook и тестов.
|
|
4
|
+
UI собирается через Rsbuild, библиотеки — через Rslib. Оба используют Rspack.
|
|
5
|
+
|
|
6
|
+
## Подключение
|
|
7
|
+
|
|
8
|
+
Node.js >= 24.13.0. Builder устанавливается в devDependencies:
|
|
9
|
+
|
|
10
|
+
```sh
|
|
11
|
+
npm install @koslibs/api @koslibs/components
|
|
12
|
+
npm install --save-dev @koslibs/builder @koslibs/configs @types/react @types/react-dom @types/node
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
`@koslibs/configs` — обязательная peer-зависимость builder с диапазоном `^0.2.11`.
|
|
16
|
+
Builder использует версию configs, установленную в проекте.
|
|
17
|
+
|
|
18
|
+
Первая строка — целевая схема подключения runtime-пакетов: она применима, когда
|
|
19
|
+
нужные версии API и components опубликованы. Builder не устанавливает эти пакеты автоматически
|
|
20
|
+
и не требует их наличия для работы. React и react-dom устанавливаются самим приложением.
|
|
21
|
+
Поддерживаются React 18.3 и 19; совместимость остальных пакетов нужно учитывать отдельно.
|
|
22
|
+
|
|
23
|
+
В корне проекта создаётся `koslibs-builder.ts`:
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
import type { KoslibsBuilderConfig } from '@koslibs/builder';
|
|
27
|
+
|
|
28
|
+
const config: KoslibsBuilderConfig = {};
|
|
29
|
+
|
|
30
|
+
export default config;
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Конфиг загружается встроенным TypeScript-загрузчиком Node.js. Типы импортируются через
|
|
34
|
+
`import type`, относительные импорты указываются с расширением файла, например `./settings.ts`.
|
|
35
|
+
В конфиге не поддерживаются `enum`, декораторы и другие конструкции, требующие преобразования в JavaScript.
|
|
36
|
+
|
|
37
|
+
Пустой объект использует дефолты builder. Отсутствующий файл также означает дефолты.
|
|
38
|
+
`init` не нужен. Builder создаёт служебные настройки в `.cache/koslibs-builder`,
|
|
39
|
+
не перезаписывая конфиг или scripts проекта. После изменения `koslibs-builder.ts`
|
|
40
|
+
следует перезапустить dev/watch-процесс.
|
|
41
|
+
|
|
42
|
+
Публичный тип контролируется пакетом:
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
interface KoslibsBuilderConfig {
|
|
46
|
+
rsbuildConfig?: RsbuildConfig;
|
|
47
|
+
clientConfig?: EnvironmentConfig;
|
|
48
|
+
port?: number;
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Типы Rsbuild экспортируются из `@koslibs/builder`, поэтому для импортов типов
|
|
53
|
+
не нужно отдельно устанавливать `@rsbuild/core`. Неизвестные поля верхнего уровня
|
|
54
|
+
игнорируются при загрузке; TypeScript подсказывает только поддерживаемые поля.
|
|
55
|
+
Некорректные значения известных полей, например `port: "8080"`, вызывают ошибку.
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
import type { KoslibsBuilderConfig } from '@koslibs/builder';
|
|
59
|
+
|
|
60
|
+
const config: KoslibsBuilderConfig = {
|
|
61
|
+
port: 8080,
|
|
62
|
+
rsbuildConfig: {
|
|
63
|
+
source: { entry: { index: './src/main.tsx' } },
|
|
64
|
+
},
|
|
65
|
+
clientConfig: {
|
|
66
|
+
html: { title: 'GullEye' },
|
|
67
|
+
output: { distPath: { root: 'dist' } },
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
export default config;
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Настройки глубоко объединяются через `mergeRsbuildConfig`: дефолты → `rsbuildConfig`
|
|
75
|
+
→ клиентское окружение `clientConfig`. В UI это окружение называется `client`.
|
|
76
|
+
`port` имеет приоритет над `rsbuildConfig.server.port`, затем используется 8080.
|
|
77
|
+
Занятый порт вызывает ошибку вместо незаметного переключения на другой.
|
|
78
|
+
`clientConfig` используется для UI и Storybook, для сборки библиотеки он игнорируется.
|
|
79
|
+
|
|
80
|
+
## Scripts приложения
|
|
81
|
+
|
|
82
|
+
```json
|
|
83
|
+
{
|
|
84
|
+
"start": "koslibs-builder ui:start",
|
|
85
|
+
"build": "koslibs-builder ui:build",
|
|
86
|
+
"preview": "koslibs-builder ui:preview",
|
|
87
|
+
"typecheck": "koslibs-builder ui:typecheck",
|
|
88
|
+
"test": "koslibs-builder ui:test",
|
|
89
|
+
"test:watch": "koslibs-builder ui:test:watch",
|
|
90
|
+
"test:coverage": "koslibs-builder ui:test:coverage",
|
|
91
|
+
"test:e2e": "koslibs-builder ui:test:e2e",
|
|
92
|
+
"test:screenshots": "koslibs-builder ui:test:screenshots",
|
|
93
|
+
"storybook:start": "koslibs-builder storybook:start",
|
|
94
|
+
"storybook:build": "koslibs-builder storybook:build"
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Дефолты UI:
|
|
99
|
+
|
|
100
|
+
- Entry: `src/index.tsx`, затем существующий `src/main.tsx` или `src/index.ts`.
|
|
101
|
+
- React Fast Refresh в dev, production-оптимизации при build.
|
|
102
|
+
- CSS Modules для `*.module.css`; обычный CSS также поддерживается.
|
|
103
|
+
- Разделение vendor-кода и динамических импортов на чанки.
|
|
104
|
+
- Browserslist: `last 2 versions`. Это настройка преобразования синтаксиса; builder не добавляет полифиллы всех браузерных API.
|
|
105
|
+
- Выход в `dist`, относительные ссылки на ресурсы `./`, HTML с контейнером `#root`.
|
|
106
|
+
|
|
107
|
+
Rsbuild предоставляет дополнительные возможности через `rsbuildConfig` и `clientConfig`.
|
|
108
|
+
HTML можно изменить через `clientConfig.html`; для обычного сайта абсолютный путь к ресурсам
|
|
109
|
+
можно задать через `clientConfig.output.assetPrefix: '/'`.
|
|
110
|
+
|
|
111
|
+
Нужен `tsconfig.json`, расширяющий `@koslibs/configs`:
|
|
112
|
+
|
|
113
|
+
```json
|
|
114
|
+
{
|
|
115
|
+
"extends": "@koslibs/configs/tsconfig",
|
|
116
|
+
"compilerOptions": {
|
|
117
|
+
"types": ["@koslibs/builder/client"],
|
|
118
|
+
"jsx": "react-jsx"
|
|
119
|
+
},
|
|
120
|
+
"include": ["src", "koslibs-builder.ts"]
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
`@koslibs/builder/client` предоставляет типы CSS Modules, ресурсов и `import.meta.env`.
|
|
125
|
+
Для кода Node.js и конфигов, использующих `process`, добавь `@types/node` и `node` в `types`.
|
|
126
|
+
При использовании библиотек или JSX также нужны соответствующие `@types/*`.
|
|
127
|
+
|
|
128
|
+
Для работы с `examples/ui` в этом репозитории сначала выполни `npm run build`
|
|
129
|
+
из корня builder, затем в папке `examples/ui`:
|
|
130
|
+
|
|
131
|
+
```sh
|
|
132
|
+
npm install --no-save --package-lock=false ../..
|
|
133
|
+
npm run typecheck
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Это подключит локальный builder, включая `@koslibs/builder/client`, без изменения
|
|
137
|
+
зависимостей в package.json примера.
|
|
138
|
+
|
|
139
|
+
`ui:build` сначала проверяет весь TS-проект и возвращает ненулевой код при ошибках.
|
|
140
|
+
`ui:start` проверяет типы в отдельном процессе, показывает ошибки в терминале и overlay,
|
|
141
|
+
продолжает работать и повторяет проверку после исправлений. Dev-server не прекращает
|
|
142
|
+
работу из-за исправимой ошибки типов. Проверку типов задаёт builder.
|
|
143
|
+
|
|
144
|
+
## Библиотеки
|
|
145
|
+
|
|
146
|
+
Scripts используют префикс `lib` для build, typecheck и всех тестовых команд:
|
|
147
|
+
|
|
148
|
+
```json
|
|
149
|
+
{
|
|
150
|
+
"start": "koslibs-builder lib:start",
|
|
151
|
+
"watch": "koslibs-builder lib:watch",
|
|
152
|
+
"build": "koslibs-builder lib:build",
|
|
153
|
+
"typecheck": "koslibs-builder lib:typecheck",
|
|
154
|
+
"test": "koslibs-builder lib:test",
|
|
155
|
+
"test:watch": "koslibs-builder lib:test:watch",
|
|
156
|
+
"test:coverage": "koslibs-builder lib:test:coverage",
|
|
157
|
+
"test:e2e": "koslibs-builder lib:test:e2e",
|
|
158
|
+
"test:screenshots": "koslibs-builder lib:test:screenshots",
|
|
159
|
+
"storybook:start": "koslibs-builder storybook:start",
|
|
160
|
+
"storybook:build": "koslibs-builder storybook:build"
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
`lib:start` — алиас `storybook:start` для компонентов. Для библиотеки без UI, например
|
|
165
|
+
API-клиента, script `start` можно направить на `koslibs-builder lib:watch`.
|
|
166
|
+
`lib:watch` пересобирает исходники и декларации при изменениях, проверяет типы в фоне
|
|
167
|
+
и продолжает следить за файлами после исправимой ошибки типов.
|
|
168
|
+
|
|
169
|
+
Дефолты: ESM-only, структура файлов из `src` сохраняется в `dist`, генерируются `.d.ts`.
|
|
170
|
+
Dependencies и peerDependencies остаются внешними. Тесты, spec-файлы и stories не входят в dist.
|
|
171
|
+
TypeScript проверяется перед build; ошибки деклараций тоже завершают сборку с ошибкой.
|
|
172
|
+
Для Node.js библиотеки задай `rsbuildConfig.output.target: 'node'`.
|
|
173
|
+
|
|
174
|
+
Служебный tsconfig для деклараций расширяет корневой tsconfig, ограничивает исходники
|
|
175
|
+
каталогом `src` и задаёт `rootDir: src`. Для другой структуры, специальных исключений
|
|
176
|
+
или project references укажи собственный `rsbuildConfig.source.tsconfigPath`.
|
|
177
|
+
В режиме сохранения модулей `source.entry` задаётся glob-паттернами, например
|
|
178
|
+
`{ index: ['./src/**', '!./src/**/*.test.*', '!./src/**/*.stories.*'] }`.
|
|
179
|
+
|
|
180
|
+
В package.json библиотеки указываются `"type": "module"`, `files` и exports:
|
|
181
|
+
|
|
182
|
+
```json
|
|
183
|
+
{
|
|
184
|
+
"type": "module",
|
|
185
|
+
"files": ["dist"],
|
|
186
|
+
"exports": {
|
|
187
|
+
".": { "types": "./dist/index.d.ts", "import": "./dist/index.js" },
|
|
188
|
+
"./feature": { "types": "./dist/feature.d.ts", "import": "./dist/feature.js" }
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Builder не изменяет exports автоматически. Линтинг и форматирование остаются командами
|
|
194
|
+
`koslibs-lint` из configs. Сам builder компилируется через tsc для начальной загрузки CLI.
|
|
195
|
+
|
|
196
|
+
`npm run lint` запускает общую проверку ESLint и Prettier через `koslibs-lint lint`.
|
|
197
|
+
`npm run lint:fix` исправляет ошибки линтинга и форматирование через `koslibs-lint lint:fix`.
|
|
198
|
+
|
|
199
|
+
## Storybook
|
|
200
|
+
|
|
201
|
+
Builder управляет Rsbuild-framework, addon-docs, Controls, автодокументацией и stories
|
|
202
|
+
из `src/**/*.stories.{ts,tsx,js,jsx,mjs}`. `.storybook/main.ts` не требуется и не читается:
|
|
203
|
+
служебный main создаётся builder. При миграции старые addons и main-настройки нужно
|
|
204
|
+
сверить отдельно. Для локальных decorators и parameters используется `.storybook/preview.ts`.
|
|
205
|
+
Файлы `public` подключаются как статические ресурсы. Выход — `storybook-static`.
|
|
206
|
+
|
|
207
|
+
Storybook использует `port`, проверяет типы, наследует подходящие общие настройки
|
|
208
|
+
Rsbuild и клиентские настройки. Entry, HTML, server и distPath принадлежат Storybook
|
|
209
|
+
и не переносятся из настроек сборки приложения. Неподдерживаемые поля builder-конфига,
|
|
210
|
+
включая `storybookConfig`, игнорируются; расширение API для addons возможно следующим шагом.
|
|
211
|
+
|
|
212
|
+
## Тесты
|
|
213
|
+
|
|
214
|
+
Только Rstest и Playwright. Компонентного браузерного runner нет.
|
|
215
|
+
|
|
216
|
+
- `test` запускает unit-тесты один раз, `test:watch` следит за изменениями.
|
|
217
|
+
- `test:coverage` создаёт отчёты text, HTML и lcov через Istanbul.
|
|
218
|
+
- Дефолтные unit-тесты: `src` и `tests`, имена `*.test.*` и `*.spec.*`.
|
|
219
|
+
- UI unit-тесты используют happy-dom и React preset configs; lib unit-тесты — Node.js.
|
|
220
|
+
- Без тестов команда завершается с ошибкой.
|
|
221
|
+
- Playwright E2E использует `playwright/**/*.spec.*`, исключая `*.screenshots.spec.*`.
|
|
222
|
+
- Screenshot-suite использует `playwright/**/*.screenshots.spec.*`.
|
|
223
|
+
- Playwright сам запускает UI dev-server, а для библиотеки — Storybook, на заданном порту.
|
|
224
|
+
- Скриншоты сравниваются через `expect(page).toHaveScreenshot()`. Обновление существующих
|
|
225
|
+
эталонов — отдельное осознанное действие через `--update-snapshots`.
|
|
226
|
+
|
|
227
|
+
Для браузерных тестов нужен установленный Chromium соответствующей версии Playwright.
|
|
228
|
+
API тестов и типы stories доступны через builder, поэтому отдельные зависимости на
|
|
229
|
+
тестовые инструменты в проекте не обязательны:
|
|
230
|
+
|
|
231
|
+
```ts
|
|
232
|
+
// unit-тесты
|
|
233
|
+
import { test, expect } from '@koslibs/builder/rstest';
|
|
234
|
+
// Playwright-тесты (в другом файле)
|
|
235
|
+
import { test, expect } from '@koslibs/builder/playwright';
|
|
236
|
+
// типы stories
|
|
237
|
+
import type { Meta, StoryObj } from '@koslibs/builder/storybook';
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
Если используются прямые импорты `@playwright/test`, `@rstest/core` или
|
|
241
|
+
`storybook-react-rsbuild`, эти пакеты должны быть прямыми devDependencies проекта.
|
|
242
|
+
Builder сам разрешает исполняемые файлы своих инструментов и не полагается на глобальную установку.
|
|
243
|
+
|
|
244
|
+
Если проект имеет `rstest.config.*` или `playwright.config.*`, builder использует их.
|
|
245
|
+
В пользовательском Playwright-конфиге помечай screenshot-тесты тегом `@screenshots`:
|
|
246
|
+
builder выбирает E2E/screenshot-suite через grep. При таком конфиге запуск сервера
|
|
247
|
+
и остальные настройки контролирует сам проект. Общие фабрики доступны из
|
|
248
|
+
`@koslibs/builder/testing`, можно расширять их через обычные конфиги инструментов.
|
|
249
|
+
Тестовые и Storybook-флаги передаются дальше:
|
|
250
|
+
|
|
251
|
+
```sh
|
|
252
|
+
npm run test -- greeting
|
|
253
|
+
npm run test:e2e -- --list
|
|
254
|
+
npm run test:screenshots -- --update-snapshots
|
|
255
|
+
koslibs-builder ui:build --root ./frontend
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
## Переменные окружения
|
|
259
|
+
|
|
260
|
+
В UI загружаются `.env`, `.env.local`, `.env.development` / `.env.production` и их `.local` варианты.
|
|
261
|
+
Публичные переменные с префиксом `PUBLIC_` встраиваются в клиентскую сборку:
|
|
262
|
+
|
|
263
|
+
```dotenv
|
|
264
|
+
PUBLIC_API_URL=http://localhost:8081
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
```ts
|
|
268
|
+
const apiUrl = import.meta.env.PUBLIC_API_URL;
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
Это значения времени сборки. В production смена адреса требует пересборки.
|
|
272
|
+
Для runtime-настроек нужен отдельный механизм приложения. Секреты не должны иметь
|
|
273
|
+
префикс `PUBLIC_`: содержимое клиентского бандла доступно пользователям.
|
|
274
|
+
Для переиспользуемых библиотек builder не загружает `.env` автоматически.
|
|
275
|
+
Поведение описано в [документации Rsbuild](https://rsbuild.rs/guide/advanced/env-vars).
|
|
276
|
+
|
|
277
|
+
## Структура исходников
|
|
278
|
+
|
|
279
|
+
```text
|
|
280
|
+
src/
|
|
281
|
+
index.ts публичные типы builder
|
|
282
|
+
cli/
|
|
283
|
+
index.ts точка входа CLI
|
|
284
|
+
run.ts маршрутизация команд
|
|
285
|
+
args.ts разбор аргументов
|
|
286
|
+
commands.ts список команд
|
|
287
|
+
process.ts запуск и завершение процессов
|
|
288
|
+
handlers/ UI, библиотеки, Storybook, тесты, typecheck
|
|
289
|
+
configs/ загрузка, валидация, дефолты и настройки инструментов
|
|
290
|
+
typings/ интерфейсы, типы и клиентские декларации
|
|
291
|
+
utils/ общие функции для пакетов и shell-команд
|
|
292
|
+
storybook/ публичная точка входа @koslibs/builder/storybook
|
|
293
|
+
testing/ публичные точки входа testing, rstest и playwright
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
Тесты повторяют структуру модулей в `tests/cli` и `tests/configs`.
|
|
297
|
+
Сборка очищает `dist`, чтобы удалённые или перенесённые модули не попадали в npm-архив.
|
|
298
|
+
|
|
299
|
+
Архитектурные источники: [Rsbuild](https://rsbuild.dev/guide/faq/general),
|
|
300
|
+
[Rslib: сохранение структуры модулей](https://www.rslib.rs/config/lib/bundle),
|
|
301
|
+
[Storybook Rsbuild](https://storybook.rsbuild.rs/guide/configuration).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIpD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,SAAgB,GAAG,UAAU,CAoBzE"}
|
package/dist/cli/args.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
import { COMMANDS } from './commands.js';
|
|
3
|
+
export function parseArgs(argv, cwd = process.cwd()) {
|
|
4
|
+
const args = [...argv];
|
|
5
|
+
const command = args.shift();
|
|
6
|
+
if (!command || command === '--help' || command === '-h') {
|
|
7
|
+
return { root: cwd, help: true, args: [] };
|
|
8
|
+
}
|
|
9
|
+
if (!COMMANDS.includes(command)) {
|
|
10
|
+
throw new Error(`Unknown command "${command}". Run koslibs-builder --help.`);
|
|
11
|
+
}
|
|
12
|
+
let root = cwd;
|
|
13
|
+
const rootIndex = args.indexOf('--root');
|
|
14
|
+
if (rootIndex !== -1) {
|
|
15
|
+
const path = args[rootIndex + 1];
|
|
16
|
+
if (!path || path.startsWith('--')) {
|
|
17
|
+
throw new Error('--root requires a project directory.');
|
|
18
|
+
}
|
|
19
|
+
root = resolve(cwd, path);
|
|
20
|
+
args.splice(rootIndex, 2);
|
|
21
|
+
}
|
|
22
|
+
return { command, root, help: args.includes('--help') || args.includes('-h'), args };
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,UAAU,SAAS,CAAC,IAAc,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IACzD,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IACvB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACvD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAC/C,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,gCAAgC,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,IAAI,GAAG,GAAG,CAAC;IACf,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;AACzF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,UAkBpB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const COMMANDS = [
|
|
2
|
+
'ui:start',
|
|
3
|
+
'ui:build',
|
|
4
|
+
'ui:preview',
|
|
5
|
+
'ui:typecheck',
|
|
6
|
+
'lib:start',
|
|
7
|
+
'lib:watch',
|
|
8
|
+
'lib:build',
|
|
9
|
+
'lib:typecheck',
|
|
10
|
+
'storybook:start',
|
|
11
|
+
'storybook:build',
|
|
12
|
+
...['ui', 'lib'].flatMap((kind) => [
|
|
13
|
+
`${kind}:test`,
|
|
14
|
+
`${kind}:test:watch`,
|
|
15
|
+
`${kind}:test:coverage`,
|
|
16
|
+
`${kind}:test:e2e`,
|
|
17
|
+
`${kind}:test:screenshots`,
|
|
18
|
+
]),
|
|
19
|
+
];
|
|
20
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG;IACpB,UAAU;IACV,UAAU;IACV,YAAY;IACZ,cAAc;IACd,WAAW;IACX,WAAW;IACX,WAAW;IACX,eAAe;IACf,iBAAiB;IACjB,iBAAiB;IACjB,GAAI,CAAC,IAAI,EAAE,KAAK,CAAW,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC1C,GAAG,IAAI,OAAO;QACd,GAAG,IAAI,aAAa;QACpB,GAAG,IAAI,gBAAgB;QACvB,GAAG,IAAI,WAAW;QAClB,GAAG,IAAI,mBAAmB;KAC7B,CAAC;CACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"library.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/library.ts"],"names":[],"mappings":"AAKA,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAc7E"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { writeLibraryTsconfig } from '../../configs/generated.js';
|
|
2
|
+
import { createLibraryConfig } from '../../configs/library.js';
|
|
3
|
+
import { loadBuilderConfig } from '../../configs/load.js';
|
|
4
|
+
import { closeOnSignal } from '../process.js';
|
|
5
|
+
export async function runLibrary(command, root) {
|
|
6
|
+
const config = await loadBuilderConfig(root);
|
|
7
|
+
const { createRslib } = await import('@rslib/core');
|
|
8
|
+
await writeLibraryTsconfig(root);
|
|
9
|
+
const rslib = await createRslib({
|
|
10
|
+
cwd: root,
|
|
11
|
+
config: createLibraryConfig(config, root, command === 'lib:watch'),
|
|
12
|
+
});
|
|
13
|
+
const result = await rslib.build({ watch: command === 'lib:watch' });
|
|
14
|
+
if (command === 'lib:watch') {
|
|
15
|
+
closeOnSignal(() => result.close());
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
await result.close();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=library.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"library.js","sourceRoot":"","sources":["../../../src/cli/handlers/library.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,IAAY;IAC1D,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IACpD,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC;QAC5B,GAAG,EAAE,IAAI;QACT,MAAM,EAAE,mBAAmB,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,WAAW,CAAC;KACrE,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,KAAK,WAAW,EAAE,CAAC,CAAC;IACrE,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;QAC1B,aAAa,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACJ,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storybook.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/storybook.ts"],"names":[],"mappings":"AAQA,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBjG"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
import { DEFAULT_PORT } from '../../configs/defaults.js';
|
|
3
|
+
import { writeGeneratedConfig } from '../../configs/generated.js';
|
|
4
|
+
import { loadBuilderConfig } from '../../configs/load.js';
|
|
5
|
+
import { packageBin } from '../../utils/packages.js';
|
|
6
|
+
import { runNode } from '../process.js';
|
|
7
|
+
export async function runStorybook(command, root, args) {
|
|
8
|
+
const config = await loadBuilderConfig(root);
|
|
9
|
+
const generated = await writeGeneratedConfig(root, 'storybook', `import { createStorybookConfig } from ${JSON.stringify(new URL('../../storybook/index.js', import.meta.url).href)};\n` +
|
|
10
|
+
`export default await createStorybookConfig(${JSON.stringify(root)});\n`);
|
|
11
|
+
const dev = command.endsWith(':start');
|
|
12
|
+
const flags = dev
|
|
13
|
+
? [
|
|
14
|
+
'dev',
|
|
15
|
+
'--port',
|
|
16
|
+
String(config.port ?? config.rsbuildConfig?.server?.port ?? DEFAULT_PORT),
|
|
17
|
+
'--exact-port',
|
|
18
|
+
'--no-open',
|
|
19
|
+
]
|
|
20
|
+
: ['build', '--output-dir', resolve(root, 'storybook-static')];
|
|
21
|
+
return runNode(packageBin('storybook', 'storybook'), [...flags, '--config-dir', generated.directory, '--disable-telemetry', ...args], root);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=storybook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storybook.js","sourceRoot":"","sources":["../../../src/cli/handlers/storybook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,IAAY,EAAE,IAAc;IAC5E,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,MAAM,oBAAoB,CACxC,IAAI,EACJ,WAAW,EACX,yCAAyC,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,0BAA0B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK;QACnH,8CAA8C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAC/E,CAAC;IACF,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,GAAG;QACb,CAAC,CAAC;YACI,KAAK;YACL,QAAQ;YACR,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,IAAI,YAAY,CAAC;YACzE,cAAc;YACd,WAAW;SACd;QACH,CAAC,CAAC,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC;IACnE,OAAO,OAAO,CACV,UAAU,CAAC,WAAW,EAAE,WAAW,CAAC,EACpC,CAAC,GAAG,KAAK,EAAE,cAAc,EAAE,SAAS,CAAC,SAAS,EAAE,qBAAqB,EAAE,GAAG,IAAI,CAAC,EAC/E,IAAI,CACP,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tests.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/tests.ts"],"names":[],"mappings":"AAMA,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA6C7F"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { findTestConfig } from '../../configs/find-test.js';
|
|
2
|
+
import { writeGeneratedConfig } from '../../configs/generated.js';
|
|
3
|
+
import { packageBin } from '../../utils/packages.js';
|
|
4
|
+
import { runNode } from '../process.js';
|
|
5
|
+
export async function runTests(command, root, args) {
|
|
6
|
+
const [kind] = command.split(':');
|
|
7
|
+
const browser = command.endsWith(':e2e') || command.endsWith(':screenshots');
|
|
8
|
+
let file = findTestConfig(root, browser ? 'playwright' : 'rstest');
|
|
9
|
+
if (!file) {
|
|
10
|
+
const module = new URL('../../testing/index.js', import.meta.url).href;
|
|
11
|
+
const expression = browser
|
|
12
|
+
? `await createBrowserTestConfig(${JSON.stringify(kind)}, ${JSON.stringify(command.endsWith(':screenshots') ? 'screenshots' : 'e2e')}, ${JSON.stringify(root)})`
|
|
13
|
+
: `createUnitTestConfig(${JSON.stringify(kind)}, ${JSON.stringify(root)})`;
|
|
14
|
+
const generated = await writeGeneratedConfig(root, browser ? 'playwright' : 'rstest', `import { createBrowserTestConfig, createUnitTestConfig } from ${JSON.stringify(module)};\n` +
|
|
15
|
+
`export default ${expression};\n`);
|
|
16
|
+
file = generated.file;
|
|
17
|
+
}
|
|
18
|
+
if (browser) {
|
|
19
|
+
const filter = command.endsWith(':screenshots')
|
|
20
|
+
? ['--grep', '@screenshots']
|
|
21
|
+
: ['--grep-invert', '@screenshots'];
|
|
22
|
+
// Generated configs select by filename; custom configs use the shared @screenshots tag.
|
|
23
|
+
return runNode(packageBin('@playwright/test', 'playwright'), [
|
|
24
|
+
'test',
|
|
25
|
+
'--config',
|
|
26
|
+
file,
|
|
27
|
+
...(findTestConfig(root, 'playwright') ? filter : []),
|
|
28
|
+
...args,
|
|
29
|
+
], root);
|
|
30
|
+
}
|
|
31
|
+
return runNode(packageBin('@rstest/core', 'rstest'), [
|
|
32
|
+
command.endsWith(':watch') ? 'watch' : 'run',
|
|
33
|
+
'--config',
|
|
34
|
+
file,
|
|
35
|
+
...(command.endsWith(':coverage') ? ['--coverage'] : []),
|
|
36
|
+
...args,
|
|
37
|
+
], root);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=tests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tests.js","sourceRoot":"","sources":["../../../src/cli/handlers/tests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAElE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAe,EAAE,IAAY,EAAE,IAAc;IACxE,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAkB,CAAC;IACnD,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC7E,IAAI,IAAI,GAAG,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACnE,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,wBAAwB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACvE,MAAM,UAAU,GAAG,OAAO;YACtB,CAAC,CAAC,iCAAiC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG;YAChK,CAAC,CAAC,wBAAwB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;QAC/E,MAAM,SAAS,GAAG,MAAM,oBAAoB,CACxC,IAAI,EACJ,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,EACjC,iEAAiE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK;YACxF,kBAAkB,UAAU,KAAK,CACxC,CAAC;QACF,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;IAC1B,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACV,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC3C,CAAC,CAAC,CAAC,QAAQ,EAAE,cAAc,CAAC;YAC5B,CAAC,CAAC,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;QACxC,wFAAwF;QACxF,OAAO,OAAO,CACV,UAAU,CAAC,kBAAkB,EAAE,YAAY,CAAC,EAC5C;YACI,MAAM;YACN,UAAU;YACV,IAAI;YACJ,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,GAAG,IAAI;SACV,EACD,IAAI,CACP,CAAC;IACN,CAAC;IACD,OAAO,OAAO,CACV,UAAU,CAAC,cAAc,EAAE,QAAQ,CAAC,EACpC;QACI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;QAC5C,UAAU;QACV,IAAI;QACJ,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,GAAG,IAAI;KACV,EACD,IAAI,CACP,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typecheck.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/typecheck.ts"],"names":[],"mappings":"AAGA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAM7D"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { packageBin } from '../../utils/packages.js';
|
|
2
|
+
import { runNode } from '../process.js';
|
|
3
|
+
export async function typecheck(root) {
|
|
4
|
+
return runNode(packageBin('typescript', 'tsc'), ['--project', 'tsconfig.json', '--noEmit'], root);
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=typecheck.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typecheck.js","sourceRoot":"","sources":["../../../src/cli/handlers/typecheck.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY;IACxC,OAAO,OAAO,CACV,UAAU,CAAC,YAAY,EAAE,KAAK,CAAC,EAC/B,CAAC,WAAW,EAAE,eAAe,EAAE,UAAU,CAAC,EAC1C,IAAI,CACP,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/ui.ts"],"names":[],"mappings":"AAIA,wBAAsB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBxE"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { loadBuilderConfig } from '../../configs/load.js';
|
|
2
|
+
import { createUiConfig } from '../../configs/ui.js';
|
|
3
|
+
import { closeOnSignal } from '../process.js';
|
|
4
|
+
export async function runUi(command, root) {
|
|
5
|
+
const config = await loadBuilderConfig(root);
|
|
6
|
+
const { createRsbuild } = await import('@rsbuild/core');
|
|
7
|
+
const rsbuild = await createRsbuild({
|
|
8
|
+
cwd: root,
|
|
9
|
+
rsbuildConfig: createUiConfig(config, root),
|
|
10
|
+
loadEnv: true,
|
|
11
|
+
});
|
|
12
|
+
if (command === 'ui:start') {
|
|
13
|
+
const result = await rsbuild.startDevServer();
|
|
14
|
+
closeOnSignal(() => result.server.close());
|
|
15
|
+
}
|
|
16
|
+
else if (command === 'ui:preview') {
|
|
17
|
+
const result = await rsbuild.preview();
|
|
18
|
+
closeOnSignal(() => result.server.close());
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
const result = await rsbuild.build();
|
|
22
|
+
await result.close();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../../src/cli/handlers/ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,OAAe,EAAE,IAAY;IACrD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC;QAChC,GAAG,EAAE,IAAI;QACT,aAAa,EAAE,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC;QAC3C,OAAO,EAAE,IAAI;KAChB,CAAC,CAAC;IACH,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC;QAC9C,aAAa,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/C,CAAC;SAAM,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACvC,aAAa,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACrC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { runCli } from './run.js';
|
|
3
|
+
try {
|
|
4
|
+
process.exitCode = await runCli();
|
|
5
|
+
}
|
|
6
|
+
catch (error) {
|
|
7
|
+
console.error(`[koslibs-builder] ${error instanceof Error ? error.message : String(error)}`);
|
|
8
|
+
process.exitCode = 1;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,IAAI,CAAC;IACD,OAAO,CAAC,QAAQ,GAAG,MAAM,MAAM,EAAE,CAAC;AACtC,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACb,OAAO,CAAC,KAAK,CAAC,qBAAqB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/cli/process.ts"],"names":[],"mappings":"AAEA,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBlF;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAgB9D"}
|