@tmsfe/tmskit 0.0.39 → 0.0.42

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/dist/index.cjs.js CHANGED
@@ -1440,23 +1440,35 @@ const fixAppJson = appJson => {
1440
1440
  const {
1441
1441
  subpackages
1442
1442
  } = appJson;
1443
+ // 创建插件映射,用于检测插件配置冲突
1443
1444
  const pluginsMap = {};
1445
+ // 记录app.json顶层的插件配置
1444
1446
  Object.keys(appJson.plugins || {}).forEach(key => pluginsMap[key] = ['app.json']);
1447
+
1448
+ // 处理每个分包的配置
1445
1449
  const subps = subpackages.map(subp => {
1450
+ // 需要从分包提取到app.json顶层的数组类型字段
1446
1451
  const arrOfFileType = ['requiredBackgroundModes', 'embeddedAppIdList'];
1452
+ // 需要从分包提取到app.json顶层的对象类型字段
1447
1453
  const objOfFileType = ['preloadRule'];
1454
+
1455
+ // 遍历分包中的每个配置项
1448
1456
  Object.keys(subp).forEach(key => {
1457
+ // 处理插件配置,检查是否有重复配置的插件
1449
1458
  if (key === 'plugins') {
1450
1459
  Object.keys(subp.plugins).forEach(pk => {
1460
+ // 记录每个插件被哪些地方配置
1451
1461
  pluginsMap[pk] ? pluginsMap[pk].push(`分包${subp.name}`) : pluginsMap[pk] = [`分包${subp.name}`];
1452
1462
  });
1453
1463
  }
1454
- // 分包里数组类型字段,提到appjson最上层
1464
+
1465
+ // 处理数组类型字段(如requiredBackgroundModes),合并到app.json顶层并去重
1455
1466
  if (arrOfFileType.indexOf(key) > -1) {
1456
1467
  const preVal = appJson[key];
1457
1468
  preVal ? appJson[key] = Array.from(new Set(preVal.slice(0).concat(subp[key]))) : appJson[key] = subp[key].slice(0);
1458
1469
  }
1459
- // 分包里对象类型字段,提到appjson最上层
1470
+
1471
+ // 处理对象类型字段(如preloadRule),合并到app.json顶层,已存在的键值不覆盖
1460
1472
  if (objOfFileType.indexOf(key) > -1) {
1461
1473
  const preloadRuleMap = appJson[key] || {};
1462
1474
  subp[key] && Object.keys(subp[key]).forEach(page => {
@@ -1467,9 +1479,12 @@ const fixAppJson = appJson => {
1467
1479
  appJson[key] = preloadRuleMap;
1468
1480
  }
1469
1481
  });
1482
+
1483
+ // 从分包配置中移除已提取到顶层的字段以及一些构建相关的内部字段
1470
1484
  return filterField$7(subp, [...arrOfFileType, ...objOfFileType, 'dependencies', 'path']);
1471
1485
  });
1472
- // 如果plugins重复,则错误提示
1486
+
1487
+ // 检查插件配置冲突,如果同一个插件在多处配置则报错
1473
1488
  const pluginsErrMsg = Object.keys(pluginsMap).map(pk => {
1474
1489
  if (pluginsMap[pk].length > 1) {
1475
1490
  return `${pluginsMap[pk].join(',')}重复配置plugin(${pk});`;
@@ -1479,9 +1494,44 @@ const fixAppJson = appJson => {
1479
1494
  if (pluginsErrMsg) {
1480
1495
  throw new Error(`plugins配置出现错误:${pluginsErrMsg}`);
1481
1496
  }
1497
+
1498
+ // 用处理后的分包配置更新app.json的subpackages字段
1482
1499
  appJson.subpackages = subps;
1483
1500
  };
1484
1501
 
1502
+ /**
1503
+ * 合并分包配置,保留已有分包,添加新分包
1504
+ * @param {Array} existingPackages 现有的分包配置
1505
+ * @param {Array} newPackages 新的分包配置
1506
+ * @returns {Array} 合并后的分包配置
1507
+ */
1508
+ function mergeSubPackages(existingPackages, newPackages) {
1509
+ // 创建结果数组和root到索引的映射
1510
+ const resultPackages = [...existingPackages];
1511
+ const rootMap = {};
1512
+
1513
+ // 建立现有分包的root映射
1514
+ existingPackages.forEach((pkg, index) => {
1515
+ if (pkg.root) {
1516
+ rootMap[pkg.root] = index;
1517
+ }
1518
+ });
1519
+
1520
+ // 合并新分包
1521
+ newPackages.forEach(newPkg => {
1522
+ if (!newPkg.root) return; // 忽略没有root的分包
1523
+
1524
+ if (rootMap[newPkg.root] !== undefined) {
1525
+ // 如果已存在相同root的分包,则不覆盖保留原有配置
1526
+ info$f(`保留已有分包配置, root: ${newPkg.root}, name: ${newPkg.name || '未命名'}`);
1527
+ } else {
1528
+ // 如果不存在,则添加新分包
1529
+ resultPackages.push(newPkg);
1530
+ }
1531
+ });
1532
+ return resultPackages;
1533
+ }
1534
+
1485
1535
  /**
1486
1536
  * 动态生成编译后的app.json
1487
1537
  * @param {object} tmsConfig
@@ -1494,13 +1544,14 @@ async function buildOutputAppJson$3(tmsConfig, modules) {
1494
1544
  // 获取所有模块,合并模块依赖的模块
1495
1545
  const modulesConfig = getModulesConfig(modules, tmsConfig, false);
1496
1546
  // 获取所有的分包
1497
- const subPackages = getSubPackages$3(modulesConfig);
1547
+ const newSubPackages = getSubPackages$3(modulesConfig);
1498
1548
  // 获取app.json的配置
1499
1549
  let appJson = getAppJsonContent(resolve$h('./app.json'));
1500
1550
 
1501
- // 更新app.json中的subpackages
1502
- appJson.subpackages = subPackages;
1503
- appJson.subpackages.sort((item1, item2) => item1.name.localeCompare(item2.name));
1551
+ // 保留已有分包配置,合并新的分包配置
1552
+ const existingSubpackages = appJson.subpackages || [];
1553
+ appJson.subpackages = mergeSubPackages(existingSubpackages, newSubPackages);
1554
+ appJson.subpackages.sort((item1, item2) => item1.root.localeCompare(item2.root));
1504
1555
 
1505
1556
  // 处理appJson中重复||冲突的地方
1506
1557
  fixAppJson(appJson);
@@ -4128,7 +4179,7 @@ var entry = [{
4128
4179
 
4129
4180
  var require$$12 = {
4130
4181
  name: "@tmsfe/tmskit",
4131
- version: "0.0.39",
4182
+ version: "0.0.42",
4132
4183
  description: "tmskit",
4133
4184
  main: "dist/index.cjs",
4134
4185
  bin: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tmsfe/tmskit",
3
- "version": "0.0.39",
3
+ "version": "0.0.42",
4
4
  "description": "tmskit",
5
5
  "main": "dist/index.cjs",
6
6
  "bin": {
@@ -71,27 +71,39 @@ const getAppJsonContent = (sourceAppJsonPath) => {
71
71
  */
72
72
  const fixAppJson = (appJson) => {
73
73
  const { subpackages } = appJson;
74
+ // 创建插件映射,用于检测插件配置冲突
74
75
  const pluginsMap = {};
76
+ // 记录app.json顶层的插件配置
75
77
  Object.keys(appJson.plugins || {}).forEach(key => pluginsMap[key] = ['app.json']);
78
+
79
+ // 处理每个分包的配置
76
80
  const subps = subpackages.map((subp) => {
81
+ // 需要从分包提取到app.json顶层的数组类型字段
77
82
  const arrOfFileType = ['requiredBackgroundModes', 'embeddedAppIdList'];
83
+ // 需要从分包提取到app.json顶层的对象类型字段
78
84
  const objOfFileType = ['preloadRule'];
85
+
86
+ // 遍历分包中的每个配置项
79
87
  Object.keys(subp).forEach((key) => {
88
+ // 处理插件配置,检查是否有重复配置的插件
80
89
  if (key === 'plugins') {
81
90
  Object.keys(subp.plugins).forEach((pk) => {
91
+ // 记录每个插件被哪些地方配置
82
92
  pluginsMap[pk]
83
93
  ? pluginsMap[pk].push(`分包${subp.name}`)
84
94
  : pluginsMap[pk] = [`分包${subp.name}`];
85
95
  });
86
96
  }
87
- // 分包里数组类型字段,提到appjson最上层
97
+
98
+ // 处理数组类型字段(如requiredBackgroundModes),合并到app.json顶层并去重
88
99
  if (arrOfFileType.indexOf(key) > -1) {
89
100
  const preVal = appJson[key];
90
101
  preVal
91
102
  ? appJson[key] = Array.from(new Set(preVal.slice(0).concat(subp[key])))
92
103
  : appJson[key] = subp[key].slice(0);
93
104
  }
94
- // 分包里对象类型字段,提到appjson最上层
105
+
106
+ // 处理对象类型字段(如preloadRule),合并到app.json顶层,已存在的键值不覆盖
95
107
  if (objOfFileType.indexOf(key) > -1) {
96
108
  const preloadRuleMap = appJson[key] || {};
97
109
  subp[key] && Object.keys(subp[key]).forEach((page) => {
@@ -102,9 +114,12 @@ const fixAppJson = (appJson) => {
102
114
  appJson[key] = preloadRuleMap;
103
115
  }
104
116
  });
117
+
118
+ // 从分包配置中移除已提取到顶层的字段以及一些构建相关的内部字段
105
119
  return filterField(subp, [...arrOfFileType, ...objOfFileType, 'dependencies', 'path']);
106
120
  });
107
- // 如果plugins重复,则错误提示
121
+
122
+ // 检查插件配置冲突,如果同一个插件在多处配置则报错
108
123
  const pluginsErrMsg = Object.keys(pluginsMap).map((pk) => {
109
124
  if (pluginsMap[pk].length > 1) {
110
125
  return `${pluginsMap[pk].join(',')}重复配置plugin(${pk});`;
@@ -115,9 +130,45 @@ const fixAppJson = (appJson) => {
115
130
  if (pluginsErrMsg) {
116
131
  throw new Error(`plugins配置出现错误:${pluginsErrMsg}`);
117
132
  }
133
+
134
+ // 用处理后的分包配置更新app.json的subpackages字段
118
135
  appJson.subpackages = subps;
119
136
  };
120
137
 
138
+ /**
139
+ * 合并分包配置,保留已有分包,添加新分包
140
+ * @param {Array} existingPackages 现有的分包配置
141
+ * @param {Array} newPackages 新的分包配置
142
+ * @returns {Array} 合并后的分包配置
143
+ */
144
+ function mergeSubPackages(existingPackages, newPackages) {
145
+ // 创建结果数组和root到索引的映射
146
+ const resultPackages = [...existingPackages];
147
+ const rootMap = {};
148
+
149
+ // 建立现有分包的root映射
150
+ existingPackages.forEach((pkg, index) => {
151
+ if (pkg.root) {
152
+ rootMap[pkg.root] = index;
153
+ }
154
+ });
155
+
156
+ // 合并新分包
157
+ newPackages.forEach((newPkg) => {
158
+ if (!newPkg.root) return; // 忽略没有root的分包
159
+
160
+ if (rootMap[newPkg.root] !== undefined) {
161
+ // 如果已存在相同root的分包,则不覆盖保留原有配置
162
+ info(`保留已有分包配置, root: ${newPkg.root}, name: ${newPkg.name || '未命名'}`);
163
+ } else {
164
+ // 如果不存在,则添加新分包
165
+ resultPackages.push(newPkg);
166
+ }
167
+ });
168
+
169
+ return resultPackages;
170
+ }
171
+
121
172
  /**
122
173
  * 动态生成编译后的app.json
123
174
  * @param {object} tmsConfig
@@ -129,13 +180,14 @@ async function buildOutputAppJson(tmsConfig, modules) {
129
180
  // 获取所有模块,合并模块依赖的模块
130
181
  const modulesConfig = getModulesConfig(modules, tmsConfig, false);
131
182
  // 获取所有的分包
132
- const subPackages = getSubPackages(modulesConfig);
183
+ const newSubPackages = getSubPackages(modulesConfig);
133
184
  // 获取app.json的配置
134
185
  let appJson = getAppJsonContent(resolve('./app.json'));
135
186
 
136
- // 更新app.json中的subpackages
137
- appJson.subpackages = subPackages;
138
- appJson.subpackages.sort((item1, item2) => item1.name.localeCompare(item2.name));
187
+ // 保留已有分包配置,合并新的分包配置
188
+ const existingSubpackages = appJson.subpackages || [];
189
+ appJson.subpackages = mergeSubPackages(existingSubpackages, newSubPackages);
190
+ appJson.subpackages.sort((item1, item2) => item1.root.localeCompare(item2.root));
139
191
 
140
192
  // 处理appJson中重复||冲突的地方
141
193
  fixAppJson(appJson);