@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,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Создание и управление контекстом линковки
|
|
4
|
+
* @module linking/context
|
|
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.createLinkingContext = createLinkingContext;
|
|
41
|
+
exports.prepareDistDirectory = prepareDistDirectory;
|
|
42
|
+
exports.addLinkedPackage = addLinkedPackage;
|
|
43
|
+
exports.addApiExtEntry = addApiExtEntry;
|
|
44
|
+
exports.addExecutable = addExecutable;
|
|
45
|
+
exports.getLinkingStats = getLinkingStats;
|
|
46
|
+
const fs = __importStar(require("fs"));
|
|
47
|
+
const path = __importStar(require("path"));
|
|
48
|
+
const cache_1 = require("./cache");
|
|
49
|
+
const logger_1 = require("../logger");
|
|
50
|
+
/**
|
|
51
|
+
* Создаёт новый контекст линковки
|
|
52
|
+
*
|
|
53
|
+
* @param options - Опции для создания контекста
|
|
54
|
+
* @returns Инициализированный контекст линковки
|
|
55
|
+
*
|
|
56
|
+
* @remarks
|
|
57
|
+
* Контекст содержит:
|
|
58
|
+
* - Пути к проекту и dist директории
|
|
59
|
+
* - Списки слинкованных пакетов и api_ext записей
|
|
60
|
+
* - Глобальную карту executables
|
|
61
|
+
* - Кэш линковки
|
|
62
|
+
* - Логгер
|
|
63
|
+
*/
|
|
64
|
+
function createLinkingContext(options) {
|
|
65
|
+
const { projectPath, systemLinkMode = 'component', noCache = false, logger = logger_1.logger, devMode = false, changedFiles = [] } = options;
|
|
66
|
+
const distPath = path.join(projectPath, 'dist');
|
|
67
|
+
const cache = new cache_1.LinkingCache(projectPath, !noCache);
|
|
68
|
+
return {
|
|
69
|
+
projectPath,
|
|
70
|
+
distPath,
|
|
71
|
+
systemLinkMode,
|
|
72
|
+
cache,
|
|
73
|
+
linkedPackages: [],
|
|
74
|
+
apiExtEntries: [],
|
|
75
|
+
executables: new Map(),
|
|
76
|
+
logger,
|
|
77
|
+
devMode,
|
|
78
|
+
changedFiles
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Подготавливает директорию dist
|
|
83
|
+
*
|
|
84
|
+
* @param ctx - Контекст линковки
|
|
85
|
+
* @param clean - Очистить директорию перед созданием (кэш очищается отдельно до создания контекста)
|
|
86
|
+
*/
|
|
87
|
+
function prepareDistDirectory(ctx, clean = false) {
|
|
88
|
+
if (clean) {
|
|
89
|
+
// Очищаем dist
|
|
90
|
+
if (fs.existsSync(ctx.distPath)) {
|
|
91
|
+
fs.rmSync(ctx.distPath, { recursive: true, force: true });
|
|
92
|
+
}
|
|
93
|
+
// Кэш уже очищен до создания контекста
|
|
94
|
+
ctx.logger.success('🧹 Cleaned dist directory and cache');
|
|
95
|
+
}
|
|
96
|
+
if (!fs.existsSync(ctx.distPath)) {
|
|
97
|
+
fs.mkdirSync(ctx.distPath, { recursive: true });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Добавляет результат линковки в контекст
|
|
102
|
+
*
|
|
103
|
+
* @param ctx - Контекст линковки
|
|
104
|
+
* @param result - Результат линковки пакета
|
|
105
|
+
*/
|
|
106
|
+
function addLinkedPackage(ctx, result) {
|
|
107
|
+
ctx.linkedPackages.push(result);
|
|
108
|
+
if (result.apiext) {
|
|
109
|
+
ctx.apiExtEntries.push(result.apiext);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Добавляет запись в api_ext напрямую
|
|
114
|
+
*
|
|
115
|
+
* @param ctx - Контекст линковки
|
|
116
|
+
* @param entry - Запись для api_ext.xml
|
|
117
|
+
*/
|
|
118
|
+
function addApiExtEntry(ctx, entry) {
|
|
119
|
+
ctx.apiExtEntries.push(entry);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Добавляет executable в глобальную карту
|
|
123
|
+
*
|
|
124
|
+
* @param ctx - Контекст линковки
|
|
125
|
+
* @param key - Ключ файла (packageName+version+filePath)
|
|
126
|
+
* @param url - URL файла (x-local://...)
|
|
127
|
+
*/
|
|
128
|
+
function addExecutable(ctx, key, url) {
|
|
129
|
+
ctx.executables.set(key, url);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Получает статистику линковки
|
|
133
|
+
*
|
|
134
|
+
* @param ctx - Контекст линковки
|
|
135
|
+
* @returns Объект со статистикой
|
|
136
|
+
*/
|
|
137
|
+
function getLinkingStats(ctx) {
|
|
138
|
+
const packagesByType = {};
|
|
139
|
+
for (const pkg of ctx.linkedPackages) {
|
|
140
|
+
const type = pkg.info.packageType;
|
|
141
|
+
packagesByType[type] = (packagesByType[type] || 0) + 1;
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
totalPackages: ctx.linkedPackages.length,
|
|
145
|
+
totalApiExtEntries: ctx.apiExtEntries.length,
|
|
146
|
+
totalExecutables: ctx.executables.size,
|
|
147
|
+
packagesByType
|
|
148
|
+
};
|
|
149
|
+
}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Дерево зависимостей проекта
|
|
4
|
+
*
|
|
5
|
+
* Построение, обход и вывод дерева npm-зависимостей.
|
|
6
|
+
* Используется линковкой для определения @boristype/* пакетов.
|
|
7
|
+
*
|
|
8
|
+
* @module linking/dependencies
|
|
9
|
+
*/
|
|
10
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
13
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
14
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
15
|
+
}
|
|
16
|
+
Object.defineProperty(o, k2, desc);
|
|
17
|
+
}) : (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
o[k2] = m[k];
|
|
20
|
+
}));
|
|
21
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
22
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
23
|
+
}) : function(o, v) {
|
|
24
|
+
o["default"] = v;
|
|
25
|
+
});
|
|
26
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
27
|
+
var ownKeys = function(o) {
|
|
28
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
29
|
+
var ar = [];
|
|
30
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
31
|
+
return ar;
|
|
32
|
+
};
|
|
33
|
+
return ownKeys(o);
|
|
34
|
+
};
|
|
35
|
+
return function (mod) {
|
|
36
|
+
if (mod && mod.__esModule) return mod;
|
|
37
|
+
var result = {};
|
|
38
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
39
|
+
__setModuleDefault(result, mod);
|
|
40
|
+
return result;
|
|
41
|
+
};
|
|
42
|
+
})();
|
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
+
exports.DependencyNode = void 0;
|
|
45
|
+
exports.getCompilerRequiredDependencies = getCompilerRequiredDependencies;
|
|
46
|
+
exports.buildDependencyTree = buildDependencyTree;
|
|
47
|
+
exports.flattenDependencyTreeIterative = flattenDependencyTreeIterative;
|
|
48
|
+
exports.printDependencyTree = printDependencyTree;
|
|
49
|
+
exports.printFlattenedTree = printFlattenedTree;
|
|
50
|
+
exports.extractBorisTypeDependencies = extractBorisTypeDependencies;
|
|
51
|
+
const node_fs_1 = require("node:fs");
|
|
52
|
+
const path = __importStar(require("node:path"));
|
|
53
|
+
const node_crypto_1 = require("node:crypto");
|
|
54
|
+
const logger_1 = require("../utils/logger");
|
|
55
|
+
/**
|
|
56
|
+
* Узел дерева зависимостей
|
|
57
|
+
*/
|
|
58
|
+
class DependencyNode {
|
|
59
|
+
packageJson;
|
|
60
|
+
name;
|
|
61
|
+
version;
|
|
62
|
+
dependencies;
|
|
63
|
+
projectPath;
|
|
64
|
+
hash;
|
|
65
|
+
constructor(packageJson, projectPath = '') {
|
|
66
|
+
this.packageJson = packageJson;
|
|
67
|
+
this.name = packageJson.name;
|
|
68
|
+
this.version = packageJson.version;
|
|
69
|
+
this.dependencies = [];
|
|
70
|
+
this.projectPath = projectPath;
|
|
71
|
+
this.hash = (0, node_crypto_1.randomUUID)();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.DependencyNode = DependencyNode;
|
|
75
|
+
/**
|
|
76
|
+
* Собирает @boristype/* зависимости компилятора из node_modules.
|
|
77
|
+
*
|
|
78
|
+
* @param projectPath - путь к корню проекта
|
|
79
|
+
* @returns массив узлов зависимостей
|
|
80
|
+
*/
|
|
81
|
+
async function getCompilerRequiredDependencies(projectPath) {
|
|
82
|
+
const rootPackageJsonPath = path.join(projectPath, 'package.json');
|
|
83
|
+
const nodeModulesPath = path.join(projectPath, 'node_modules');
|
|
84
|
+
const rootPackageJson = JSON.parse(await node_fs_1.promises.readFile(rootPackageJsonPath, 'utf-8'));
|
|
85
|
+
const devDependencies = rootPackageJson.devDependencies || {};
|
|
86
|
+
const btcRemoteDependency = devDependencies['@boristype/bt-cli'] !== undefined;
|
|
87
|
+
if (!btcRemoteDependency) {
|
|
88
|
+
logger_1.logger.warning(`Предупреждение: В devDependencies отсутствует зависимость '@boristype/bt-cli'.`);
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
const btcPath = path.join(nodeModulesPath, '@boristype', 'bt-cli');
|
|
92
|
+
const btcPackageJsonPath = path.join(btcPath, 'package.json');
|
|
93
|
+
const btcPackageJson = JSON.parse(await node_fs_1.promises.readFile(btcPackageJsonPath, 'utf-8'));
|
|
94
|
+
const btcDependencies = btcPackageJson.dependencies || {};
|
|
95
|
+
const result = [];
|
|
96
|
+
logger_1.logger.info(`Загрузка зависимостей компилятора из ${btcPath}`);
|
|
97
|
+
for (const [depName, depVersion] of Object.entries(btcDependencies)) {
|
|
98
|
+
if (depName.startsWith('@boristype/')) {
|
|
99
|
+
const depPath = path.join(nodeModulesPath, '@boristype', depName.replace('@boristype/', ''));
|
|
100
|
+
logger_1.logger.info(`Загрузка зависимости компилятора: ${depName} из ${depPath}`);
|
|
101
|
+
try {
|
|
102
|
+
const depPackageJsonPath = path.join(depPath, 'package.json');
|
|
103
|
+
const depPackageJson = JSON.parse(await node_fs_1.promises.readFile(depPackageJsonPath, 'utf-8'));
|
|
104
|
+
const depNode = new DependencyNode(depPackageJson, depPath);
|
|
105
|
+
result.push(depNode);
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
109
|
+
logger_1.logger.warning(`Не удалось обработать зависимость ${depName}: ${message}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return result;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Строит полное дерево зависимостей проекта.
|
|
117
|
+
*
|
|
118
|
+
* @param projectPath - путь к корню проекта
|
|
119
|
+
* @returns корневой узел дерева
|
|
120
|
+
*/
|
|
121
|
+
async function buildDependencyTree(projectPath) {
|
|
122
|
+
const rootPackageJsonPath = path.join(projectPath, 'package.json');
|
|
123
|
+
const nodeModulesPath = path.join(projectPath, 'node_modules');
|
|
124
|
+
const rootPackageJson = JSON.parse(await node_fs_1.promises.readFile(rootPackageJsonPath, 'utf-8'));
|
|
125
|
+
const rootNode = new DependencyNode(rootPackageJson, projectPath);
|
|
126
|
+
const processedModules = new Map();
|
|
127
|
+
async function processDependencies(parentNode, nodeModulesDir, packageJsonPath, visited = new Set()) {
|
|
128
|
+
let dependencies = {};
|
|
129
|
+
try {
|
|
130
|
+
const packageJson = JSON.parse(await node_fs_1.promises.readFile(packageJsonPath, 'utf-8'));
|
|
131
|
+
dependencies = packageJson.dependencies || {};
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
logger_1.logger.warning(`Не удалось прочитать package.json для ${parentNode.name}: ${packageJsonPath}`);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
for (const [depName, depVersion] of Object.entries(dependencies)) {
|
|
138
|
+
const depKey = `${depName}@${depVersion}`;
|
|
139
|
+
if (visited.has(depKey)) {
|
|
140
|
+
logger_1.logger.warning(`Обнаружена циклическая зависимость: ${depKey}`);
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
const depPath = path.join(nodeModulesDir, depName);
|
|
144
|
+
try {
|
|
145
|
+
const depPackageJsonPath = path.join(depPath, 'package.json');
|
|
146
|
+
const depPackageJson = JSON.parse(await node_fs_1.promises.readFile(depPackageJsonPath, 'utf-8'));
|
|
147
|
+
const processedKey = `${depPackageJson.name}@${depPackageJson.version}`;
|
|
148
|
+
let depNode;
|
|
149
|
+
if (processedModules.has(processedKey)) {
|
|
150
|
+
depNode = processedModules.get(processedKey);
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
depNode = new DependencyNode(depPackageJson, depPath);
|
|
154
|
+
processedModules.set(processedKey, depNode);
|
|
155
|
+
const newVisited = new Set(visited);
|
|
156
|
+
newVisited.add(depKey);
|
|
157
|
+
await processDependencies(depNode, nodeModulesDir, depPackageJsonPath, newVisited);
|
|
158
|
+
}
|
|
159
|
+
parentNode.dependencies.push(depNode);
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
163
|
+
logger_1.logger.warning(`Не удалось обработать зависимость ${depName}: ${message}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
await processDependencies(rootNode, nodeModulesPath, rootPackageJsonPath);
|
|
168
|
+
return rootNode;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Итеративное уплощение дерева зависимостей (безопасно для больших деревьев).
|
|
172
|
+
*
|
|
173
|
+
* @param rootNode - корневой узел
|
|
174
|
+
* @returns массив узлов в порядке загрузки
|
|
175
|
+
*/
|
|
176
|
+
function flattenDependencyTreeIterative(rootNode) {
|
|
177
|
+
const visited = new Set();
|
|
178
|
+
const result = [];
|
|
179
|
+
const stack = [];
|
|
180
|
+
stack.push({ node: rootNode, path: new Set() });
|
|
181
|
+
while (stack.length > 0) {
|
|
182
|
+
const { node, path } = stack.pop();
|
|
183
|
+
if (path.has(node.hash)) {
|
|
184
|
+
logger_1.logger.warning(`Обнаружена циклическая зависимость: ${node.name}@${node.version}`);
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
if (visited.has(node.hash)) {
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
const unprocessedDeps = node.dependencies.filter(dep => !visited.has(dep.hash));
|
|
191
|
+
if (unprocessedDeps.length === 0) {
|
|
192
|
+
visited.add(node.hash);
|
|
193
|
+
result.push(node);
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
stack.push({ node, path });
|
|
197
|
+
const newPath = new Set(path);
|
|
198
|
+
newPath.add(node.hash);
|
|
199
|
+
for (const dep of unprocessedDeps) {
|
|
200
|
+
if (!path.has(dep.hash)) {
|
|
201
|
+
stack.push({ node: dep, path: newPath });
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return result;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Выводит дерево зависимостей в консоль.
|
|
210
|
+
*/
|
|
211
|
+
function printDependencyTree(node, depth = 0) {
|
|
212
|
+
logger_1.logger.info('\n📦 Дерево зависимостей:');
|
|
213
|
+
function printInternal(node, depth) {
|
|
214
|
+
logger_1.logger.info('='.repeat(50));
|
|
215
|
+
logger_1.logger.info(`${' '.repeat(depth * 2)}${node.name}@${node.version} [${node.hash}]`);
|
|
216
|
+
for (const dep of node.dependencies) {
|
|
217
|
+
printInternal(dep, depth + 1);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
printInternal(node, depth);
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Выводит плоский список зависимостей в консоль.
|
|
224
|
+
*/
|
|
225
|
+
function printFlattenedTree(flatTree) {
|
|
226
|
+
logger_1.logger.info('\n📦 Плоский список зависимостей (в порядке загрузки):');
|
|
227
|
+
logger_1.logger.info('='.repeat(50));
|
|
228
|
+
flatTree.forEach((node, index) => {
|
|
229
|
+
logger_1.logger.info(`${(index + 1).toString().padStart(2)}. ${node.name}@${node.version} [${node.hash}]`);
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Извлекает только ws:package зависимости из плоского списка.
|
|
234
|
+
*/
|
|
235
|
+
function extractBorisTypeDependencies(flatTree) {
|
|
236
|
+
return flatTree.filter(node => {
|
|
237
|
+
const wsPackage = node.packageJson['ws:package'];
|
|
238
|
+
return typeof wsPackage === 'string';
|
|
239
|
+
});
|
|
240
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Сбор информации об исполняемых объектах (executables) из пакетов
|
|
4
|
+
*
|
|
5
|
+
* @module linking/executables
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.collectExecutables = collectExecutables;
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const url_js_1 = require("./utils/url.js");
|
|
45
|
+
const context_js_1 = require("./context.js");
|
|
46
|
+
/**
|
|
47
|
+
* Собирает executables из .executables.json пакета
|
|
48
|
+
* и регистрирует их в контексте линковки
|
|
49
|
+
*/
|
|
50
|
+
function collectExecutables(pkgInfo, ctx) {
|
|
51
|
+
const executablesPath = path.join(pkgInfo.sourceDir, '.executables.json');
|
|
52
|
+
if (!fs.existsSync(executablesPath)) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const executablesData = JSON.parse(fs.readFileSync(executablesPath, 'utf-8'));
|
|
56
|
+
for (const exec of executablesData) {
|
|
57
|
+
const fileKey = `${exec.packageName}+${exec.packageVersion}+${exec.filePath}`;
|
|
58
|
+
const fileAbsoluteUrl = (0, url_js_1.UrlAppenPath)(pkgInfo.rootUrl, exec.filePath.replace(/\.ts$/, '.js').substring(exec.filePath.indexOf('/')));
|
|
59
|
+
(0, context_js_1.addExecutable)(ctx, fileKey, fileAbsoluteUrl);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Генератор api_ext.xml
|
|
4
|
+
* @module linking/generators/api-ext
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.buildApiExt = buildApiExt;
|
|
8
|
+
const xml_1 = require("../../utils/xml");
|
|
9
|
+
/**
|
|
10
|
+
* Генерирует содержимое api_ext.xml файла
|
|
11
|
+
*
|
|
12
|
+
* @param entries - Массив записей для api_ext.xml
|
|
13
|
+
* @returns Содержимое api_ext.xml файла
|
|
14
|
+
*
|
|
15
|
+
* @remarks
|
|
16
|
+
* api_ext.xml содержит список модулей и их библиотек (libs).
|
|
17
|
+
* Создаётся один раз для всего проекта в dist/source/api_ext.xml.
|
|
18
|
+
*
|
|
19
|
+
* Структура:
|
|
20
|
+
* ```xml
|
|
21
|
+
* <api_ext>
|
|
22
|
+
* <apis>
|
|
23
|
+
* <api>
|
|
24
|
+
* <name>module:mypackage</name>
|
|
25
|
+
* <libs>
|
|
26
|
+
* <lib><path>x-local://wt/mypackage/init.xml</path></lib>
|
|
27
|
+
* </libs>
|
|
28
|
+
* </api>
|
|
29
|
+
* </apis>
|
|
30
|
+
* </api_ext>
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts
|
|
35
|
+
* const entries = [
|
|
36
|
+
* { name: 'module:polyfill', libs: ['x-local://wt/polyfill/init.xml'] },
|
|
37
|
+
* { name: 'module:myapp', libs: ['x-local://wt/myapp/init.xml'] }
|
|
38
|
+
* ];
|
|
39
|
+
* const xml = buildApiExt(entries);
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
function buildApiExt(entries) {
|
|
43
|
+
const xmlObj = {
|
|
44
|
+
'?xml': { '@_version': '1.0', '@_encoding': 'utf-8' },
|
|
45
|
+
'api_ext': {
|
|
46
|
+
'apis': {
|
|
47
|
+
'api': entries.map(entry => ({
|
|
48
|
+
'name': entry.name,
|
|
49
|
+
'libs': {
|
|
50
|
+
'lib': entry.libs.map(libPath => ({ 'path': libPath })),
|
|
51
|
+
},
|
|
52
|
+
})),
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
return xml_1.xmlBuilderKeepEmpty.build(xmlObj);
|
|
57
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Генераторы для компонентов (spxml файлы)
|
|
4
|
+
* @module linking/generators/component
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.buildComponentXml = buildComponentXml;
|
|
8
|
+
exports.buildComponentJs = buildComponentJs;
|
|
9
|
+
exports.buildComponentFiles = buildComponentFiles;
|
|
10
|
+
const xml_1 = require("../../utils/xml");
|
|
11
|
+
/**
|
|
12
|
+
* Генерирует содержимое XML файла компонента (spxml/<name>.xml)
|
|
13
|
+
*
|
|
14
|
+
* @param componentName - Имя компонента (обычно name из package.json)
|
|
15
|
+
* @returns Содержимое XML файла компонента
|
|
16
|
+
*
|
|
17
|
+
* @remarks
|
|
18
|
+
* XML файл компонента создаётся в директории spxml/.
|
|
19
|
+
* Содержит определение компонента с атрибутом CODE-LIB="1".
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* buildComponentXml('my-component')
|
|
24
|
+
* // Возвращает XML с тегом <my-component></my-component>
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
function buildComponentXml(componentName) {
|
|
28
|
+
const xmlObj = {
|
|
29
|
+
'?xml': { '@_version': '1.0', '@_encoding': 'utf-8' },
|
|
30
|
+
'SPXML-INLINE-FORM': {
|
|
31
|
+
'@_CODE-LIB': '1',
|
|
32
|
+
[componentName]: '',
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
return xml_1.xmlBuilderKeepEmpty.build(xmlObj);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Генерирует содержимое JS файла компонента (spxml/<name>.js)
|
|
39
|
+
*
|
|
40
|
+
* @param componentName - Имя компонента (обычно name из package.json)
|
|
41
|
+
* @param mainFile - Путь к главному файлу (main из package.json)
|
|
42
|
+
* @param rootUrl - URL корневой директории пакета (x-local://...)
|
|
43
|
+
* @returns Содержимое JS файла компонента
|
|
44
|
+
*
|
|
45
|
+
* @remarks
|
|
46
|
+
* JS файл компонента содержит функцию init(), которая:
|
|
47
|
+
* - Загружает модуль через bt.require
|
|
48
|
+
* - Логирует состояние инициализации
|
|
49
|
+
* - Обрабатывает ошибки
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```ts
|
|
53
|
+
* buildComponentJs('my-component', './index.js', 'x-local://components/my-component')
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
function buildComponentJs(componentName, mainFile, rootUrl) {
|
|
57
|
+
const content = `function init() {
|
|
58
|
+
try {
|
|
59
|
+
alert('Component ${componentName} initializing...');
|
|
60
|
+
bt.require('${mainFile}', '${rootUrl}/spxml')
|
|
61
|
+
alert('Component ${componentName} initialized');
|
|
62
|
+
} catch (g_err) {
|
|
63
|
+
alert('ERROR: Component initializing: ${componentName}:\\r\\n' + g_err);
|
|
64
|
+
throw g_err;
|
|
65
|
+
}
|
|
66
|
+
}`;
|
|
67
|
+
return content;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Генерирует все файлы для компонента
|
|
71
|
+
*
|
|
72
|
+
* @param componentName - Имя компонента
|
|
73
|
+
* @param mainFile - Путь к главному файлу
|
|
74
|
+
* @param rootUrl - URL корневой директории
|
|
75
|
+
* @returns Объект с содержимым XML и JS файлов
|
|
76
|
+
*/
|
|
77
|
+
function buildComponentFiles(componentName, mainFile, rootUrl) {
|
|
78
|
+
return {
|
|
79
|
+
xml: buildComponentXml(componentName),
|
|
80
|
+
js: buildComponentJs(componentName, mainFile, rootUrl),
|
|
81
|
+
fileName: componentName
|
|
82
|
+
};
|
|
83
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Генератор filemap для executable модулей
|
|
4
|
+
* @module linking/generators/filemap
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.generateFilemapJson = generateFilemapJson;
|
|
8
|
+
exports.generateFilemapJsonForPackage = generateFilemapJsonForPackage;
|
|
9
|
+
/**
|
|
10
|
+
* Генерирует содержимое .filemap.json для модуля
|
|
11
|
+
*
|
|
12
|
+
* @param executables - Карта исполняемых файлов: ключ -> URL
|
|
13
|
+
* @returns JSON-строка для записи в .filemap.json
|
|
14
|
+
*
|
|
15
|
+
* @remarks
|
|
16
|
+
* Filemap используется для маппинга ключей файлов на их URL.
|
|
17
|
+
* Теперь создаётся per-module (в каждом модуле) вместо глобального bt:filemap.
|
|
18
|
+
*
|
|
19
|
+
* Структура ключа: `${packageName}+${packageVersion}+${filePath}`
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* const executables = new Map([
|
|
24
|
+
* ['mypackage+1.0.0+src/handler.js', 'x-local://wt/mypackage/handler.js']
|
|
25
|
+
* ]);
|
|
26
|
+
* const json = generateFilemapJson(executables);
|
|
27
|
+
* // -> { "mypackage+1.0.0+src/handler.js": "x-local://wt/mypackage/handler.js" }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
function generateFilemapJson(executables) {
|
|
31
|
+
const data = {};
|
|
32
|
+
for (const [key, value] of executables.entries()) {
|
|
33
|
+
data[key] = value;
|
|
34
|
+
}
|
|
35
|
+
return JSON.stringify(data, null, 2);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Генерирует filemap только для конкретного пакета
|
|
39
|
+
*
|
|
40
|
+
* @param executables - Полная карта исполняемых файлов
|
|
41
|
+
* @param packageName - Имя пакета для фильтрации
|
|
42
|
+
* @returns JSON-строка с данными только для указанного пакета
|
|
43
|
+
*/
|
|
44
|
+
function generateFilemapJsonForPackage(executables, packageName) {
|
|
45
|
+
const data = {};
|
|
46
|
+
const prefix = `${packageName}+`;
|
|
47
|
+
for (const [key, value] of executables.entries()) {
|
|
48
|
+
if (key.startsWith(prefix)) {
|
|
49
|
+
data[key] = value;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return JSON.stringify(data, null, 2);
|
|
53
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Генераторы для linking модуля
|
|
4
|
+
* @module linking/generators
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.buildComponentPackageJsonString = exports.buildComponentPackageJson = exports.generateFilemapJsonForPackage = exports.generateFilemapJson = exports.buildApiExt = exports.buildComponentFiles = exports.buildComponentJs = exports.buildComponentXml = exports.buildInitXml = void 0;
|
|
8
|
+
var init_xml_1 = require("./init-xml");
|
|
9
|
+
Object.defineProperty(exports, "buildInitXml", { enumerable: true, get: function () { return init_xml_1.buildInitXml; } });
|
|
10
|
+
var component_1 = require("./component");
|
|
11
|
+
Object.defineProperty(exports, "buildComponentXml", { enumerable: true, get: function () { return component_1.buildComponentXml; } });
|
|
12
|
+
Object.defineProperty(exports, "buildComponentJs", { enumerable: true, get: function () { return component_1.buildComponentJs; } });
|
|
13
|
+
Object.defineProperty(exports, "buildComponentFiles", { enumerable: true, get: function () { return component_1.buildComponentFiles; } });
|
|
14
|
+
var api_ext_1 = require("./api-ext");
|
|
15
|
+
Object.defineProperty(exports, "buildApiExt", { enumerable: true, get: function () { return api_ext_1.buildApiExt; } });
|
|
16
|
+
var filemap_1 = require("./filemap");
|
|
17
|
+
Object.defineProperty(exports, "generateFilemapJson", { enumerable: true, get: function () { return filemap_1.generateFilemapJson; } });
|
|
18
|
+
Object.defineProperty(exports, "generateFilemapJsonForPackage", { enumerable: true, get: function () { return filemap_1.generateFilemapJsonForPackage; } });
|
|
19
|
+
var package_json_1 = require("./package-json");
|
|
20
|
+
Object.defineProperty(exports, "buildComponentPackageJson", { enumerable: true, get: function () { return package_json_1.buildComponentPackageJson; } });
|
|
21
|
+
Object.defineProperty(exports, "buildComponentPackageJsonString", { enumerable: true, get: function () { return package_json_1.buildComponentPackageJsonString; } });
|