@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
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Генератор init.xml для standalone и system пакетов
|
|
4
|
+
* @module linking/generators/init-xml
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.buildInitXml = buildInitXml;
|
|
8
|
+
const xml_1 = require("../../utils/xml");
|
|
9
|
+
/**
|
|
10
|
+
* Генерирует содержимое init.xml файла для standalone/system пакетов
|
|
11
|
+
*
|
|
12
|
+
* @param mainFile - Путь к главному файлу (main из package.json)
|
|
13
|
+
* @param rootUrl - URL корневой директории пакета (x-local://...)
|
|
14
|
+
* @returns Содержимое init.xml файла
|
|
15
|
+
*
|
|
16
|
+
* @remarks
|
|
17
|
+
* init.xml используется для загрузки модуля через bt.require.
|
|
18
|
+
* Файл создаётся только для standalone и system пакетов.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* buildInitXml('./index.js', 'x-local://wt/mypackage')
|
|
23
|
+
* // Возвращает XML с bt.require('./index.js', 'x-local://wt/mypackage')
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
function buildInitXml(mainFile, rootUrl) {
|
|
27
|
+
const xmlObj = {
|
|
28
|
+
'?xml': { '@_version': '1.0', '@_encoding': 'UTF-8' },
|
|
29
|
+
'SPXML-INLINE-FORM': {
|
|
30
|
+
'OnInit': {
|
|
31
|
+
'@_PROPERTY': '1',
|
|
32
|
+
'@_EXPR': `\n bt.require('${mainFile}', '${rootUrl}')\n `,
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
return xml_1.xmlBuilder.build(xmlObj);
|
|
37
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Генератор package.json для компонентов
|
|
4
|
+
* @module linking/generators/package-json
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.buildComponentPackageJson = buildComponentPackageJson;
|
|
8
|
+
exports.buildComponentPackageJsonString = buildComponentPackageJsonString;
|
|
9
|
+
/**
|
|
10
|
+
* Генерирует package.json для компонента
|
|
11
|
+
*
|
|
12
|
+
* @param info - Информация о компоненте
|
|
13
|
+
* @returns Объект package.json для компонента
|
|
14
|
+
*
|
|
15
|
+
* @remarks
|
|
16
|
+
* Компоненты имеют специфичный формат package.json:
|
|
17
|
+
* - enableByDefault: true
|
|
18
|
+
* - type: 'standard'
|
|
19
|
+
* - tags: ['#public']
|
|
20
|
+
* - dependencies: {} (пустой)
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```ts
|
|
24
|
+
* const pkgJson = buildComponentPackageJson({
|
|
25
|
+
* name: 'my-component',
|
|
26
|
+
* version: '1.0.0',
|
|
27
|
+
* description: 'My awesome component'
|
|
28
|
+
* });
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
function buildComponentPackageJson(info) {
|
|
32
|
+
return {
|
|
33
|
+
name: info.name || 'unknown',
|
|
34
|
+
version: info.version || '1.0.0.0',
|
|
35
|
+
description: info.description || info.name || 'unknown',
|
|
36
|
+
enableByDefault: true,
|
|
37
|
+
dependencies: {},
|
|
38
|
+
type: 'standard',
|
|
39
|
+
tags: ['#public']
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Генерирует package.json как JSON-строку
|
|
44
|
+
*
|
|
45
|
+
* @param info - Информация о компоненте
|
|
46
|
+
* @returns JSON-строка package.json
|
|
47
|
+
*/
|
|
48
|
+
function buildComponentPackageJsonString(info) {
|
|
49
|
+
return JSON.stringify(buildComponentPackageJson(info), null, 2);
|
|
50
|
+
}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Модуль линковки пакетов
|
|
4
|
+
*
|
|
5
|
+
* Реализует Pipeline + Registry архитектуру:
|
|
6
|
+
* - Pipeline: последовательные этапы обработки (resolve → link → finalize)
|
|
7
|
+
* - Registry: реестр линковщиков по типам пакетов
|
|
8
|
+
*
|
|
9
|
+
* @module linking
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
+
var ownKeys = function(o) {
|
|
29
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
+
var ar = [];
|
|
31
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
+
return ar;
|
|
33
|
+
};
|
|
34
|
+
return ownKeys(o);
|
|
35
|
+
};
|
|
36
|
+
return function (mod) {
|
|
37
|
+
if (mod && mod.__esModule) return mod;
|
|
38
|
+
var result = {};
|
|
39
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
+
__setModuleDefault(result, mod);
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
})();
|
|
44
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
45
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
46
|
+
};
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.LinkingCache = exports.addExecutable = exports.addLinkedPackage = exports.prepareDistDirectory = exports.createLinkingContext = void 0;
|
|
49
|
+
exports.processLinking = processLinking;
|
|
50
|
+
exports.resolvePackagesToLink = resolvePackagesToLink;
|
|
51
|
+
exports.processPackagesLinking = processPackagesLinking;
|
|
52
|
+
const fs = __importStar(require("fs"));
|
|
53
|
+
const path = __importStar(require("path"));
|
|
54
|
+
const logger_1 = require("../logger");
|
|
55
|
+
const dependencies_1 = require("./dependencies");
|
|
56
|
+
const config_1 = require("../config");
|
|
57
|
+
const context_1 = require("./context");
|
|
58
|
+
const cache_1 = require("./cache");
|
|
59
|
+
const utils_1 = require("./utils");
|
|
60
|
+
const linkers_1 = require("./linkers");
|
|
61
|
+
const generators_1 = require("./generators");
|
|
62
|
+
const parsers_1 = require("./parsers");
|
|
63
|
+
const executables_1 = require("./executables");
|
|
64
|
+
// Re-export всех типов и утилит для удобства
|
|
65
|
+
__exportStar(require("./types"), exports);
|
|
66
|
+
__exportStar(require("./utils"), exports);
|
|
67
|
+
__exportStar(require("./generators"), exports);
|
|
68
|
+
__exportStar(require("./linkers"), exports);
|
|
69
|
+
var context_2 = require("./context");
|
|
70
|
+
Object.defineProperty(exports, "createLinkingContext", { enumerable: true, get: function () { return context_2.createLinkingContext; } });
|
|
71
|
+
Object.defineProperty(exports, "prepareDistDirectory", { enumerable: true, get: function () { return context_2.prepareDistDirectory; } });
|
|
72
|
+
Object.defineProperty(exports, "addLinkedPackage", { enumerable: true, get: function () { return context_2.addLinkedPackage; } });
|
|
73
|
+
Object.defineProperty(exports, "addExecutable", { enumerable: true, get: function () { return context_2.addExecutable; } });
|
|
74
|
+
var cache_2 = require("./cache");
|
|
75
|
+
Object.defineProperty(exports, "LinkingCache", { enumerable: true, get: function () { return cache_2.LinkingCache; } });
|
|
76
|
+
/**
|
|
77
|
+
* Главная точка входа для линковки
|
|
78
|
+
*
|
|
79
|
+
* @param options - Опции линковки
|
|
80
|
+
*
|
|
81
|
+
* @remarks
|
|
82
|
+
* Выполняет полный процесс линковки:
|
|
83
|
+
* 1. Определяет пакеты для линковки (из btconfig.json или package.json)
|
|
84
|
+
* 2. Определяет зависимости компилятора (polyfill и т.д.)
|
|
85
|
+
* 3. Обрабатывает каждый пакет через соответствующий линковщик
|
|
86
|
+
* 4. Создаёт api_ext.xml
|
|
87
|
+
*/
|
|
88
|
+
async function processLinking(options = {}) {
|
|
89
|
+
const projectPath = process.cwd();
|
|
90
|
+
// Получаем список пакетов для линковки
|
|
91
|
+
const packagesToLink = resolvePackagesToLink(projectPath);
|
|
92
|
+
logger_1.logger.success(`📋 Found ${packagesToLink.length} package(s) to link`);
|
|
93
|
+
await processPackagesLinking(projectPath, packagesToLink, options);
|
|
94
|
+
process.exit(0);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Определяет список пакетов для линковки
|
|
98
|
+
*
|
|
99
|
+
* Логика определения:
|
|
100
|
+
* 1. Если есть btconfig.json с linking.packages — используем packages
|
|
101
|
+
* 2. Если есть btconfig.json с linking (без packages) — текущий проект
|
|
102
|
+
* 3. Если нет btconfig.json — текущий проект из package.json
|
|
103
|
+
*
|
|
104
|
+
* @param projectPath - Путь к корневой директории проекта
|
|
105
|
+
* @returns Массив пакетов для линковки
|
|
106
|
+
*/
|
|
107
|
+
function resolvePackagesToLink(projectPath) {
|
|
108
|
+
const btConfig = (0, config_1.getBTConfig)(projectPath);
|
|
109
|
+
// Случай 1: btconfig.json с packages
|
|
110
|
+
if (btConfig?.linking?.packages && btConfig.linking.packages.length > 0) {
|
|
111
|
+
return btConfig.linking.packages;
|
|
112
|
+
}
|
|
113
|
+
// Случай 2: btconfig.json с linking (текущий проект)
|
|
114
|
+
if (btConfig?.linking && !btConfig.linking.packages) {
|
|
115
|
+
const { source, target } = btConfig.linking;
|
|
116
|
+
return [{
|
|
117
|
+
name: '.', // Текущий проект
|
|
118
|
+
source,
|
|
119
|
+
target,
|
|
120
|
+
}];
|
|
121
|
+
}
|
|
122
|
+
// Случай 3: Нет btconfig.json — проверяем package.json
|
|
123
|
+
const packageJsonPath = path.join(projectPath, 'package.json');
|
|
124
|
+
if (!fs.existsSync(packageJsonPath)) {
|
|
125
|
+
logger_1.logger.error('❌ No btconfig.json and no package.json found. Nothing to link.');
|
|
126
|
+
process.exit(1);
|
|
127
|
+
}
|
|
128
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
129
|
+
const packageType = (0, utils_1.normalizePackageType)(packageJson['ws:package']);
|
|
130
|
+
if (!packageType || !(0, utils_1.isExecutablePackageType)(packageType)) {
|
|
131
|
+
logger_1.logger.error('❌ No btconfig.json found and current project is not an executable BorisType package (ws:package must be "standalone", "component", "system"). Nothing to link.');
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
// Виртуальная конфигурация из package.json
|
|
135
|
+
return [{
|
|
136
|
+
name: '.', // Текущая директория
|
|
137
|
+
}];
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Линковка пакетов
|
|
141
|
+
*
|
|
142
|
+
* @param projectPath - Путь к корню проекта
|
|
143
|
+
* @param packages - Пакеты для линковки
|
|
144
|
+
* @param options - Опции линковки (включая devMode и changedFiles)
|
|
145
|
+
*/
|
|
146
|
+
async function processPackagesLinking(projectPath, packages, options = {}) {
|
|
147
|
+
// При --clean сначала удаляем кэш, потом создаём контекст
|
|
148
|
+
if (options.clean) {
|
|
149
|
+
cache_1.LinkingCache.removeAll(projectPath);
|
|
150
|
+
}
|
|
151
|
+
// Создаём контекст линковки
|
|
152
|
+
const ctx = (0, context_1.createLinkingContext)({
|
|
153
|
+
projectPath,
|
|
154
|
+
systemLinkMode: options.systemLinkMode ?? 'component',
|
|
155
|
+
noCache: options.noCache,
|
|
156
|
+
logger: logger_1.logger,
|
|
157
|
+
devMode: options.devMode,
|
|
158
|
+
changedFiles: options.changedFiles
|
|
159
|
+
});
|
|
160
|
+
logger_1.logger.success(`📦 System packages will be linked as: ${ctx.systemLinkMode}`);
|
|
161
|
+
if (!ctx.cache.isEnabled()) {
|
|
162
|
+
logger_1.logger.warning('⚠️ Cache disabled (--no-cache)');
|
|
163
|
+
}
|
|
164
|
+
// Подготавливаем dist директорию (кэш уже очищен если нужно)
|
|
165
|
+
(0, context_1.prepareDistDirectory)(ctx, options.clean);
|
|
166
|
+
// Получаем зависимости, добавляемые компилятором (например, polyfill)
|
|
167
|
+
const compilerDeps = await (0, dependencies_1.getCompilerRequiredDependencies)(projectPath);
|
|
168
|
+
logger_1.logger.success('📦 Compiler dependencies (polyfill):');
|
|
169
|
+
(0, dependencies_1.printFlattenedTree)(compilerDeps);
|
|
170
|
+
// === STAGE 1: Линковка зависимостей компилятора (system пакеты) ===
|
|
171
|
+
logger_1.logger.success('📦 Copying compiler dependencies (polyfill)...');
|
|
172
|
+
for (const dep of compilerDeps) {
|
|
173
|
+
const pkgInfo = (0, parsers_1.parseCompilerDependencyPackageInfo)(dep, ctx);
|
|
174
|
+
if (!pkgInfo) {
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
logger_1.logger.success(` 📦 ${pkgInfo.packageJson.name}: ${pkgInfo.targetPath}`);
|
|
178
|
+
// Копируем файлы
|
|
179
|
+
(0, utils_1.copyWithPrefix)(pkgInfo.sourceDir, ctx.distPath, pkgInfo.targetPath);
|
|
180
|
+
// Линкуем через соответствующий линковщик
|
|
181
|
+
const result = (0, linkers_1.linkPackage)(pkgInfo, ctx);
|
|
182
|
+
(0, context_1.addLinkedPackage)(ctx, result);
|
|
183
|
+
}
|
|
184
|
+
// === STAGE 2: Линковка пользовательских пакетов ===
|
|
185
|
+
for (const packageConfig of packages) {
|
|
186
|
+
// name === '.' означает текущую директорию
|
|
187
|
+
const packageDirAbsolute = packageConfig.name === '.'
|
|
188
|
+
? projectPath
|
|
189
|
+
: path.join(projectPath, packageConfig.name);
|
|
190
|
+
const displayName = packageConfig.name === '.' ? 'current project' : packageConfig.name;
|
|
191
|
+
logger_1.logger.success(`📦 Processing package: ${displayName}`);
|
|
192
|
+
// Парсим информацию о пакете
|
|
193
|
+
const pkgInfo = (0, parsers_1.parseUserPackageInfo)(projectPath, packageDirAbsolute, packageConfig, displayName);
|
|
194
|
+
if (!pkgInfo) {
|
|
195
|
+
// Обычная директория (не BT пакет) - просто копируем
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
// Собираем executables из .executables.json
|
|
199
|
+
(0, executables_1.collectExecutables)(pkgInfo, ctx);
|
|
200
|
+
// Линкуем через соответствующий линковщик
|
|
201
|
+
const result = (0, linkers_1.linkPackage)(pkgInfo, ctx);
|
|
202
|
+
(0, context_1.addLinkedPackage)(ctx, result);
|
|
203
|
+
}
|
|
204
|
+
// === STAGE 3: Создаём api_ext.xml ===
|
|
205
|
+
if (ctx.apiExtEntries.length > 0) {
|
|
206
|
+
const apiExtXml = (0, generators_1.buildApiExt)(ctx.apiExtEntries);
|
|
207
|
+
const apiExtXmlFilePath = path.join(ctx.distPath, 'source', 'api_ext.xml');
|
|
208
|
+
fs.mkdirSync(path.dirname(apiExtXmlFilePath), { recursive: true });
|
|
209
|
+
fs.writeFileSync(apiExtXmlFilePath, '\uFEFF' + apiExtXml, { encoding: 'utf-8' });
|
|
210
|
+
logger_1.logger.success(`📄 Generated api_ext.xml with ${ctx.apiExtEntries.length} entries`);
|
|
211
|
+
}
|
|
212
|
+
logger_1.logger.success(`✅ Linking completed (${packages.length} package(s))`);
|
|
213
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Linker для component пакетов
|
|
4
|
+
* @module linking/linkers/component
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.componentLinker = void 0;
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const copy_1 = require("../utils/copy");
|
|
44
|
+
const node_modules_1 = require("../utils/node-modules");
|
|
45
|
+
const write_1 = require("../utils/write");
|
|
46
|
+
const component_1 = require("../generators/component");
|
|
47
|
+
const package_json_1 = require("../generators/package-json");
|
|
48
|
+
const filemap_1 = require("../generators/filemap");
|
|
49
|
+
/**
|
|
50
|
+
* Linker для component пакетов
|
|
51
|
+
*
|
|
52
|
+
* @remarks
|
|
53
|
+
* Component пакеты:
|
|
54
|
+
* - Помещаются в ./components/<ws:name>
|
|
55
|
+
* - Генерируют spxml/<ws:name>.xml и spxml/<ws:name>.js
|
|
56
|
+
* - Генерируют package.json для компонента
|
|
57
|
+
* - Генерируют .filemap.json (per-module)
|
|
58
|
+
* - НЕ регистрируются в api_ext.xml (своя логика загрузки)
|
|
59
|
+
* - Копируют node_modules
|
|
60
|
+
*/
|
|
61
|
+
exports.componentLinker = {
|
|
62
|
+
type: 'component',
|
|
63
|
+
link(pkg, ctx) {
|
|
64
|
+
const { sourceDir, targetPath, packageJson, rootUrl, projectPath, wsName } = pkg;
|
|
65
|
+
const { distPath, executables, logger, cache, devMode, changedFiles } = ctx;
|
|
66
|
+
const generatedFiles = [];
|
|
67
|
+
// Используем wsName для имён файлов и директорий
|
|
68
|
+
const componentName = wsName;
|
|
69
|
+
// Полный путь к целевой директории (./components/<ws:name>)
|
|
70
|
+
const fullTargetPath = path.join(distPath, targetPath);
|
|
71
|
+
// 1. Копируем файлы пакета
|
|
72
|
+
if (devMode && changedFiles.length > 0) {
|
|
73
|
+
// Инкрементальное копирование — только изменённые файлы
|
|
74
|
+
for (const srcFile of changedFiles) {
|
|
75
|
+
const relativePath = path.relative(sourceDir, srcFile);
|
|
76
|
+
// Пропускаем файлы не из sourceDir (например, из другого пакета)
|
|
77
|
+
if (relativePath.startsWith('..')) {
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
const dstFile = path.join(fullTargetPath, relativePath);
|
|
81
|
+
fs.mkdirSync(path.dirname(dstFile), { recursive: true });
|
|
82
|
+
fs.copyFileSync(srcFile, dstFile);
|
|
83
|
+
}
|
|
84
|
+
logger.success(` ├─ Copied ${changedFiles.length} changed file(s) to ${targetPath}`);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
// Полное копирование
|
|
88
|
+
(0, copy_1.copyRecursive)(sourceDir, fullTargetPath);
|
|
89
|
+
logger.success(` ├─ Copied files to ${targetPath}`);
|
|
90
|
+
}
|
|
91
|
+
// 2. Копируем node_modules (с кэшированием) — только при полной линковке
|
|
92
|
+
if (!devMode) {
|
|
93
|
+
(0, node_modules_1.copyNodeModulesWithCache)({
|
|
94
|
+
searchDir: projectPath,
|
|
95
|
+
targetDir: fullTargetPath,
|
|
96
|
+
wsName,
|
|
97
|
+
cache,
|
|
98
|
+
logger
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
// 3. Проверяем существование spxml файлов
|
|
102
|
+
const spxmlDir = path.join(fullTargetPath, 'spxml');
|
|
103
|
+
const xmlPath = path.join(spxmlDir, `${componentName}.xml`);
|
|
104
|
+
const jsPath = path.join(spxmlDir, `${componentName}.js`);
|
|
105
|
+
const xmlExists = fs.existsSync(xmlPath);
|
|
106
|
+
const jsExists = fs.existsSync(jsPath);
|
|
107
|
+
// 4. Генерируем spxml/<name>.xml (только если нет в build/)
|
|
108
|
+
if (!xmlExists) {
|
|
109
|
+
if (!fs.existsSync(spxmlDir)) {
|
|
110
|
+
fs.mkdirSync(spxmlDir, { recursive: true });
|
|
111
|
+
}
|
|
112
|
+
const componentXmlContent = (0, component_1.buildComponentXml)(componentName);
|
|
113
|
+
if ((0, write_1.writeIfChanged)(xmlPath, componentXmlContent)) {
|
|
114
|
+
generatedFiles.push(`spxml/${componentName}.xml`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// 5. Генерируем spxml/<name>.js (только если нет в build/)
|
|
118
|
+
const mainFile = packageJson.main;
|
|
119
|
+
if (mainFile && !jsExists) {
|
|
120
|
+
if (!fs.existsSync(spxmlDir)) {
|
|
121
|
+
fs.mkdirSync(spxmlDir, { recursive: true });
|
|
122
|
+
}
|
|
123
|
+
const componentJsContent = (0, component_1.buildComponentJs)(componentName, mainFile, rootUrl);
|
|
124
|
+
if ((0, write_1.writeIfChanged)(jsPath, componentJsContent)) {
|
|
125
|
+
generatedFiles.push(`spxml/${componentName}.js`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Логируем результат
|
|
129
|
+
if (!devMode) {
|
|
130
|
+
if (!xmlExists || !jsExists) {
|
|
131
|
+
const generated = [];
|
|
132
|
+
if (!xmlExists)
|
|
133
|
+
generated.push(`${componentName}.xml`);
|
|
134
|
+
if (!jsExists && mainFile)
|
|
135
|
+
generated.push(`${componentName}.js`);
|
|
136
|
+
if (generated.length > 0) {
|
|
137
|
+
logger.success(` ├─ Generated spxml/${generated.join(', spxml/')}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
logger.success(` ├─ Using existing spxml/${componentName}.xml, spxml/${componentName}.js`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// 6. Генерируем package.json для компонента (используем wsName)
|
|
145
|
+
const componentPkgJson = (0, package_json_1.buildComponentPackageJsonString)({
|
|
146
|
+
name: wsName,
|
|
147
|
+
version: packageJson.version,
|
|
148
|
+
description: packageJson.description
|
|
149
|
+
});
|
|
150
|
+
const pkgJsonPath = path.join(fullTargetPath, 'package.json');
|
|
151
|
+
if ((0, write_1.writeIfChanged)(pkgJsonPath, componentPkgJson)) {
|
|
152
|
+
generatedFiles.push('package.json');
|
|
153
|
+
if (!devMode) {
|
|
154
|
+
logger.success(` ├─ Generated package.json`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// 7. Создаём .filemap.json (per-module)
|
|
158
|
+
if (executables.size > 0) {
|
|
159
|
+
const filemapContent = (0, filemap_1.generateFilemapJson)(executables);
|
|
160
|
+
const filemapPath = path.join(fullTargetPath, '.filemap.json');
|
|
161
|
+
if ((0, write_1.writeIfChanged)(filemapPath, filemapContent)) {
|
|
162
|
+
generatedFiles.push('.filemap.json');
|
|
163
|
+
logger.success(` ├─ Generated .filemap.json`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
logger.success(` └─ Component package linked: ${componentName}`);
|
|
167
|
+
// Компоненты НЕ регистрируются в api_ext.xml
|
|
168
|
+
return {
|
|
169
|
+
info: pkg,
|
|
170
|
+
outputPath: fullTargetPath,
|
|
171
|
+
apiext: undefined,
|
|
172
|
+
generatedFiles
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Registry линковщиков по типам пакетов
|
|
4
|
+
* @module linking/linkers
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.systemLinker = exports.componentLinker = exports.standaloneLinker = void 0;
|
|
8
|
+
exports.getLinker = getLinker;
|
|
9
|
+
exports.hasLinker = hasLinker;
|
|
10
|
+
exports.linkPackage = linkPackage;
|
|
11
|
+
exports.getRegisteredTypes = getRegisteredTypes;
|
|
12
|
+
const standalone_1 = require("./standalone");
|
|
13
|
+
const component_1 = require("./component");
|
|
14
|
+
const system_1 = require("./system");
|
|
15
|
+
/**
|
|
16
|
+
* Реестр линковщиков по типам пакетов
|
|
17
|
+
*/
|
|
18
|
+
const linkerRegistry = new Map([
|
|
19
|
+
['standalone', standalone_1.standaloneLinker],
|
|
20
|
+
['component', component_1.componentLinker],
|
|
21
|
+
['system', system_1.systemLinker],
|
|
22
|
+
// library не имеет линковщика - обрабатывается через node_modules
|
|
23
|
+
]);
|
|
24
|
+
/**
|
|
25
|
+
* Получает линковщик для указанного типа пакета
|
|
26
|
+
*
|
|
27
|
+
* @param type - Тип пакета
|
|
28
|
+
* @returns Линковщик или undefined если не найден
|
|
29
|
+
*/
|
|
30
|
+
function getLinker(type) {
|
|
31
|
+
return linkerRegistry.get(type);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Проверяет наличие линковщика для типа пакета
|
|
35
|
+
*
|
|
36
|
+
* @param type - Тип пакета
|
|
37
|
+
* @returns true если линковщик существует
|
|
38
|
+
*/
|
|
39
|
+
function hasLinker(type) {
|
|
40
|
+
return linkerRegistry.has(type);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Выполняет линковку пакета, выбирая нужный линковщик автоматически
|
|
44
|
+
*
|
|
45
|
+
* @param pkg - Информация о пакете
|
|
46
|
+
* @param ctx - Контекст линковки
|
|
47
|
+
* @returns Результат линковки
|
|
48
|
+
* @throws Error если линковщик для типа пакета не найден
|
|
49
|
+
*/
|
|
50
|
+
function linkPackage(pkg, ctx) {
|
|
51
|
+
const linker = getLinker(pkg.packageType);
|
|
52
|
+
if (!linker) {
|
|
53
|
+
throw new Error(`No linker found for package type: ${pkg.packageType}`);
|
|
54
|
+
}
|
|
55
|
+
return linker.link(pkg, ctx);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Возвращает список всех зарегистрированных типов пакетов с линковщиками
|
|
59
|
+
*/
|
|
60
|
+
function getRegisteredTypes() {
|
|
61
|
+
return Array.from(linkerRegistry.keys());
|
|
62
|
+
}
|
|
63
|
+
// Экспорт отдельных линковщиков для прямого использования
|
|
64
|
+
var standalone_2 = require("./standalone");
|
|
65
|
+
Object.defineProperty(exports, "standaloneLinker", { enumerable: true, get: function () { return standalone_2.standaloneLinker; } });
|
|
66
|
+
var component_2 = require("./component");
|
|
67
|
+
Object.defineProperty(exports, "componentLinker", { enumerable: true, get: function () { return component_2.componentLinker; } });
|
|
68
|
+
var system_2 = require("./system");
|
|
69
|
+
Object.defineProperty(exports, "systemLinker", { enumerable: true, get: function () { return system_2.systemLinker; } });
|