@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,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,6 @@
1
+ "use strict";
2
+ /**
3
+ * Типы для модуля linking
4
+ * @module linking/types
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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; } });