xhs-mp-compiler-cli 2.0.33-beta.1 → 2.0.33-beta.2

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.
@@ -33,7 +33,7 @@
33
33
  ];
34
34
  const proxyDynamicVars = ["__xhsRoute", "__pageId"];
35
35
  /**
36
- * 这里是获取的微信8.0.62版本中全局环境中的值
36
+ * 对齐微信8.0.62版本中全局环境中的值
37
37
  */
38
38
  const baseJSValue = [
39
39
  "Object", "Function", "Array", "Number", "Boolean", "String", "Symbol", "Date", "Promise", "RegExp",
@@ -112,9 +112,10 @@
112
112
  };
113
113
  // 定时器函数包装,避免 this 绑定问题
114
114
  const copyTimerFunctions = (items) => {
115
+ const _ = FrameworkGlobalThis;
115
116
  for (const item of items) {
116
117
  Object.defineProperty(BussinessGlobalThis, item, {
117
- value: (...args) => FrameworkGlobalThis[item](...args),
118
+ value: (...args) => _[item](...args),
118
119
  writable: true,
119
120
  configurable: true,
120
121
  enumerable: true,
@@ -130,12 +131,10 @@
130
131
  copyTimerFunctions(['setTimeout', 'clearTimeout', 'setInterval', 'clearInterval']);
131
132
  try {
132
133
  Object.defineProperty(BussinessGlobalThis, 'globalThis', {
133
- get() { return BussinessGlobalThis; },
134
- set(value) {
135
- // 忽略修改
136
- },
137
- configurable: false,
138
- enumerable: true,
134
+ value: BussinessGlobalThis,
135
+ configurable: true,
136
+ enumerable: false,
137
+ writable: true
139
138
  });
140
139
  }
141
140
  catch (error) {
@@ -1,10 +1,15 @@
1
1
  import { IXhsCompiler } from 'xhs-mp-pack';
2
2
  import { IPresetOptions } from '../../../../types';
3
+ import { Compilation, sources } from 'webpack';
4
+ type SourceMapSourceType = sources.SourceMapSource;
5
+ type RawSourceType = sources.RawSource;
6
+ type ConcatSourceType = sources.ConcatSource;
7
+ type GeneratedSource = SourceMapSourceType | RawSourceType | ConcatSourceType;
3
8
  declare class ServiceChunkPlugin {
4
9
  options: IPresetOptions;
5
10
  constructor(options: IPresetOptions);
6
11
  apply(compiler: IXhsCompiler): void;
7
- updateIndependentService(compilation: any, wrappedRuntimeCode: any): void;
8
- updateNonIndependentService(compilation: any): void;
12
+ updateIndependentService(compilation: Compilation, wrappedRuntimeSource: GeneratedSource): void;
13
+ updateNonIndependentService(compilation: Compilation): void;
9
14
  }
10
15
  export default ServiceChunkPlugin;
@@ -16,76 +16,94 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
16
16
  const webpack_1 = require("webpack");
17
17
  const sanbox_1 = require("./sanbox");
18
18
  // 使用 webpack 内置的 sources 类型
19
- const { SourceMapSource, RawSource } = webpack_1.sources;
20
- // 统一处理 sourceAndMap() 返回结果的函数
21
- function extractSourceAndMap(source) {
19
+ const { SourceMapSource, RawSource, ConcatSource } = webpack_1.sources;
20
+ // 安全地将任何源码转换为 GeneratedSource
21
+ function ensureGeneratedSource(source) {
22
22
  if (!source) {
23
- return { sourceString: '', sourceMap: null };
23
+ return new RawSource('');
24
24
  }
25
- // 如果是字符串,直接返回
26
25
  if (typeof source === 'string') {
27
- return { sourceString: source, sourceMap: null };
26
+ return new RawSource(source);
28
27
  }
29
- // 如果是 Source 对象,调用 sourceAndMap 方法
30
- const result = source.sourceAndMap();
31
- const sourceString = typeof result.source === 'string' ? result.source : result.source.toString();
32
- return { sourceString, sourceMap: result.map };
28
+ return source;
33
29
  }
34
- // 类型安全的 sourcemap 转换函数
35
- function createSourceMapSource(sourceCode, filename, sourceMap, originalSource) {
36
- if (!sourceMap) {
37
- return new RawSource(sourceCode);
38
- }
30
+ // 调试辅助函数:验证 sourcemap 的完整性
31
+ function validateSourceMapIntegrity(source, filename) {
39
32
  try {
40
- return new SourceMapSource(sourceCode, filename, sourceMap, originalSource);
33
+ const result = source.sourceAndMap();
34
+ if (result.map) {
35
+ // 基本的 sourcemap 结构验证
36
+ const map = result.map;
37
+ if (!map.sources || !Array.isArray(map.sources)) {
38
+ console.warn(`⚠️ Invalid sourcemap for ${filename}: missing or invalid sources`);
39
+ }
40
+ if (!map.mappings || typeof map.mappings !== 'string') {
41
+ console.warn(`⚠️ Invalid sourcemap for ${filename}: missing or invalid mappings`);
42
+ }
43
+ if (map.sources.length === 0) {
44
+ console.warn(`⚠️ Empty sourcemap sources for ${filename}`);
45
+ }
46
+ }
41
47
  }
42
48
  catch (error) {
43
- console.warn(`Failed to create SourceMapSource for ${filename}, falling back to RawSource:`, error);
44
- return new RawSource(sourceCode);
49
+ console.warn(`⚠️ Failed to validate sourcemap for ${filename}:`, error);
45
50
  }
46
51
  }
47
- // 通用的代码包装函数
48
- function wrapCodeWithGlobalCheck(code, globalVarName, filename, sourceMap, originalSource) {
49
- const wrappedCode = [
52
+ // 创建源码包装器,正确处理 sourcemap 偏移
53
+ function createSourceWrapper(prefixCode, originalSource, suffixCode, filename) {
54
+ // 如果没有原始源码,只返回前缀和后缀的组合
55
+ if (!originalSource) {
56
+ const combinedCode = [prefixCode, suffixCode].filter(Boolean).join('\n');
57
+ return new RawSource(combinedCode);
58
+ }
59
+ const concatSource = new ConcatSource();
60
+ // 添加前缀代码
61
+ if (prefixCode) {
62
+ concatSource.add(new RawSource(prefixCode + '\n'));
63
+ }
64
+ // 添加原始源码(保持 sourcemap)
65
+ concatSource.add(ensureGeneratedSource(originalSource));
66
+ // 添加后缀代码
67
+ if (suffixCode) {
68
+ concatSource.add(new RawSource('\n' + suffixCode));
69
+ }
70
+ return concatSource;
71
+ }
72
+ // 通用的代码包装函数 - 使用 ConcatSource 保持 sourcemap 准确性
73
+ function wrapCodeWithGlobalCheck(source, globalVarName, filename) {
74
+ const prefixCode = [
50
75
  `if (!globalThis.${globalVarName}) {`,
51
- `globalThis.${globalVarName} = true;`,
52
- code,
53
- `}`
76
+ `globalThis.${globalVarName} = true;`
54
77
  ].join('\n');
55
- if (sourceMap && originalSource) {
56
- return createSourceMapSource(wrappedCode, filename, sourceMap, originalSource);
57
- }
58
- return new RawSource(wrappedCode);
78
+ const suffixCode = '}';
79
+ return createSourceWrapper(prefixCode, source, suffixCode, filename);
59
80
  }
60
81
  // 为 common 代码添加注入保护包装
61
82
  function wrapCommonCodeWithProtection(commonSource) {
62
- // 使用统一的 extractSourceAndMap 函数处理所有情况
63
- const { sourceString, sourceMap } = extractSourceAndMap(commonSource);
64
- // 如果没有内容,返回空的源码信息
65
- if (!sourceString) {
66
- return { sourceString: '', sourceMap: null };
67
- }
68
- const wrappedSource = wrapCodeWithGlobalCheck(sourceString, '__XHS_COMMON_SERVICE_REGISTERED__', 'service-common.js', sourceMap, sourceString);
69
- const wrappedSourceAndMap = extractSourceAndMap(wrappedSource);
70
- return wrappedSourceAndMap;
83
+ // 如果没有内容,返回 null
84
+ if (!commonSource) {
85
+ return null;
86
+ }
87
+ return wrapCodeWithGlobalCheck(commonSource, '__XHS_COMMON_SERVICE_REGISTERED__', 'service-common.js');
71
88
  }
72
- // 处理业务代码的 sourcemap(支持不同的代码组合)
73
- function createBusinessCodeSource(runtimeCode, serviceSource, filename, commonSource) {
74
- const codeParts = [runtimeCode];
75
- // 如果提供了 common 代码,则添加到代码组合中
76
- if (commonSource && commonSource.sourceString) {
77
- codeParts.push(commonSource.sourceString);
78
- }
79
- codeParts.push(serviceSource.sourceString);
80
- const finalCode = codeParts.filter(Boolean).join('\n');
81
- // 优先使用 service 的 sourcemap,如果没有则使用 common 的 sourcemap
82
- if (serviceSource.sourceMap) {
83
- return createSourceMapSource(finalCode, filename, serviceSource.sourceMap, serviceSource.sourceString);
84
- }
85
- if (commonSource && commonSource.sourceMap) {
86
- return createSourceMapSource(finalCode, filename, commonSource.sourceMap, commonSource.sourceString);
87
- }
88
- return new RawSource(finalCode);
89
+ // 处理业务代码的 sourcemap(支持不同的代码组合)- 使用 ConcatSource 保持准确的 sourcemap
90
+ function createBusinessCodeSource(runtimeSource, serviceSource, filename, commonSource) {
91
+ const concatSource = new ConcatSource();
92
+ // 添加 runtime 代码
93
+ if (runtimeSource) {
94
+ concatSource.add(ensureGeneratedSource(runtimeSource));
95
+ concatSource.add(new RawSource('\n'));
96
+ }
97
+ // 添加 common 代码(如果有)
98
+ if (commonSource) {
99
+ concatSource.add(ensureGeneratedSource(commonSource));
100
+ concatSource.add(new RawSource('\n'));
101
+ }
102
+ // 添加 service 代码
103
+ if (serviceSource) {
104
+ concatSource.add(ensureGeneratedSource(serviceSource));
105
+ }
106
+ return concatSource;
89
107
  }
90
108
  // bom环境变量 与微信产物对齐
91
109
  const bomVars = [
@@ -105,32 +123,28 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
105
123
  function adapteServiceCode(assetName, serviceSource, packSetting, project, isIndependent) {
106
124
  var _a;
107
125
  const subPackages = project.getSubPackages();
108
- let result;
109
- if (packSetting.runInServiceSandbox) {
110
- const { sourceString, sourceMap } = extractSourceAndMap(serviceSource);
111
- const subPackagesStr = subPackages.map(sub => sub.root).join(';');
112
- const codeParts = [];
113
- // 只有独立分包或主包才需要注入沙盒函数定义
114
- // 非独立分包会使用主包已经定义的沙盒函数
115
- if (isIndependent) {
116
- // __PKG_SLOT__ 替换为真实分包路径
117
- codeParts.push(`globalThis.__XHS_CACHED_SANDBOX__ = globalThis.__XHS_CACHED_SANDBOX__ || (${(_a = sanbox_1.getXHSSandBox.toString()) === null || _a === void 0 ? void 0 : _a.replace('${PKG_SLOT}', subPackagesStr)})();`);
118
- }
119
- // 如果在沙盒直接定义这些属性会导致 document in 等操作符返回true 所以bom变量通过函数参数来定义
120
- codeParts.push(`(function(${bomVars.join(',')}) {`);
121
- // 所有分包都需要 with 包装来使用沙盒环境
122
- codeParts.push('with (this) {');
123
- codeParts.push(sourceString);
124
- codeParts.push('}'); // with 结束
125
- codeParts.push('}).call(globalThis.__XHS_CACHED_SANDBOX__);');
126
- const newSource = codeParts.join('\n');
127
- // 使用类型安全的 sourcemap 创建函数
128
- result = createSourceMapSource(newSource, assetName, sourceMap, sourceString);
129
- }
130
- else {
131
- result = serviceSource;
132
- }
133
- return result;
126
+ if (!packSetting.runInServiceSandbox) {
127
+ return typeof serviceSource === 'string' ? new RawSource(serviceSource) : serviceSource;
128
+ }
129
+ const subPackagesStr = subPackages.map((sub) => sub.root).join(';');
130
+ const prefixParts = [];
131
+ // 只有独立分包或主包才需要注入沙盒函数定义
132
+ // 非独立分包会使用主包已经定义的沙盒函数
133
+ if (isIndependent) {
134
+ // __PKG_SLOT__ 替换为真实分包路径
135
+ prefixParts.push(`globalThis.__XHS_CACHED_SANDBOX__ = globalThis.__XHS_CACHED_SANDBOX__ || (${(_a = sanbox_1.getXHSSandBox.toString()) === null || _a === void 0 ? void 0 : _a.replace('${PKG_SLOT}', subPackagesStr)})();`);
136
+ }
137
+ // 如果在沙盒直接定义这些属性会导致 document in 等操作符返回true 所以bom变量通过函数参数来定义
138
+ prefixParts.push(`(function(${bomVars.join(',')}) {`);
139
+ // 所有分包都需要 with 包装来使用沙盒环境
140
+ prefixParts.push('with (this) {');
141
+ const suffixParts = [
142
+ '}', // with 结束
143
+ '}).call(globalThis.__XHS_CACHED_SANDBOX__);'
144
+ ];
145
+ const prefixCode = prefixParts.join('\n');
146
+ const suffixCode = suffixParts.join('\n');
147
+ return createSourceWrapper(prefixCode, serviceSource, suffixCode, assetName);
134
148
  }
135
149
  class ServiceChunkPlugin {
136
150
  constructor(options) {
@@ -148,22 +162,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
148
162
  const runtimeSourceOriginal = (_c = compilation.getAsset('runtime.js')) === null || _c === void 0 ? void 0 : _c.source;
149
163
  // 当没有引用相同 js 场景时, commonChunk 将是 undefined
150
164
  const commonSourceOriginal = (_d = compilation.getAsset('service-common.js')) === null || _d === void 0 ? void 0 : _d.source;
151
- // 包装 runtime code,统一使用 extractSourceAndMap 处理
152
- const { sourceString: runtimeCodeString } = extractSourceAndMap(runtimeSourceOriginal);
153
- const wrappedRuntimeCodeSource = wrapCodeWithGlobalCheck(runtimeCodeString, '__XHS_WEBPACK_RUNTIME_REGISTERED__', 'runtime.js');
154
- const wrappedRuntimeCode = wrappedRuntimeCodeSource.source().toString();
165
+ // 包装 runtime code,保持 sourcemap
166
+ const wrappedRuntimeSource = wrapCodeWithGlobalCheck(runtimeSourceOriginal, '__XHS_WEBPACK_RUNTIME_REGISTERED__', 'runtime.js');
155
167
  // 为 common 代码添加注入保护包装,保持 sourcemap
156
168
  const wrappedCommonSource = wrapCommonCodeWithProtection(commonSourceOriginal);
157
169
  if (packSetting.enableV2 && serviceSourceV2) {
158
170
  // 注入 v2 service.js
159
171
  // 主包加入 runtimeChunk、commonChunk
160
172
  const assetName = 'v2/service.js';
161
- // 先获取原始的 source 和 sourcemap
162
- const serviceSource = extractSourceAndMap(serviceSourceV2);
163
173
  // 创建业务代码的 SourceMapSource(保留 common + service 的 sourcemap)
164
- const concatenatedSource = createBusinessCodeSource(wrappedRuntimeCode, serviceSource, assetName, wrappedCommonSource);
174
+ const concatenatedSource = createBusinessCodeSource(wrappedRuntimeSource, serviceSourceV2, assetName, wrappedCommonSource);
165
175
  // 在写入之前进行 adapteServiceCode 处理(主包,需要沙盒)
166
176
  const finalSourceWithMap = adapteServiceCode(assetName, concatenatedSource, packSetting, project, true);
177
+ // 验证最终的 sourcemap 完整性
178
+ if (packSetting.enableSourcemap) {
179
+ validateSourceMapIntegrity(finalSourceWithMap, assetName);
180
+ }
167
181
  // @ts-ignore
168
182
  compilation.updateAsset(assetName, finalSourceWithMap);
169
183
  }
@@ -171,43 +185,53 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
171
185
  if (packSetting.enableV1 && serviceSource) {
172
186
  // // 主包加入 runtimeChunk、commonChunk
173
187
  const assetName = 'v1/service.js';
174
- // 先获取原始的 source 和 sourcemap
175
- const v1ServiceSource = extractSourceAndMap(serviceSource);
176
188
  // 创建业务代码的 SourceMapSource(保留 common + service 的 sourcemap)
177
- const concatenatedV1Source = createBusinessCodeSource(wrappedRuntimeCode, v1ServiceSource, assetName, wrappedCommonSource);
189
+ const concatenatedV1Source = createBusinessCodeSource(wrappedRuntimeSource, serviceSource, assetName, wrappedCommonSource);
178
190
  // 在写入之前进行 adapteServiceCode 处理(主包,需要沙盒)
179
191
  const finalV1SourceWithMap = adapteServiceCode(assetName, concatenatedV1Source, packSetting, project, true);
192
+ // 验证最终的 sourcemap 完整性
193
+ if (packSetting.enableSourcemap) {
194
+ validateSourceMapIntegrity(finalV1SourceWithMap, assetName);
195
+ }
180
196
  // @ts-ignore
181
197
  compilation.updateAsset(assetName, finalV1SourceWithMap);
182
198
  }
183
199
  // 处理独立分包(只需要 runtime,不需要 common)
184
- this.updateIndependentService(compilation, wrappedRuntimeCode);
200
+ this.updateIndependentService(compilation, wrappedRuntimeSource);
185
201
  // 处理非独立分包(不需要 runtime 和 common)
186
202
  this.updateNonIndependentService(compilation);
203
+ // 删除已合并的原始文件,避免 sourcemap 冲突和文件冗余
187
204
  compilation.deleteAsset('runtime.js');
188
205
  compilation.deleteAsset('service-common.js');
206
+ // 同时删除对应的 sourcemap 文件(如果存在)
207
+ if (packSetting.enableSourcemap) {
208
+ compilation.deleteAsset('runtime.js.map');
209
+ compilation.deleteAsset('service-common.js.map');
210
+ }
189
211
  });
190
212
  });
191
213
  }
192
- updateIndependentService(compilation, wrappedRuntimeCode) {
214
+ updateIndependentService(compilation, wrappedRuntimeSource) {
193
215
  const { project, packSetting } = this.options;
194
216
  const usingPackageType = packSetting.usingPackageType;
195
217
  const subPackages = project.getSubPackages();
196
218
  subPackages
197
- .filter(sub => sub.independent)
198
- .forEach(sub => {
219
+ .filter((sub) => sub.independent)
220
+ .forEach((sub) => {
199
221
  var _a;
200
222
  const servicePath = path_1.default.join(usingPackageType, sub.root, 'service.js');
201
223
  if (compilation.getAsset(servicePath)) {
202
224
  const independentServiceSource = (_a = compilation.getAsset(servicePath)) === null || _a === void 0 ? void 0 : _a.source;
203
- // 先获取原始的 source 和 sourcemap
204
- const indepServiceSource = extractSourceAndMap(independentServiceSource);
205
225
  // 创建独立分包的业务代码(只包含 runtime + service,不包含 common)
206
- const concatenatedIndepSource = createBusinessCodeSource(wrappedRuntimeCode, indepServiceSource, servicePath
226
+ const concatenatedIndepSource = createBusinessCodeSource(wrappedRuntimeSource, independentServiceSource, servicePath
207
227
  // 不传入 commonSource,所以不包含 common 代码
208
228
  );
209
229
  // 在写入之前进行 adapteServiceCode 处理(独立分包,需要沙盒)
210
230
  const finalIndepSourceWithMap = adapteServiceCode(servicePath, concatenatedIndepSource, packSetting, project, true);
231
+ // 验证最终的 sourcemap 完整性
232
+ if (packSetting.enableSourcemap) {
233
+ validateSourceMapIntegrity(finalIndepSourceWithMap, servicePath);
234
+ }
211
235
  // 写入
212
236
  compilation.updateAsset(servicePath, finalIndepSourceWithMap);
213
237
  if (packSetting.enableV2 && packSetting.enableV1) {
@@ -221,21 +245,23 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
221
245
  const usingPackageType = packSetting.usingPackageType;
222
246
  const subPackages = project.getSubPackages();
223
247
  subPackages
224
- .filter(sub => !sub.independent) // 非独立分包
225
- .forEach(sub => {
248
+ .filter((sub) => !sub.independent) // 非独立分包
249
+ .forEach((sub) => {
226
250
  var _a;
227
251
  const servicePath = path_1.default.join(usingPackageType, sub.root, 'service.js');
228
252
  if (compilation.getAsset(servicePath)) {
229
253
  const nonIndependentServiceSource = (_a = compilation.getAsset(servicePath)) === null || _a === void 0 ? void 0 : _a.source;
230
- // 先获取原始的 source 和 sourcemap
231
- const serviceSource = extractSourceAndMap(nonIndependentServiceSource);
232
254
  // 非独立分包只需要处理自己的 service 代码,不需要 runtime 和 common
233
- const processedServiceSource = createBusinessCodeSource('', // 不需要 runtime
234
- serviceSource, servicePath
255
+ const processedServiceSource = createBusinessCodeSource(null, // 不需要 runtime
256
+ nonIndependentServiceSource, servicePath
235
257
  // 不传入 commonSource,所以不包含 common 代码
236
258
  );
237
259
  // 在写入之前进行 adapteServiceCode 处理(非独立分包,不需要沙盒)
238
260
  const finalServiceWithMap = adapteServiceCode(servicePath, processedServiceSource, packSetting, project, false);
261
+ // 验证最终的 sourcemap 完整性
262
+ if (packSetting.enableSourcemap) {
263
+ validateSourceMapIntegrity(finalServiceWithMap, servicePath);
264
+ }
239
265
  // 写入
240
266
  compilation.updateAsset(servicePath, finalServiceWithMap);
241
267
  if (packSetting.enableV2 && packSetting.enableV1) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xhs-mp-compiler-cli",
3
- "version": "2.0.33-beta.1",
3
+ "version": "2.0.33-beta.2",
4
4
  "description": "xhs mp command tool.",
5
5
  "preferGlobal": true,
6
6
  "category": "esm",
@@ -88,18 +88,18 @@
88
88
  "webpack-chain": "^6.5.1",
89
89
  "webpack-sources": "^3.2.2",
90
90
  "xhs-mp-workerpool": "^9.2.0",
91
- "xhs-mp-ml-loader": "2.0.33-beta.1",
92
- "xhs-mp-compiler-utils": "2.0.33-beta.1",
93
- "xhs-mp-pack": "2.0.33-beta.1",
94
- "xhs-mp-project": "2.0.33-beta.1",
95
- "xhs-mp-shared": "2.0.33-beta.1",
96
- "xhs-mp-shared-fs": "2.0.33-beta.1",
97
- "xhs-mp-sjs-loader": "2.0.33-beta.1",
98
- "xhs-mp-sketch-loader": "2.0.33-beta.1",
91
+ "xhs-mp-ml-loader": "2.0.33-beta.2",
92
+ "xhs-mp-compiler-utils": "2.0.33-beta.2",
93
+ "xhs-mp-pack": "2.0.33-beta.2",
94
+ "xhs-mp-project": "2.0.33-beta.2",
95
+ "xhs-mp-shared": "2.0.33-beta.2",
96
+ "xhs-mp-shared-fs": "2.0.33-beta.2",
97
+ "xhs-mp-sjs-loader": "2.0.33-beta.2",
98
+ "xhs-mp-sketch-loader": "2.0.33-beta.2",
99
99
  "yauzl": "^2.10.0"
100
100
  },
101
101
  "peerDependencies": {
102
- "xhs-mp-ml-parser": "2.0.33-beta.1"
102
+ "xhs-mp-ml-parser": "2.0.33-beta.2"
103
103
  },
104
104
  "devDependencies": {
105
105
  "@types/babel__generator": "7.6.3",
@@ -122,7 +122,7 @@
122
122
  "@types/node": "14",
123
123
  "typescript": "5.1.6",
124
124
  "webpack-dev-server": "4.0.0-beta.3",
125
- "xhs-mp-ml-parser": "2.0.33-beta.1"
125
+ "xhs-mp-ml-parser": "2.0.33-beta.2"
126
126
  },
127
127
  "scripts": {
128
128
  "version": "formula changelog && git add .",