@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.
Files changed (116) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +66 -0
  3. package/build/builder/config.js +88 -0
  4. package/build/cli/commands/artifact.js +14 -0
  5. package/build/cli/commands/build.js +25 -0
  6. package/build/cli/commands/dev.js +190 -0
  7. package/build/cli/commands/index.js +18 -0
  8. package/build/cli/commands/init.js +15 -0
  9. package/build/cli/commands/link.js +18 -0
  10. package/build/cli/commands/push.js +28 -0
  11. package/build/cli/index.js +14 -0
  12. package/build/cli/types.js +2 -0
  13. package/build/core/artifacting/context.js +54 -0
  14. package/build/core/artifacting/index.js +37 -0
  15. package/build/core/artifacting/stages/index.js +10 -0
  16. package/build/core/artifacting/stages/main-archive.js +72 -0
  17. package/build/core/artifacting/stages/validate.js +70 -0
  18. package/build/core/artifacting/types.js +6 -0
  19. package/build/core/artifacting/utils/index.js +10 -0
  20. package/build/core/artifacting/utils/zip.js +94 -0
  21. package/build/core/babel.js +96 -0
  22. package/build/core/btconfig.types.js +6 -0
  23. package/build/core/build.js +280 -0
  24. package/build/core/building/compile-mode.js +146 -0
  25. package/build/core/building/compiler.js +281 -0
  26. package/build/core/building/coordinator.js +71 -0
  27. package/build/core/building/files.js +290 -0
  28. package/build/core/building/index.js +102 -0
  29. package/build/core/building/output.js +92 -0
  30. package/build/core/building/transformers.js +110 -0
  31. package/build/core/building/types.js +19 -0
  32. package/build/core/config.js +157 -0
  33. package/build/core/dependencies.js +223 -0
  34. package/build/core/linking/cache.js +260 -0
  35. package/build/core/linking/context.js +149 -0
  36. package/build/core/linking/dependencies.js +240 -0
  37. package/build/core/linking/executables.js +61 -0
  38. package/build/core/linking/generators/api-ext.js +57 -0
  39. package/build/core/linking/generators/component.js +83 -0
  40. package/build/core/linking/generators/filemap.js +53 -0
  41. package/build/core/linking/generators/index.js +21 -0
  42. package/build/core/linking/generators/init-xml.js +37 -0
  43. package/build/core/linking/generators/package-json.js +50 -0
  44. package/build/core/linking/index.js +213 -0
  45. package/build/core/linking/linkers/component.js +175 -0
  46. package/build/core/linking/linkers/index.js +69 -0
  47. package/build/core/linking/linkers/standalone.js +144 -0
  48. package/build/core/linking/linkers/system.js +86 -0
  49. package/build/core/linking/parsers.js +278 -0
  50. package/build/core/linking/types.js +6 -0
  51. package/build/core/linking/utils/copy.js +101 -0
  52. package/build/core/linking/utils/index.js +26 -0
  53. package/build/core/linking/utils/node-modules.js +226 -0
  54. package/build/core/linking/utils/package-type.js +101 -0
  55. package/build/core/linking/utils/url.js +73 -0
  56. package/build/core/linking/utils/write.js +91 -0
  57. package/build/core/logger.js +10 -0
  58. package/build/core/pushing/config.js +90 -0
  59. package/build/core/pushing/index.js +96 -0
  60. package/build/core/pushing/init-scripts.js +173 -0
  61. package/build/core/pushing/queue.js +95 -0
  62. package/build/core/pushing/reinit.js +61 -0
  63. package/build/core/pushing/session.js +167 -0
  64. package/build/core/pushing/types.js +6 -0
  65. package/build/core/pushing/upload.js +35 -0
  66. package/build/core/tsconfig.js +78 -0
  67. package/build/core/utils/index.js +17 -0
  68. package/build/core/utils/logger.js +46 -0
  69. package/build/core/utils/properties.js +81 -0
  70. package/build/core/utils/xml.js +44 -0
  71. package/build/core/utils.js +59 -0
  72. package/build/index.js +76 -0
  73. package/build/plugins/destructuring.js +83 -0
  74. package/build/plugins/forOfToForIn.js +14 -0
  75. package/build/plugins/loopHoistVariables.js +160 -0
  76. package/build/plugins/precedence.js +172 -0
  77. package/build/plugins/removeImportExport.js +42 -0
  78. package/build/plugins/replaceDollar.js +16 -0
  79. package/build/plugins/spreadArray.js +42 -0
  80. package/build/plugins/spreadObject.js +91 -0
  81. package/build/transformers/arrayFunctional.js +467 -0
  82. package/build/transformers/arrayGeneral.js +222 -0
  83. package/build/transformers/blockScoping.js +212 -0
  84. package/build/transformers/destructuring.js +133 -0
  85. package/build/transformers/dirname.js +79 -0
  86. package/build/transformers/enumsToObjects.js +25 -0
  87. package/build/transformers/execObj.js +220 -0
  88. package/build/transformers/forOfToForIn.js +45 -0
  89. package/build/transformers/funcSemantic.js +113 -0
  90. package/build/transformers/functions.js +270 -0
  91. package/build/transformers/globalCache.js +34 -0
  92. package/build/transformers/loopHoistVariables.js +352 -0
  93. package/build/transformers/math.js +39 -0
  94. package/build/transformers/namespaces.js +22 -0
  95. package/build/transformers/numericSeparator.js +46 -0
  96. package/build/transformers/objectProperties.js +54 -0
  97. package/build/transformers/precedence.js +192 -0
  98. package/build/transformers/propSemantic.js +467 -0
  99. package/build/transformers/remodule.js +620 -0
  100. package/build/transformers/removeImportExport.js +135 -0
  101. package/build/transformers/replaceDollar.js +46 -0
  102. package/build/transformers/shorthandProperties.js +34 -0
  103. package/build/transformers/spreadArray.js +68 -0
  104. package/build/transformers/spreadObject.js +134 -0
  105. package/build/transformers/string.js +138 -0
  106. package/build/transformers/templateLiterals.js +104 -0
  107. package/build/transformers/tocodelibrary.js +178 -0
  108. package/build/transformers/utils.js +202 -0
  109. package/build/wshcm/client.js +193 -0
  110. package/build/wshcm/evaluator.js +111 -0
  111. package/build/wshcm/exceptions.js +25 -0
  112. package/build/wshcm/index.js +20 -0
  113. package/build/wshcm/soap-utils.js +228 -0
  114. package/build/wshcm/types.js +2 -0
  115. package/build/wshcm/uploader.js +320 -0
  116. 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; } });