@boristype/bt-cli 0.1.0-alpha.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 +66 -0
- package/build/builder/config.js +88 -0
- package/build/cli/commands/artifact.js +14 -0
- package/build/cli/commands/build.js +25 -0
- package/build/cli/commands/dev.js +190 -0
- package/build/cli/commands/index.js +18 -0
- package/build/cli/commands/init.js +15 -0
- package/build/cli/commands/link.js +18 -0
- package/build/cli/commands/push.js +28 -0
- package/build/cli/index.js +14 -0
- package/build/cli/types.js +2 -0
- package/build/core/artifacting/context.js +54 -0
- package/build/core/artifacting/index.js +37 -0
- package/build/core/artifacting/stages/index.js +10 -0
- package/build/core/artifacting/stages/main-archive.js +72 -0
- package/build/core/artifacting/stages/validate.js +70 -0
- package/build/core/artifacting/types.js +6 -0
- package/build/core/artifacting/utils/index.js +10 -0
- package/build/core/artifacting/utils/zip.js +94 -0
- package/build/core/babel.js +96 -0
- package/build/core/btconfig.types.js +6 -0
- package/build/core/build.js +280 -0
- package/build/core/building/compile-mode.js +146 -0
- package/build/core/building/compiler.js +281 -0
- package/build/core/building/coordinator.js +71 -0
- package/build/core/building/files.js +290 -0
- package/build/core/building/index.js +102 -0
- package/build/core/building/output.js +92 -0
- package/build/core/building/transformers.js +110 -0
- package/build/core/building/types.js +19 -0
- package/build/core/config.js +157 -0
- package/build/core/dependencies.js +223 -0
- package/build/core/linking/cache.js +260 -0
- package/build/core/linking/context.js +149 -0
- package/build/core/linking/dependencies.js +240 -0
- package/build/core/linking/executables.js +61 -0
- package/build/core/linking/generators/api-ext.js +57 -0
- package/build/core/linking/generators/component.js +83 -0
- package/build/core/linking/generators/filemap.js +53 -0
- package/build/core/linking/generators/index.js +21 -0
- package/build/core/linking/generators/init-xml.js +37 -0
- package/build/core/linking/generators/package-json.js +50 -0
- package/build/core/linking/index.js +213 -0
- package/build/core/linking/linkers/component.js +175 -0
- package/build/core/linking/linkers/index.js +69 -0
- package/build/core/linking/linkers/standalone.js +144 -0
- package/build/core/linking/linkers/system.js +86 -0
- package/build/core/linking/parsers.js +278 -0
- package/build/core/linking/types.js +6 -0
- package/build/core/linking/utils/copy.js +101 -0
- package/build/core/linking/utils/index.js +26 -0
- package/build/core/linking/utils/node-modules.js +226 -0
- package/build/core/linking/utils/package-type.js +101 -0
- package/build/core/linking/utils/url.js +73 -0
- package/build/core/linking/utils/write.js +91 -0
- package/build/core/logger.js +10 -0
- package/build/core/pushing/config.js +90 -0
- package/build/core/pushing/index.js +96 -0
- package/build/core/pushing/init-scripts.js +173 -0
- package/build/core/pushing/queue.js +95 -0
- package/build/core/pushing/reinit.js +61 -0
- package/build/core/pushing/session.js +167 -0
- package/build/core/pushing/types.js +6 -0
- package/build/core/pushing/upload.js +35 -0
- package/build/core/tsconfig.js +78 -0
- package/build/core/utils/index.js +17 -0
- package/build/core/utils/logger.js +46 -0
- package/build/core/utils/properties.js +81 -0
- package/build/core/utils/xml.js +44 -0
- package/build/core/utils.js +59 -0
- package/build/index.js +76 -0
- package/build/plugins/destructuring.js +83 -0
- package/build/plugins/forOfToForIn.js +14 -0
- package/build/plugins/loopHoistVariables.js +160 -0
- package/build/plugins/precedence.js +172 -0
- package/build/plugins/removeImportExport.js +42 -0
- package/build/plugins/replaceDollar.js +16 -0
- package/build/plugins/spreadArray.js +42 -0
- package/build/plugins/spreadObject.js +91 -0
- package/build/transformers/arrayFunctional.js +467 -0
- package/build/transformers/arrayGeneral.js +222 -0
- package/build/transformers/blockScoping.js +212 -0
- package/build/transformers/destructuring.js +133 -0
- package/build/transformers/dirname.js +79 -0
- package/build/transformers/enumsToObjects.js +25 -0
- package/build/transformers/execObj.js +220 -0
- package/build/transformers/forOfToForIn.js +45 -0
- package/build/transformers/funcSemantic.js +113 -0
- package/build/transformers/functions.js +270 -0
- package/build/transformers/globalCache.js +34 -0
- package/build/transformers/loopHoistVariables.js +352 -0
- package/build/transformers/math.js +39 -0
- package/build/transformers/namespaces.js +22 -0
- package/build/transformers/numericSeparator.js +46 -0
- package/build/transformers/objectProperties.js +54 -0
- package/build/transformers/precedence.js +192 -0
- package/build/transformers/propSemantic.js +467 -0
- package/build/transformers/remodule.js +620 -0
- package/build/transformers/removeImportExport.js +135 -0
- package/build/transformers/replaceDollar.js +46 -0
- package/build/transformers/shorthandProperties.js +34 -0
- package/build/transformers/spreadArray.js +68 -0
- package/build/transformers/spreadObject.js +134 -0
- package/build/transformers/string.js +138 -0
- package/build/transformers/templateLiterals.js +104 -0
- package/build/transformers/tocodelibrary.js +178 -0
- package/build/transformers/utils.js +202 -0
- package/build/wshcm/client.js +193 -0
- package/build/wshcm/evaluator.js +111 -0
- package/build/wshcm/exceptions.js +25 -0
- package/build/wshcm/index.js +20 -0
- package/build/wshcm/soap-utils.js +228 -0
- package/build/wshcm/types.js +2 -0
- package/build/wshcm/uploader.js +320 -0
- package/package.json +51 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 BorisType
|
|
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,66 @@
|
|
|
1
|
+
# btc — BorisType Compiler
|
|
2
|
+
|
|
3
|
+
Транспилятор TypeScript → BorisScript для платформы WebSoft HCM.
|
|
4
|
+
|
|
5
|
+
Использует [bt-ir](../bt-ir/) для emit: TypeScript Compiler API создаёт Program с `noEmit: true`, а кодогенерация выполняется через `compileSourceFile()` из bt-ir.
|
|
6
|
+
|
|
7
|
+
## CLI-команды
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
btc init # Создать проект (scaffold)
|
|
11
|
+
btc build # Однократная сборка
|
|
12
|
+
btc dev # Watch mode с инкрементальной компиляцией и авто-линковкой
|
|
13
|
+
btc link # Линковка модулей в dist/
|
|
14
|
+
btc push # Деплой dist/ на сервер WSHCM
|
|
15
|
+
btc artifact # Создание артефакта для развёртывания
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Структура `src/`
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
src/
|
|
22
|
+
├── index.ts # Точка входа (CLI bootstrap)
|
|
23
|
+
├── cli/ # Тонкие обёртки над commander
|
|
24
|
+
│ ├── index.ts # Регистрация команд
|
|
25
|
+
│ └── commands/ # Обработчики CLI-команд
|
|
26
|
+
├── core/ # Вся бизнес-логика
|
|
27
|
+
│ ├── config.ts # Чтение tsconfig / btconfig
|
|
28
|
+
│ ├── logger.ts # Re-export логгера
|
|
29
|
+
│ ├── utils/ # Общие утилиты
|
|
30
|
+
│ │ ├── logger.ts # Logger (singleton)
|
|
31
|
+
│ │ ├── properties.ts # Парсер .properties файлов
|
|
32
|
+
│ │ └── xml.ts # Общие XML builder/parser
|
|
33
|
+
│ ├── building/ # Компиляция TS → BS
|
|
34
|
+
│ │ ├── compiler.ts # Program + emit через bt-ir
|
|
35
|
+
│ │ ├── compile-mode.ts # Определение режима файла (module/script)
|
|
36
|
+
│ │ ├── coordinator.ts # Координатор dev mode (multi-package)
|
|
37
|
+
│ │ ├── files.ts # Копирование non-TS файлов
|
|
38
|
+
│ │ ├── output.ts # Пост-обработка вывода
|
|
39
|
+
│ │ └── types.ts # BuildContext, BuildResult, BtcCompileOptions
|
|
40
|
+
│ ├── linking/ # Сборка dist/ из модулей
|
|
41
|
+
│ │ ├── index.ts # Pipeline: resolve → link → finalize
|
|
42
|
+
│ │ ├── parsers.ts # Парсеры PackageInfo
|
|
43
|
+
│ │ ├── executables.ts # Сбор executables
|
|
44
|
+
│ │ ├── dependencies.ts # Дерево зависимостей
|
|
45
|
+
│ │ ├── cache.ts # Кэширование линковки
|
|
46
|
+
│ │ ├── context.ts # LinkingContext
|
|
47
|
+
│ │ ├── types.ts # PackageInfo, LinkingOptions
|
|
48
|
+
│ │ ├── linkers/ # Линковщики по типу пакета
|
|
49
|
+
│ │ ├── generators/ # Генерация api_ext.xml, init.xml и т.д.
|
|
50
|
+
│ │ └── utils/ # URL, copy, node_modules
|
|
51
|
+
│ ├── pushing/ # Деплой на сервер WSHCM
|
|
52
|
+
│ │ ├── session.ts # DeploySession (с retry/reconnect)
|
|
53
|
+
│ │ ├── upload.ts # Загрузка файлов
|
|
54
|
+
│ │ ├── config.ts # Чтение btconfig.properties
|
|
55
|
+
│ │ ├── queue.ts # DebouncedPushQueue для dev mode
|
|
56
|
+
│ │ └── reinit.ts # Реинициализация на сервере
|
|
57
|
+
│ └── artifacting/ # Создание архивов для деплоя
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Сборка
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
npm run build # tsc → build/
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Требуется Node.js 22+.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.getTSConfig = getTSConfig;
|
|
40
|
+
exports.getBTConfig = getBTConfig;
|
|
41
|
+
const typescript_1 = __importDefault(require("typescript"));
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const logger_1 = require("../core/logger");
|
|
45
|
+
function getTSConfig(cwd, project = 'tsconfig.json') {
|
|
46
|
+
const tsconfigPath = typescript_1.default.findConfigFile(cwd, typescript_1.default.sys.fileExists, project);
|
|
47
|
+
if (!tsconfigPath) {
|
|
48
|
+
logger_1.logger.error(`There is no any configuration files at "${cwd}". Execute npx tsc -init to create a new one.`);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
const { config, error } = typescript_1.default.readConfigFile(tsconfigPath, typescript_1.default.sys.readFile);
|
|
52
|
+
if (error) {
|
|
53
|
+
logger_1.logger.error(error.messageText.toString());
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
// Используем директорию tsconfig.json как базу для резолва путей
|
|
57
|
+
const configDir = path.dirname(tsconfigPath);
|
|
58
|
+
const configFileContent = typescript_1.default.parseJsonConfigFileContent(config, typescript_1.default.sys, configDir);
|
|
59
|
+
if (configFileContent.errors.length > 0) {
|
|
60
|
+
configFileContent.errors.forEach(diagnostic => {
|
|
61
|
+
logger_1.logger.error(diagnostic.messageText.toString());
|
|
62
|
+
});
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
return configFileContent;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Читает и парсит btconfig.json
|
|
69
|
+
* @param cwd Рабочая директория
|
|
70
|
+
* @param project Имя файла конфигурации (по умолчанию btconfig.json)
|
|
71
|
+
* @returns Объект конфигурации BtConfig или undefined если файл не найден
|
|
72
|
+
*/
|
|
73
|
+
function getBTConfig(cwd, project = 'btconfig.json') {
|
|
74
|
+
const btconfigPath = path.join(cwd, project);
|
|
75
|
+
// Если файл не существует, возвращаем undefined
|
|
76
|
+
if (!fs.existsSync(btconfigPath)) {
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
const configContent = fs.readFileSync(btconfigPath, 'utf-8');
|
|
81
|
+
const config = JSON.parse(configContent);
|
|
82
|
+
return config;
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
logger_1.logger.error(`Error reading or parsing ${project}: ${error}`);
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.artifactCommand = artifactCommand;
|
|
4
|
+
const artifacting_1 = require("../../core/artifacting");
|
|
5
|
+
/**
|
|
6
|
+
* Команда artifact - создание архивов для поставки
|
|
7
|
+
* Создаёт zip-архив из директории dist
|
|
8
|
+
*
|
|
9
|
+
* @param options - Опции команды
|
|
10
|
+
*/
|
|
11
|
+
async function artifactCommand(options = {}) {
|
|
12
|
+
const cwd = process.cwd();
|
|
13
|
+
await (0, artifacting_1.processArtifact)(cwd, { clean: options.clean ?? false });
|
|
14
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildCommand = buildCommand;
|
|
4
|
+
const config_js_1 = require("../../core/config.js");
|
|
5
|
+
const index_js_1 = require("../../core/building/index.js");
|
|
6
|
+
/**
|
|
7
|
+
* Команда build - транспиляция TypeScript в BorisScript
|
|
8
|
+
*
|
|
9
|
+
* @param files - Список файлов для компиляции (пустой = все файлы из tsconfig)
|
|
10
|
+
* @param options - Опции компиляции
|
|
11
|
+
*/
|
|
12
|
+
async function buildCommand(files, options) {
|
|
13
|
+
const cwd = process.cwd();
|
|
14
|
+
const tsConfig = (0, config_js_1.getTSConfig)(cwd, 'tsconfig.json');
|
|
15
|
+
const _btConfig = (0, config_js_1.getBTConfig)(cwd, 'btconfig.json'); // TODO: использовать в будущем
|
|
16
|
+
const result = index_js_1.BuildPipeline.run({
|
|
17
|
+
tsConfig,
|
|
18
|
+
options,
|
|
19
|
+
files,
|
|
20
|
+
cwd,
|
|
21
|
+
});
|
|
22
|
+
if (!result.success) {
|
|
23
|
+
process.exitCode = 1;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.devCommand = devCommand;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const logger_1 = require("../../core/logger");
|
|
40
|
+
const index_1 = require("../../core/linking/index");
|
|
41
|
+
const config_1 = require("../../core/config");
|
|
42
|
+
const index_2 = require("../../core/building/index");
|
|
43
|
+
const index_3 = require("../../core/pushing/index");
|
|
44
|
+
const queue_1 = require("../../core/pushing/queue");
|
|
45
|
+
const coordinator_1 = require("../../core/building/coordinator");
|
|
46
|
+
/**
|
|
47
|
+
* Команда dev - режим разработки с watch
|
|
48
|
+
*
|
|
49
|
+
* Использует TypeScript watch API для инкрементальной компиляции.
|
|
50
|
+
* Координирует сборку и линковку для multi-package проектов:
|
|
51
|
+
* 1. Запускает watch для всех пакетов
|
|
52
|
+
* 2. Ждёт завершения initial build всех пакетов
|
|
53
|
+
* 3. Выполняет полную линковку
|
|
54
|
+
* 4. Переходит в инкрементальный режим
|
|
55
|
+
*/
|
|
56
|
+
async function devCommand(options = {}) {
|
|
57
|
+
const projectPath = process.cwd();
|
|
58
|
+
const enablePush = options.push !== false;
|
|
59
|
+
logger_1.logger.info('🔧 Starting dev mode...');
|
|
60
|
+
// 1. Получаем пакеты для линковки
|
|
61
|
+
const packages = (0, index_1.resolvePackagesToLink)(projectPath);
|
|
62
|
+
logger_1.logger.info(`📦 Found ${packages.length} package(s) to process`);
|
|
63
|
+
// 2. Фильтруем только ws:package пакеты (не статический контент)
|
|
64
|
+
const watchPackages = resolveWatchPackages(projectPath, packages);
|
|
65
|
+
if (watchPackages.length === 0) {
|
|
66
|
+
logger_1.logger.warning('⚠️ No ws:package packages found to watch');
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
logger_1.logger.info(`👀 Watching ${watchPackages.length} package(s):`);
|
|
70
|
+
for (const pkg of watchPackages) {
|
|
71
|
+
logger_1.logger.info(` - ${pkg.wsName} (${pkg.packageType}) at ${pkg.name}`);
|
|
72
|
+
}
|
|
73
|
+
// 3. Создаём координатор
|
|
74
|
+
let pushQueue = null;
|
|
75
|
+
if (enablePush) {
|
|
76
|
+
logger_1.logger.info('📤 Auto-push enabled (use --no-push to disable)');
|
|
77
|
+
const connectionOptions = (0, index_3.resolvePushConnectionOptions)(projectPath);
|
|
78
|
+
logger_1.logger.info(`📡 Server: ${connectionOptions.https ? 'https' : 'http'}://${connectionOptions.host}:${connectionOptions.port}`);
|
|
79
|
+
const distPath = path.join(projectPath, 'dist');
|
|
80
|
+
const session = new index_3.DeploySession(connectionOptions);
|
|
81
|
+
pushQueue = new queue_1.DebouncedPushQueue(session, distPath);
|
|
82
|
+
}
|
|
83
|
+
const coordinator = new coordinator_1.DevCoordinator(projectPath, watchPackages, packages, pushQueue);
|
|
84
|
+
// 4. Запускаем watchers для каждого пакета
|
|
85
|
+
logger_1.logger.info('🔨 Starting initial build...');
|
|
86
|
+
const watchers = [];
|
|
87
|
+
for (const pkg of watchPackages) {
|
|
88
|
+
const watcher = startPackageWatch(pkg, coordinator);
|
|
89
|
+
if (watcher) {
|
|
90
|
+
watchers.push(watcher);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Обработка graceful shutdown
|
|
94
|
+
process.on('SIGINT', async () => {
|
|
95
|
+
logger_1.logger.info('\n🛑 Stopping dev mode...');
|
|
96
|
+
for (const w of watchers) {
|
|
97
|
+
w.close();
|
|
98
|
+
}
|
|
99
|
+
if (pushQueue) {
|
|
100
|
+
await pushQueue.close();
|
|
101
|
+
}
|
|
102
|
+
process.exit(0);
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Определяет какие пакеты являются ws:package и могут быть watch-ены
|
|
107
|
+
*/
|
|
108
|
+
function resolveWatchPackages(projectPath, packages) {
|
|
109
|
+
const result = [];
|
|
110
|
+
for (const pkg of packages) {
|
|
111
|
+
const packageDir = pkg.name === '.'
|
|
112
|
+
? projectPath
|
|
113
|
+
: path.join(projectPath, pkg.name);
|
|
114
|
+
const packageJsonPath = path.join(packageDir, 'package.json');
|
|
115
|
+
if (!fs.existsSync(packageJsonPath)) {
|
|
116
|
+
// Нет package.json - это статический контент, не watch-им
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
try {
|
|
120
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
121
|
+
const wsPackage = packageJson['ws:package'];
|
|
122
|
+
const wsName = packageJson['ws:name'];
|
|
123
|
+
// Только пакеты с ws:package (standalone, component, system)
|
|
124
|
+
if (!wsPackage || !wsName) {
|
|
125
|
+
// Не BT пакет - пропускаем
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
// library пакеты не watch-им напрямую
|
|
129
|
+
if (wsPackage === 'library' || wsPackage === 'lib') {
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
result.push({
|
|
133
|
+
name: pkg.name,
|
|
134
|
+
absolutePath: packageDir,
|
|
135
|
+
wsName,
|
|
136
|
+
packageType: wsPackage,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
logger_1.logger.warning(`⚠️ Failed to parse package.json in ${pkg.name}: ${error}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return result;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Запускает watch для пакета используя BuildPipeline.watch()
|
|
147
|
+
*
|
|
148
|
+
* @param pkg - Информация о пакете
|
|
149
|
+
* @param coordinator - Координатор dev mode
|
|
150
|
+
*/
|
|
151
|
+
function startPackageWatch(pkg, coordinator) {
|
|
152
|
+
const tsconfigPath = path.join(pkg.absolutePath, 'tsconfig.json');
|
|
153
|
+
if (!fs.existsSync(tsconfigPath)) {
|
|
154
|
+
logger_1.logger.warning(`⚠️ No tsconfig.json found for ${pkg.wsName}, skipping watch`);
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
logger_1.logger.info(` 🔄 Starting watcher for ${pkg.wsName}...`);
|
|
158
|
+
// Получаем tsconfig
|
|
159
|
+
const tsConfig = (0, config_1.getTSConfig)(pkg.absolutePath, 'tsconfig.json');
|
|
160
|
+
// Запускаем watch через BuildPipeline
|
|
161
|
+
const watcher = index_2.BuildPipeline.watch({
|
|
162
|
+
tsConfig,
|
|
163
|
+
options: {
|
|
164
|
+
includeNonTsFiles: true,
|
|
165
|
+
retainNonAsciiCharacters: false,
|
|
166
|
+
removeComments: false,
|
|
167
|
+
useBabel: false,
|
|
168
|
+
usePolyfill: true,
|
|
169
|
+
useRemodule: true,
|
|
170
|
+
},
|
|
171
|
+
files: [],
|
|
172
|
+
cwd: pkg.absolutePath,
|
|
173
|
+
}, {
|
|
174
|
+
onRebuild: (result) => {
|
|
175
|
+
if (result.success) {
|
|
176
|
+
logger_1.logger.success(`✅ [${pkg.wsName}] Build successful (${result.duration}ms)`);
|
|
177
|
+
// Координатор решает: полная или инкрементальная линковка
|
|
178
|
+
coordinator.onPackageBuild(pkg, result.emittedFiles);
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
logger_1.logger.error(`❌ [${pkg.wsName}] Build failed`);
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
onNonTsFileChange: (filePath) => {
|
|
185
|
+
// Координатор обрабатывает изменения non-TS файлов
|
|
186
|
+
coordinator.onNonTsFileChange(pkg, filePath);
|
|
187
|
+
},
|
|
188
|
+
});
|
|
189
|
+
return watcher;
|
|
190
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pushCommand = exports.devCommand = exports.artifactCommand = exports.linkCommand = exports.buildCommand = exports.initCommand = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Реэкспорт всех команд CLI
|
|
6
|
+
*/
|
|
7
|
+
var init_1 = require("./init");
|
|
8
|
+
Object.defineProperty(exports, "initCommand", { enumerable: true, get: function () { return init_1.initCommand; } });
|
|
9
|
+
var build_1 = require("./build");
|
|
10
|
+
Object.defineProperty(exports, "buildCommand", { enumerable: true, get: function () { return build_1.buildCommand; } });
|
|
11
|
+
var link_1 = require("./link");
|
|
12
|
+
Object.defineProperty(exports, "linkCommand", { enumerable: true, get: function () { return link_1.linkCommand; } });
|
|
13
|
+
var artifact_1 = require("./artifact");
|
|
14
|
+
Object.defineProperty(exports, "artifactCommand", { enumerable: true, get: function () { return artifact_1.artifactCommand; } });
|
|
15
|
+
var dev_1 = require("./dev");
|
|
16
|
+
Object.defineProperty(exports, "devCommand", { enumerable: true, get: function () { return dev_1.devCommand; } });
|
|
17
|
+
var push_1 = require("./push");
|
|
18
|
+
Object.defineProperty(exports, "pushCommand", { enumerable: true, get: function () { return push_1.pushCommand; } });
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.initCommand = initCommand;
|
|
4
|
+
const config_1 = require("../../core/config");
|
|
5
|
+
const logger_1 = require("../../core/logger");
|
|
6
|
+
/**
|
|
7
|
+
* Команда init - инициализация BorisType проекта
|
|
8
|
+
* Создаёт tsconfig.json с настройками по умолчанию
|
|
9
|
+
*/
|
|
10
|
+
async function initCommand() {
|
|
11
|
+
const cwd = process.cwd();
|
|
12
|
+
logger_1.logger.info('🚀 Initializing BorisType project...');
|
|
13
|
+
(0, config_1.generateDefaultTSConfig)(cwd);
|
|
14
|
+
logger_1.logger.success('✅ Project initialized successfully');
|
|
15
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.linkCommand = linkCommand;
|
|
4
|
+
const index_1 = require("../../core/linking/index");
|
|
5
|
+
/**
|
|
6
|
+
* Команда link - компоновка модулей и зависимостей
|
|
7
|
+
* Собирает все необходимые модули в директорию dist
|
|
8
|
+
*
|
|
9
|
+
* @param options - Опции команды
|
|
10
|
+
*/
|
|
11
|
+
async function linkCommand(options = {}) {
|
|
12
|
+
const linkingOptions = {
|
|
13
|
+
clean: options.clean,
|
|
14
|
+
noCache: options.noCache,
|
|
15
|
+
systemLinkMode: options.linkingSystemAs ?? 'component'
|
|
16
|
+
};
|
|
17
|
+
await (0, index_1.processLinking)(linkingOptions);
|
|
18
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Команда push — CLI обёртка для загрузки dist на WSHCM сервер
|
|
4
|
+
*
|
|
5
|
+
* Тонкая обёртка над core/pushing/processPush().
|
|
6
|
+
* Вся бизнес-логика находится в core/pushing/.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.pushCommand = pushCommand;
|
|
10
|
+
const index_1 = require("../../core/pushing/index");
|
|
11
|
+
/**
|
|
12
|
+
* Команда push - загрузка dist на WSHCM сервер
|
|
13
|
+
*
|
|
14
|
+
* Выполняет:
|
|
15
|
+
* 1. Отправку dist на WSHCM сервер
|
|
16
|
+
* 2. Сброс кеша модулей
|
|
17
|
+
* 3. Reinit для standalone и components
|
|
18
|
+
*
|
|
19
|
+
* Приоритет опций:
|
|
20
|
+
* 1. CLI параметры
|
|
21
|
+
* 2. btconfig.properties
|
|
22
|
+
* 3. Дефолтные значения (localhost:80, user1:user1)
|
|
23
|
+
*
|
|
24
|
+
* @param cliOptions - Опции из CLI (опциональные)
|
|
25
|
+
*/
|
|
26
|
+
async function pushCommand(cliOptions = {}) {
|
|
27
|
+
await (0, index_1.processPush)(process.cwd(), cliOptions);
|
|
28
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pushCommand = exports.devCommand = exports.artifactCommand = exports.linkCommand = exports.buildCommand = exports.initCommand = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* CLI модуль btc
|
|
6
|
+
* Реэкспорт команд и типов
|
|
7
|
+
*/
|
|
8
|
+
var commands_1 = require("./commands");
|
|
9
|
+
Object.defineProperty(exports, "initCommand", { enumerable: true, get: function () { return commands_1.initCommand; } });
|
|
10
|
+
Object.defineProperty(exports, "buildCommand", { enumerable: true, get: function () { return commands_1.buildCommand; } });
|
|
11
|
+
Object.defineProperty(exports, "linkCommand", { enumerable: true, get: function () { return commands_1.linkCommand; } });
|
|
12
|
+
Object.defineProperty(exports, "artifactCommand", { enumerable: true, get: function () { return commands_1.artifactCommand; } });
|
|
13
|
+
Object.defineProperty(exports, "devCommand", { enumerable: true, get: function () { return commands_1.devCommand; } });
|
|
14
|
+
Object.defineProperty(exports, "pushCommand", { enumerable: true, get: function () { return commands_1.pushCommand; } });
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.createArtifactContext = createArtifactContext;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
/**
|
|
39
|
+
* Создаёт начальный контекст для artifact pipeline
|
|
40
|
+
*
|
|
41
|
+
* @param cwd - Рабочая директория
|
|
42
|
+
* @param options - Опции pipeline
|
|
43
|
+
* @returns Начальный контекст
|
|
44
|
+
*/
|
|
45
|
+
function createArtifactContext(cwd, options) {
|
|
46
|
+
const distPath = path.join(cwd, 'dist');
|
|
47
|
+
const artifactPath = path.join(cwd, 'artifact');
|
|
48
|
+
return {
|
|
49
|
+
cwd,
|
|
50
|
+
distPath,
|
|
51
|
+
artifactPath,
|
|
52
|
+
options,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Artifact Pipeline
|
|
4
|
+
*
|
|
5
|
+
* Создание архива для поставки из директории dist
|
|
6
|
+
*
|
|
7
|
+
* Pipeline stages:
|
|
8
|
+
* 1. Validate - проверка dist, очистка/создание artifact/
|
|
9
|
+
* 2. Create Archive - создание main.zip (полное содержимое dist)
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.processArtifact = processArtifact;
|
|
13
|
+
const logger_1 = require("../logger");
|
|
14
|
+
const context_1 = require("./context");
|
|
15
|
+
const stages_1 = require("./stages");
|
|
16
|
+
/**
|
|
17
|
+
* Выполняет artifact pipeline
|
|
18
|
+
*
|
|
19
|
+
* @param cwd - Рабочая директория
|
|
20
|
+
* @param options - Опции pipeline
|
|
21
|
+
* @returns Финальный контекст с информацией о созданном архиве
|
|
22
|
+
*/
|
|
23
|
+
async function processArtifact(cwd, options) {
|
|
24
|
+
logger_1.logger.info('🚀 Artifact Pipeline Started');
|
|
25
|
+
logger_1.logger.info('─'.repeat(40));
|
|
26
|
+
// Создаём начальный контекст
|
|
27
|
+
let ctx = (0, context_1.createArtifactContext)(cwd, options);
|
|
28
|
+
// Stage 1: Validate
|
|
29
|
+
ctx = (0, stages_1.stageValidate)(ctx);
|
|
30
|
+
// Stage 2: Create Archive
|
|
31
|
+
ctx = await (0, stages_1.stageMainArchive)(ctx);
|
|
32
|
+
// Summary
|
|
33
|
+
logger_1.logger.info('─'.repeat(40));
|
|
34
|
+
logger_1.logger.info(`✅ Artifact Pipeline Completed`);
|
|
35
|
+
logger_1.logger.info(` Архив: ${ctx.archivePath}`);
|
|
36
|
+
return ctx;
|
|
37
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.stageMainArchive = exports.stageValidate = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Реэкспорт stages для artifact pipeline
|
|
6
|
+
*/
|
|
7
|
+
var validate_1 = require("./validate");
|
|
8
|
+
Object.defineProperty(exports, "stageValidate", { enumerable: true, get: function () { return validate_1.stageValidate; } });
|
|
9
|
+
var main_archive_1 = require("./main-archive");
|
|
10
|
+
Object.defineProperty(exports, "stageMainArchive", { enumerable: true, get: function () { return main_archive_1.stageMainArchive; } });
|