@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.
Files changed (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +301 -0
  3. package/dist/cli/args.d.ts +3 -0
  4. package/dist/cli/args.d.ts.map +1 -0
  5. package/dist/cli/args.js +24 -0
  6. package/dist/cli/args.js.map +1 -0
  7. package/dist/cli/commands.d.ts +2 -0
  8. package/dist/cli/commands.d.ts.map +1 -0
  9. package/dist/cli/commands.js +20 -0
  10. package/dist/cli/commands.js.map +1 -0
  11. package/dist/cli/handlers/library.d.ts +2 -0
  12. package/dist/cli/handlers/library.d.ts.map +1 -0
  13. package/dist/cli/handlers/library.js +21 -0
  14. package/dist/cli/handlers/library.js.map +1 -0
  15. package/dist/cli/handlers/storybook.d.ts +2 -0
  16. package/dist/cli/handlers/storybook.d.ts.map +1 -0
  17. package/dist/cli/handlers/storybook.js +23 -0
  18. package/dist/cli/handlers/storybook.js.map +1 -0
  19. package/dist/cli/handlers/tests.d.ts +2 -0
  20. package/dist/cli/handlers/tests.d.ts.map +1 -0
  21. package/dist/cli/handlers/tests.js +39 -0
  22. package/dist/cli/handlers/tests.js.map +1 -0
  23. package/dist/cli/handlers/typecheck.d.ts +2 -0
  24. package/dist/cli/handlers/typecheck.d.ts.map +1 -0
  25. package/dist/cli/handlers/typecheck.js +6 -0
  26. package/dist/cli/handlers/typecheck.js.map +1 -0
  27. package/dist/cli/handlers/ui.d.ts +2 -0
  28. package/dist/cli/handlers/ui.d.ts.map +1 -0
  29. package/dist/cli/handlers/ui.js +25 -0
  30. package/dist/cli/handlers/ui.js.map +1 -0
  31. package/dist/cli/index.d.ts +3 -0
  32. package/dist/cli/index.d.ts.map +1 -0
  33. package/dist/cli/index.js +10 -0
  34. package/dist/cli/index.js.map +1 -0
  35. package/dist/cli/process.d.ts +3 -0
  36. package/dist/cli/process.d.ts.map +1 -0
  37. package/dist/cli/process.js +36 -0
  38. package/dist/cli/process.js.map +1 -0
  39. package/dist/cli/run.d.ts +2 -0
  40. package/dist/cli/run.d.ts.map +1 -0
  41. package/dist/cli/run.js +54 -0
  42. package/dist/cli/run.js.map +1 -0
  43. package/dist/configs/browser-tests.d.ts +4 -0
  44. package/dist/configs/browser-tests.d.ts.map +1 -0
  45. package/dist/configs/browser-tests.js +29 -0
  46. package/dist/configs/browser-tests.js.map +1 -0
  47. package/dist/configs/defaults.d.ts +5 -0
  48. package/dist/configs/defaults.d.ts.map +1 -0
  49. package/dist/configs/defaults.js +15 -0
  50. package/dist/configs/defaults.js.map +1 -0
  51. package/dist/configs/find-test.d.ts +2 -0
  52. package/dist/configs/find-test.d.ts.map +1 -0
  53. package/dist/configs/find-test.js +8 -0
  54. package/dist/configs/find-test.js.map +1 -0
  55. package/dist/configs/generated.d.ts +6 -0
  56. package/dist/configs/generated.d.ts.map +1 -0
  57. package/dist/configs/generated.js +21 -0
  58. package/dist/configs/generated.js.map +1 -0
  59. package/dist/configs/library.d.ts +4 -0
  60. package/dist/configs/library.d.ts.map +1 -0
  61. package/dist/configs/library.js +34 -0
  62. package/dist/configs/library.js.map +1 -0
  63. package/dist/configs/load.d.ts +3 -0
  64. package/dist/configs/load.d.ts.map +1 -0
  65. package/dist/configs/load.js +13 -0
  66. package/dist/configs/load.js.map +1 -0
  67. package/dist/configs/normalize.d.ts +3 -0
  68. package/dist/configs/normalize.d.ts.map +1 -0
  69. package/dist/configs/normalize.js +24 -0
  70. package/dist/configs/normalize.js.map +1 -0
  71. package/dist/configs/storybook.d.ts +6 -0
  72. package/dist/configs/storybook.d.ts.map +1 -0
  73. package/dist/configs/storybook.js +36 -0
  74. package/dist/configs/storybook.js.map +1 -0
  75. package/dist/configs/typescript.d.ts +3 -0
  76. package/dist/configs/typescript.d.ts.map +1 -0
  77. package/dist/configs/typescript.js +13 -0
  78. package/dist/configs/typescript.js.map +1 -0
  79. package/dist/configs/ui.d.ts +4 -0
  80. package/dist/configs/ui.d.ts.map +1 -0
  81. package/dist/configs/ui.js +28 -0
  82. package/dist/configs/ui.js.map +1 -0
  83. package/dist/configs/unit-tests.d.ts +4 -0
  84. package/dist/configs/unit-tests.d.ts.map +1 -0
  85. package/dist/configs/unit-tests.js +14 -0
  86. package/dist/configs/unit-tests.js.map +1 -0
  87. package/dist/index.d.ts +2 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +2 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/storybook/index.d.ts +3 -0
  92. package/dist/storybook/index.d.ts.map +1 -0
  93. package/dist/storybook/index.js +2 -0
  94. package/dist/storybook/index.js.map +1 -0
  95. package/dist/testing/index.d.ts +5 -0
  96. package/dist/testing/index.d.ts.map +1 -0
  97. package/dist/testing/index.js +4 -0
  98. package/dist/testing/index.js.map +1 -0
  99. package/dist/testing/playwright.d.ts +2 -0
  100. package/dist/testing/playwright.d.ts.map +1 -0
  101. package/dist/testing/playwright.js +2 -0
  102. package/dist/testing/playwright.js.map +1 -0
  103. package/dist/testing/rstest.d.ts +2 -0
  104. package/dist/testing/rstest.d.ts.map +1 -0
  105. package/dist/testing/rstest.js +2 -0
  106. package/dist/testing/rstest.js.map +1 -0
  107. package/dist/typings/cli.d.ts +7 -0
  108. package/dist/typings/cli.d.ts.map +1 -0
  109. package/dist/typings/cli.js +2 -0
  110. package/dist/typings/cli.js.map +1 -0
  111. package/dist/typings/client.d.ts +3 -0
  112. package/dist/typings/client.d.ts.map +1 -0
  113. package/dist/typings/client.js +3 -0
  114. package/dist/typings/client.js.map +1 -0
  115. package/dist/typings/config.d.ts +9 -0
  116. package/dist/typings/config.d.ts.map +1 -0
  117. package/dist/typings/config.js +2 -0
  118. package/dist/typings/config.js.map +1 -0
  119. package/dist/typings/index.d.ts +5 -0
  120. package/dist/typings/index.d.ts.map +1 -0
  121. package/dist/typings/index.js +2 -0
  122. package/dist/typings/index.js.map +1 -0
  123. package/dist/typings/packages.d.ts +4 -0
  124. package/dist/typings/packages.d.ts.map +1 -0
  125. package/dist/typings/packages.js +2 -0
  126. package/dist/typings/packages.js.map +1 -0
  127. package/dist/typings/storybook.d.ts +2 -0
  128. package/dist/typings/storybook.d.ts.map +1 -0
  129. package/dist/typings/storybook.js +2 -0
  130. package/dist/typings/storybook.js.map +1 -0
  131. package/dist/typings/testing.d.ts +3 -0
  132. package/dist/typings/testing.d.ts.map +1 -0
  133. package/dist/typings/testing.js +2 -0
  134. package/dist/typings/testing.js.map +1 -0
  135. package/dist/utils/packages.d.ts +3 -0
  136. package/dist/utils/packages.d.ts.map +1 -0
  137. package/dist/utils/packages.js +17 -0
  138. package/dist/utils/packages.js.map +1 -0
  139. package/dist/utils/shell.d.ts +2 -0
  140. package/dist/utils/shell.d.ts.map +1 -0
  141. package/dist/utils/shell.js +7 -0
  142. package/dist/utils/shell.js.map +1 -0
  143. 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,3 @@
1
+ import type { CliOptions } from '../typings/cli.js';
2
+ export declare function parseArgs(argv: string[], cwd?: string): CliOptions;
3
+ //# sourceMappingURL=args.d.ts.map
@@ -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"}
@@ -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,2 @@
1
+ export declare const COMMANDS: string[];
2
+ //# sourceMappingURL=commands.d.ts.map
@@ -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,2 @@
1
+ export declare function runLibrary(command: string, root: string): Promise<void>;
2
+ //# sourceMappingURL=library.d.ts.map
@@ -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,2 @@
1
+ export declare function runStorybook(command: string, root: string, args: string[]): Promise<number>;
2
+ //# sourceMappingURL=storybook.d.ts.map
@@ -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,2 @@
1
+ export declare function runTests(command: string, root: string, args: string[]): Promise<number>;
2
+ //# sourceMappingURL=tests.d.ts.map
@@ -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,2 @@
1
+ export declare function typecheck(root: string): Promise<number>;
2
+ //# sourceMappingURL=typecheck.d.ts.map
@@ -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,2 @@
1
+ export declare function runUi(command: string, root: string): Promise<void>;
2
+ //# sourceMappingURL=ui.d.ts.map
@@ -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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ export declare function runNode(bin: string, args: string[], root: string): Promise<number>;
2
+ export declare function closeOnSignal(close: () => Promise<void>): void;
3
+ //# sourceMappingURL=process.d.ts.map
@@ -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"}