@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,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Linker для standalone пакетов
|
|
4
|
+
* @module linking/linkers/standalone
|
|
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.standaloneLinker = 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 init_xml_1 = require("../generators/init-xml");
|
|
47
|
+
const filemap_1 = require("../generators/filemap");
|
|
48
|
+
/**
|
|
49
|
+
* Linker для standalone пакетов
|
|
50
|
+
*
|
|
51
|
+
* @remarks
|
|
52
|
+
* Standalone пакеты:
|
|
53
|
+
* - Генерируют init.xml
|
|
54
|
+
* - Генерируют .filemap.json (per-module)
|
|
55
|
+
* - Регистрируются в api_ext.xml
|
|
56
|
+
* - Копируют node_modules (с кэшированием)
|
|
57
|
+
*/
|
|
58
|
+
exports.standaloneLinker = {
|
|
59
|
+
type: 'standalone',
|
|
60
|
+
link(pkg, ctx) {
|
|
61
|
+
const { sourceDir, targetPath, packageJson, rootUrl, projectPath, wsName } = pkg;
|
|
62
|
+
const { distPath, executables, logger, cache, devMode, changedFiles } = ctx;
|
|
63
|
+
const generatedFiles = [];
|
|
64
|
+
// Полный путь к целевой директории
|
|
65
|
+
const fullTargetPath = path.join(distPath, targetPath);
|
|
66
|
+
// 1. Копируем файлы пакета
|
|
67
|
+
if (devMode && changedFiles.length > 0) {
|
|
68
|
+
// Инкрементальное копирование — только изменённые файлы
|
|
69
|
+
for (const srcFile of changedFiles) {
|
|
70
|
+
const relativePath = path.relative(sourceDir, srcFile);
|
|
71
|
+
// Пропускаем файлы не из sourceDir (например, из другого пакета)
|
|
72
|
+
if (relativePath.startsWith('..')) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const dstFile = path.join(fullTargetPath, relativePath);
|
|
76
|
+
fs.mkdirSync(path.dirname(dstFile), { recursive: true });
|
|
77
|
+
fs.copyFileSync(srcFile, dstFile);
|
|
78
|
+
}
|
|
79
|
+
logger.success(` ├─ Copied ${changedFiles.length} changed file(s) to ${targetPath}`);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// Полное копирование
|
|
83
|
+
(0, copy_1.copyRecursive)(sourceDir, fullTargetPath);
|
|
84
|
+
logger.success(` ├─ Copied files to ${targetPath}`);
|
|
85
|
+
}
|
|
86
|
+
// 2. Копируем node_modules (с кэшированием) — только при полной линковке
|
|
87
|
+
if (!devMode) {
|
|
88
|
+
(0, node_modules_1.copyNodeModulesWithCache)({
|
|
89
|
+
searchDir: projectPath,
|
|
90
|
+
targetDir: fullTargetPath,
|
|
91
|
+
wsName,
|
|
92
|
+
cache,
|
|
93
|
+
logger
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
// 3. Создаём init.xml (только если его нет в build/)
|
|
97
|
+
const mainFile = packageJson.main;
|
|
98
|
+
const initXmlPath = path.join(fullTargetPath, 'init.xml');
|
|
99
|
+
const initXmlExists = fs.existsSync(initXmlPath);
|
|
100
|
+
if (mainFile && !initXmlExists) {
|
|
101
|
+
const initXmlContent = (0, init_xml_1.buildInitXml)(mainFile, rootUrl);
|
|
102
|
+
if ((0, write_1.writeIfChanged)(initXmlPath, initXmlContent)) {
|
|
103
|
+
generatedFiles.push('init.xml');
|
|
104
|
+
logger.success(` ├─ Generated init.xml`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else if (initXmlExists && !devMode) {
|
|
108
|
+
logger.success(` ├─ Using existing init.xml`);
|
|
109
|
+
}
|
|
110
|
+
// 4. Создаём .filemap.json (per-module)
|
|
111
|
+
if (executables.size > 0) {
|
|
112
|
+
const filemapContent = (0, filemap_1.generateFilemapJson)(executables);
|
|
113
|
+
const filemapPath = path.join(fullTargetPath, '.filemap.json');
|
|
114
|
+
if ((0, write_1.writeIfChanged)(filemapPath, filemapContent)) {
|
|
115
|
+
generatedFiles.push('.filemap.json');
|
|
116
|
+
logger.success(` ├─ Generated .filemap.json`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// 5. Формируем apiext запись
|
|
120
|
+
let apiext;
|
|
121
|
+
const wsApiext = packageJson['ws:apiext'];
|
|
122
|
+
if (wsApiext) {
|
|
123
|
+
// Явно указано в package.json
|
|
124
|
+
apiext = {
|
|
125
|
+
name: wsApiext.name,
|
|
126
|
+
libs: wsApiext.libs.map((lib) => rootUrl + '/' + path.posix.normalize(lib))
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
else if (mainFile) {
|
|
130
|
+
// Автоматически по main, используем wsName
|
|
131
|
+
apiext = {
|
|
132
|
+
name: `module:${wsName}`,
|
|
133
|
+
libs: [rootUrl + '/init.xml']
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
logger.success(` └─ Standalone package linked: ${packageJson.name} (ws:name=${wsName})`);
|
|
137
|
+
return {
|
|
138
|
+
info: pkg,
|
|
139
|
+
outputPath: fullTargetPath,
|
|
140
|
+
apiext,
|
|
141
|
+
generatedFiles
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Linker для system пакетов (бывший bt)
|
|
4
|
+
* @module linking/linkers/system
|
|
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.systemLinker = void 0;
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const copy_1 = require("../utils/copy");
|
|
43
|
+
const node_modules_1 = require("../utils/node-modules");
|
|
44
|
+
/**
|
|
45
|
+
* Linker для system пакетов
|
|
46
|
+
*
|
|
47
|
+
* @remarks
|
|
48
|
+
* System пакеты (ранее назывались 'bt'):
|
|
49
|
+
* - Уже **полностью готовы** к линковке
|
|
50
|
+
* - Все необходимые файлы (init.xml, spxml/ и т.д.) уже есть в build/
|
|
51
|
+
* - **Ничего не генерируется** - только копирование
|
|
52
|
+
* - Режим линковки определяется через CLI флаг `--linking-system-as`:
|
|
53
|
+
* - `component` (по умолчанию): копируются в components/<ws:name>, НЕ добавляются в api_ext.xml
|
|
54
|
+
* - `standalone`: копируются по ws:root, добавляются в api_ext.xml
|
|
55
|
+
* - Копируют node_modules
|
|
56
|
+
*
|
|
57
|
+
* Примеры: polyfill, runtime
|
|
58
|
+
*/
|
|
59
|
+
exports.systemLinker = {
|
|
60
|
+
type: 'system',
|
|
61
|
+
link(pkg, ctx) {
|
|
62
|
+
const { sourceDir, targetPath, packageJson, projectPath, apiext, wsName } = pkg;
|
|
63
|
+
const { distPath, logger, systemLinkMode, cache } = ctx;
|
|
64
|
+
// Полный путь к целевой директории
|
|
65
|
+
const fullTargetPath = path.join(distPath, targetPath);
|
|
66
|
+
// 1. Копируем файлы пакета как есть (всё уже готово)
|
|
67
|
+
(0, copy_1.copyRecursive)(sourceDir, fullTargetPath);
|
|
68
|
+
logger.success(` ├─ Copied files to ${targetPath}`);
|
|
69
|
+
// 2. Копируем node_modules (с кэшированием)
|
|
70
|
+
(0, node_modules_1.copyNodeModulesWithCache)({
|
|
71
|
+
searchDir: projectPath,
|
|
72
|
+
targetDir: fullTargetPath,
|
|
73
|
+
wsName,
|
|
74
|
+
cache,
|
|
75
|
+
logger
|
|
76
|
+
});
|
|
77
|
+
logger.success(` └─ System package linked as ${systemLinkMode}: ${packageJson.name} (ws:name=${wsName})`);
|
|
78
|
+
// apiext уже определён в PackageInfo в зависимости от режима
|
|
79
|
+
return {
|
|
80
|
+
info: pkg,
|
|
81
|
+
outputPath: fullTargetPath,
|
|
82
|
+
apiext,
|
|
83
|
+
generatedFiles: [] // System пакеты ничего не генерируют
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
};
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Парсеры информации о пакетах для линковки
|
|
4
|
+
*
|
|
5
|
+
* Содержит функции для парсинга PackageInfo из:
|
|
6
|
+
* - DependencyNode (для compiler dependencies / polyfill)
|
|
7
|
+
* - BtConfigLinkingPackage (для пользовательских пакетов)
|
|
8
|
+
*
|
|
9
|
+
* @module linking/parsers
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.parseCompilerDependencyPackageInfo = parseCompilerDependencyPackageInfo;
|
|
46
|
+
exports.parseUserPackageInfo = parseUserPackageInfo;
|
|
47
|
+
const fs = __importStar(require("fs"));
|
|
48
|
+
const path = __importStar(require("path"));
|
|
49
|
+
const logger_js_1 = require("../logger.js");
|
|
50
|
+
const index_js_1 = require("./utils/index.js");
|
|
51
|
+
/**
|
|
52
|
+
* Парсит PackageInfo из DependencyNode (для compiler dependencies)
|
|
53
|
+
*
|
|
54
|
+
* @remarks
|
|
55
|
+
* System пакеты линкуются в зависимости от режима:
|
|
56
|
+
* - component (по умолчанию): копируются в components/<ws:name>, НЕ добавляются в api_ext.xml
|
|
57
|
+
* - standalone: копируются по ws:root, добавляются в api_ext.xml
|
|
58
|
+
*/
|
|
59
|
+
function parseCompilerDependencyPackageInfo(dep, ctx) {
|
|
60
|
+
const packageJson = dep.packageJson;
|
|
61
|
+
const packageType = (0, index_js_1.normalizePackageType)(packageJson['ws:package']);
|
|
62
|
+
const wsRoot = packageJson['ws:root'];
|
|
63
|
+
const wsName = packageJson['ws:name'];
|
|
64
|
+
const { systemLinkMode } = ctx;
|
|
65
|
+
if (!packageType) {
|
|
66
|
+
logger_js_1.logger.warning(`Package ${packageJson.name} does not have ws:package field, skipping`);
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
if (packageType === 'library') {
|
|
70
|
+
// Library пакеты обрабатываются через node_modules
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
// ws:name обязательно для всех пакетов кроме library
|
|
74
|
+
if (!wsName || typeof wsName !== 'string') {
|
|
75
|
+
logger_js_1.logger.error(`Package ${packageJson.name}: ws:name field is required for ${packageType} packages`);
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
// Для system пакетов определяем targetPath и apiext в зависимости от режима
|
|
79
|
+
let targetPath;
|
|
80
|
+
let rootUrl;
|
|
81
|
+
let apiext;
|
|
82
|
+
if (packageType === 'system') {
|
|
83
|
+
if (systemLinkMode === 'standalone') {
|
|
84
|
+
// Standalone режим: копируем по ws:root, добавляем в api_ext.xml
|
|
85
|
+
// ws:root обязателен для standalone режима
|
|
86
|
+
if (typeof wsRoot !== 'string' || wsRoot === '') {
|
|
87
|
+
logger_js_1.logger.error(`Invalid ws:root field in ${dep.projectPath}/package.json. Required for standalone mode.`);
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
targetPath = wsRoot;
|
|
91
|
+
rootUrl = 'x-local://' + path.posix.normalize(wsRoot);
|
|
92
|
+
// Формируем apiext
|
|
93
|
+
const wsApiext = packageJson['ws:apiext'];
|
|
94
|
+
if (wsApiext) {
|
|
95
|
+
apiext = {
|
|
96
|
+
name: wsApiext.name,
|
|
97
|
+
libs: wsApiext.libs.map((lib) => rootUrl + '/' + path.posix.normalize(lib))
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
else if (packageJson.main) {
|
|
101
|
+
apiext = {
|
|
102
|
+
name: `module:${wsName}`,
|
|
103
|
+
libs: [rootUrl + '/init.xml']
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
// Component режим (по умолчанию): копируем в components/<ws:name>, НЕ добавляем в api_ext.xml
|
|
109
|
+
targetPath = `./components/${wsName}`;
|
|
110
|
+
rootUrl = 'x-local://components/' + wsName;
|
|
111
|
+
apiext = undefined; // Компоненты не регистрируются в api_ext.xml
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
// Для standalone/component пакетов - вычисляем targetPath
|
|
116
|
+
if (packageType === 'component') {
|
|
117
|
+
targetPath = `./components/${wsName}`;
|
|
118
|
+
}
|
|
119
|
+
else if (typeof wsRoot === 'string' && wsRoot !== '') {
|
|
120
|
+
targetPath = wsRoot;
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
// ws:root опционален для standalone, по умолчанию ./wt/<ws:name>
|
|
124
|
+
targetPath = `./wt/${wsName}`;
|
|
125
|
+
}
|
|
126
|
+
rootUrl = 'x-local://' + path.posix.normalize(targetPath);
|
|
127
|
+
const wsApiext = packageJson['ws:apiext'];
|
|
128
|
+
if (wsApiext) {
|
|
129
|
+
apiext = {
|
|
130
|
+
name: wsApiext.name,
|
|
131
|
+
libs: wsApiext.libs.map((lib) => rootUrl + '/' + path.posix.normalize(lib))
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
else if (packageJson.main && packageType !== 'component') {
|
|
135
|
+
// Компоненты не регистрируются в api_ext.xml
|
|
136
|
+
apiext = {
|
|
137
|
+
name: `module:${wsName}`,
|
|
138
|
+
libs: [rootUrl + '/init.xml']
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
dependencyNode: dep,
|
|
144
|
+
packageJson,
|
|
145
|
+
packageType,
|
|
146
|
+
wsName,
|
|
147
|
+
projectPath: dep.projectPath,
|
|
148
|
+
sourceDir: path.join(dep.projectPath, 'build'),
|
|
149
|
+
targetPath,
|
|
150
|
+
rootUrl,
|
|
151
|
+
apiext,
|
|
152
|
+
needsInitGeneration: false // System пакеты ничего не генерируют
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Парсит PackageInfo из пользовательской конфигурации
|
|
157
|
+
*
|
|
158
|
+
* @remarks
|
|
159
|
+
* Для не-BT пакетов (без ws:package) выполняет копирование и возвращает null.
|
|
160
|
+
* Для BT пакетов формирует полную информацию включая targetPath и apiext.
|
|
161
|
+
*/
|
|
162
|
+
function parseUserPackageInfo(projectPath, packageDirAbsolute, packageConfig, displayName) {
|
|
163
|
+
// Проверяем существование директории пакета
|
|
164
|
+
if (!fs.existsSync(packageDirAbsolute)) {
|
|
165
|
+
logger_js_1.logger.error(`❌ Package directory not found: ${packageDirAbsolute}`);
|
|
166
|
+
process.exit(1);
|
|
167
|
+
}
|
|
168
|
+
// Проверяем наличие package.json и определяем тип пакета
|
|
169
|
+
const packageJsonPath = path.join(packageDirAbsolute, 'package.json');
|
|
170
|
+
let packageJson = null;
|
|
171
|
+
let packageType = null;
|
|
172
|
+
if (fs.existsSync(packageJsonPath)) {
|
|
173
|
+
try {
|
|
174
|
+
packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
175
|
+
packageType = (0, index_js_1.normalizePackageType)(packageJson['ws:package']);
|
|
176
|
+
if (packageType === 'library') {
|
|
177
|
+
logger_js_1.logger.error(`❌ Package ${displayName}: libraries (ws:package: "library") cannot be linked directly. They are included via node_modules of executable packages.`);
|
|
178
|
+
process.exit(1);
|
|
179
|
+
}
|
|
180
|
+
else if (packageJson['ws:package'] && !packageType) {
|
|
181
|
+
logger_js_1.logger.error(`❌ Package ${displayName}: invalid ws:package type "${packageJson['ws:package']}". Valid types: ${(0, index_js_1.formatValidPackageTypes)()}`);
|
|
182
|
+
process.exit(1);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
logger_js_1.logger.error(`❌ Failed to parse package.json in ${packageDirAbsolute}: ${error}`);
|
|
187
|
+
process.exit(1);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
const isBorisTypePackage = packageType && (0, index_js_1.isExecutablePackageType)(packageType);
|
|
191
|
+
// Проверяем ws:name для BT пакетов
|
|
192
|
+
let wsName;
|
|
193
|
+
if (isBorisTypePackage) {
|
|
194
|
+
wsName = packageJson['ws:name'];
|
|
195
|
+
if (!wsName || typeof wsName !== 'string') {
|
|
196
|
+
logger_js_1.logger.error(`❌ Package ${displayName}: ws:name field is required for ${packageType} packages`);
|
|
197
|
+
process.exit(1);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// Определяем source директорию
|
|
201
|
+
let sourceDir;
|
|
202
|
+
if (packageConfig.source) {
|
|
203
|
+
sourceDir = path.join(projectPath, packageConfig.source);
|
|
204
|
+
}
|
|
205
|
+
else if (isBorisTypePackage) {
|
|
206
|
+
sourceDir = path.join(packageDirAbsolute, 'build');
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
logger_js_1.logger.error(`❌ Package ${displayName}: 'source' is required for non-BorisType packages`);
|
|
210
|
+
process.exit(1);
|
|
211
|
+
}
|
|
212
|
+
if (!fs.existsSync(sourceDir)) {
|
|
213
|
+
logger_js_1.logger.error(`❌ Source directory not found: ${sourceDir}`);
|
|
214
|
+
process.exit(1);
|
|
215
|
+
}
|
|
216
|
+
// Определяем target
|
|
217
|
+
let targetPath;
|
|
218
|
+
if (packageConfig.target) {
|
|
219
|
+
targetPath = packageConfig.target;
|
|
220
|
+
}
|
|
221
|
+
else if (isBorisTypePackage && packageJson) {
|
|
222
|
+
if (packageType === 'component') {
|
|
223
|
+
if (packageJson['ws:root']) {
|
|
224
|
+
logger_js_1.logger.error(`❌ Package ${displayName}: components cannot have 'ws:root' field. They are always placed in ./components/<ws:name>`);
|
|
225
|
+
process.exit(1);
|
|
226
|
+
}
|
|
227
|
+
targetPath = `./components/${wsName}`;
|
|
228
|
+
}
|
|
229
|
+
else if (packageJson['ws:root']) {
|
|
230
|
+
targetPath = packageJson['ws:root'];
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
// ws:root опционален для standalone, по умолчанию ./wt/<ws:name>
|
|
234
|
+
targetPath = `./wt/${wsName}`;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
logger_js_1.logger.error(`❌ Package ${displayName}: 'target' is required for non-BorisType packages`);
|
|
239
|
+
process.exit(1);
|
|
240
|
+
}
|
|
241
|
+
if (!isBorisTypePackage) {
|
|
242
|
+
// Обычная директория - просто копируем
|
|
243
|
+
const distPath = path.join(projectPath, 'dist');
|
|
244
|
+
const fullTargetPath = path.join(distPath, targetPath);
|
|
245
|
+
(0, index_js_1.copyRecursive)(sourceDir, fullTargetPath);
|
|
246
|
+
const sourceInfo = packageConfig.source || '';
|
|
247
|
+
logger_js_1.logger.success(`✓ Copied ${displayName} (${sourceInfo}) to ${targetPath}`);
|
|
248
|
+
return null;
|
|
249
|
+
}
|
|
250
|
+
const rootUrl = 'x-local://' + path.posix.normalize(targetPath);
|
|
251
|
+
// Формируем apiext
|
|
252
|
+
let apiext;
|
|
253
|
+
const wsApiext = packageJson['ws:apiext'];
|
|
254
|
+
if (wsApiext) {
|
|
255
|
+
apiext = {
|
|
256
|
+
name: wsApiext.name,
|
|
257
|
+
libs: wsApiext.libs.map((lib) => rootUrl + '/' + path.posix.normalize(lib))
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
else if (packageJson.main && packageType !== 'component') {
|
|
261
|
+
// Компоненты не регистрируются в api_ext.xml
|
|
262
|
+
apiext = {
|
|
263
|
+
name: `module:${wsName}`,
|
|
264
|
+
libs: [rootUrl + '/init.xml']
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
return {
|
|
268
|
+
packageJson,
|
|
269
|
+
packageType: packageType,
|
|
270
|
+
wsName: wsName,
|
|
271
|
+
projectPath: packageDirAbsolute,
|
|
272
|
+
sourceDir,
|
|
273
|
+
targetPath,
|
|
274
|
+
rootUrl,
|
|
275
|
+
apiext,
|
|
276
|
+
needsInitGeneration: !!packageJson.main && !wsApiext
|
|
277
|
+
};
|
|
278
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Утилиты для копирования файлов и директорий
|
|
4
|
+
* @module linking/utils/copy
|
|
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.copyRecursive = copyRecursive;
|
|
41
|
+
exports.copyWithPrefix = copyWithPrefix;
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
/**
|
|
45
|
+
* Рекурсивно копирует файлы и папки
|
|
46
|
+
*
|
|
47
|
+
* @param source - Путь к исходному файлу или директории
|
|
48
|
+
* @param target - Путь к целевому файлу или директории
|
|
49
|
+
*
|
|
50
|
+
* @remarks
|
|
51
|
+
* - Следует по symlink (использует fs.statSync вместо fs.lstatSync)
|
|
52
|
+
* - Создаёт целевые директории автоматически
|
|
53
|
+
* - Копирует файлы и поддиректории рекурсивно
|
|
54
|
+
*/
|
|
55
|
+
function copyRecursive(source, target) {
|
|
56
|
+
// Используем fs.statSync чтобы следовать по symlink если это ссылка
|
|
57
|
+
const stats = fs.statSync(source);
|
|
58
|
+
if (stats.isDirectory()) {
|
|
59
|
+
fs.mkdirSync(target, { recursive: true });
|
|
60
|
+
const items = fs.readdirSync(source);
|
|
61
|
+
for (const itemName of items) {
|
|
62
|
+
const sourcePath = path.join(source, itemName);
|
|
63
|
+
const targetPath = path.join(target, itemName);
|
|
64
|
+
// Используем fs.statSync чтобы следовать по symlink
|
|
65
|
+
const itemStats = fs.statSync(sourcePath);
|
|
66
|
+
if (itemStats.isDirectory()) {
|
|
67
|
+
copyRecursive(sourcePath, targetPath);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
fs.copyFileSync(sourcePath, targetPath);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
// Если source это файл (или symlink на файл), просто копируем
|
|
76
|
+
fs.copyFileSync(source, target);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Копирует все содержимое папки в другую папку с добавлением префикса к относительным путям
|
|
81
|
+
*
|
|
82
|
+
* @param sourceDir - Исходная папка
|
|
83
|
+
* @param targetDir - Целевая папка
|
|
84
|
+
* @param pathPrefix - Префикс для относительных путей (например: './wt/test')
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```ts
|
|
88
|
+
* // Копирует содержимое /src/build в /dist/wt/mypackage
|
|
89
|
+
* copyWithPrefix('/src/build', '/dist', './wt/mypackage');
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
function copyWithPrefix(sourceDir, targetDir, pathPrefix) {
|
|
93
|
+
// Нормализуем пути
|
|
94
|
+
const normalizedSource = path.normalize(sourceDir);
|
|
95
|
+
const normalizedTarget = path.normalize(targetDir);
|
|
96
|
+
const normalizedPrefix = path.normalize(pathPrefix);
|
|
97
|
+
// Создаем целевую папку с учетом префикса
|
|
98
|
+
const targetWithPrefix = path.join(normalizedTarget, normalizedPrefix);
|
|
99
|
+
// Рекурсивно копируем содержимое
|
|
100
|
+
copyRecursive(normalizedSource, targetWithPrefix);
|
|
101
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Утилиты для linking модуля
|
|
4
|
+
* @module linking/utils
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.UrlAppenPath = exports.copyIfChanged = exports.writeIfChanged = exports.formatValidPackageTypes = exports.getLegacyPackageTypes = exports.getValidPackageTypes = exports.isExecutablePackageType = exports.normalizePackageType = exports.copyPackageContent = exports.processPackageDirectory = exports.copyNodeModulesWithCache = exports.copyNodeModules = exports.copyWithPrefix = exports.copyRecursive = void 0;
|
|
8
|
+
var copy_1 = require("./copy");
|
|
9
|
+
Object.defineProperty(exports, "copyRecursive", { enumerable: true, get: function () { return copy_1.copyRecursive; } });
|
|
10
|
+
Object.defineProperty(exports, "copyWithPrefix", { enumerable: true, get: function () { return copy_1.copyWithPrefix; } });
|
|
11
|
+
var node_modules_1 = require("./node-modules");
|
|
12
|
+
Object.defineProperty(exports, "copyNodeModules", { enumerable: true, get: function () { return node_modules_1.copyNodeModules; } });
|
|
13
|
+
Object.defineProperty(exports, "copyNodeModulesWithCache", { enumerable: true, get: function () { return node_modules_1.copyNodeModulesWithCache; } });
|
|
14
|
+
Object.defineProperty(exports, "processPackageDirectory", { enumerable: true, get: function () { return node_modules_1.processPackageDirectory; } });
|
|
15
|
+
Object.defineProperty(exports, "copyPackageContent", { enumerable: true, get: function () { return node_modules_1.copyPackageContent; } });
|
|
16
|
+
var package_type_1 = require("./package-type");
|
|
17
|
+
Object.defineProperty(exports, "normalizePackageType", { enumerable: true, get: function () { return package_type_1.normalizePackageType; } });
|
|
18
|
+
Object.defineProperty(exports, "isExecutablePackageType", { enumerable: true, get: function () { return package_type_1.isExecutablePackageType; } });
|
|
19
|
+
Object.defineProperty(exports, "getValidPackageTypes", { enumerable: true, get: function () { return package_type_1.getValidPackageTypes; } });
|
|
20
|
+
Object.defineProperty(exports, "getLegacyPackageTypes", { enumerable: true, get: function () { return package_type_1.getLegacyPackageTypes; } });
|
|
21
|
+
Object.defineProperty(exports, "formatValidPackageTypes", { enumerable: true, get: function () { return package_type_1.formatValidPackageTypes; } });
|
|
22
|
+
var write_1 = require("./write");
|
|
23
|
+
Object.defineProperty(exports, "writeIfChanged", { enumerable: true, get: function () { return write_1.writeIfChanged; } });
|
|
24
|
+
Object.defineProperty(exports, "copyIfChanged", { enumerable: true, get: function () { return write_1.copyIfChanged; } });
|
|
25
|
+
var url_1 = require("./url");
|
|
26
|
+
Object.defineProperty(exports, "UrlAppenPath", { enumerable: true, get: function () { return url_1.UrlAppenPath; } });
|