xhs-mp-compiler-cli 1.1.3 → 1.1.5

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 (118) hide show
  1. package/dist/bin/xhs-mp-cli-build.d.ts +2 -0
  2. package/dist/bin/xhs-mp-cli-build.js +40 -0
  3. package/dist/bin/xhs-mp-cli-dev.d.ts +2 -0
  4. package/dist/bin/xhs-mp-cli-dev.js +59 -0
  5. package/dist/bin/xhs-mp-cli.d.ts +2 -0
  6. package/dist/bin/xhs-mp-cli.js +16 -0
  7. package/dist/compiler.d.ts +76 -0
  8. package/dist/compiler.js +361 -0
  9. package/dist/compilerCP.d.ts +1 -0
  10. package/dist/compilerCP.js +175 -0
  11. package/dist/config/constant.config.d.ts +27 -0
  12. package/dist/config/constant.config.js +30 -0
  13. package/dist/config/dir.config.d.ts +3 -0
  14. package/dist/config/dir.config.js +16 -0
  15. package/dist/index.d.ts +84 -0
  16. package/dist/index.js +454 -0
  17. package/dist/packs/index.d.ts +14 -0
  18. package/dist/packs/index.js +31 -0
  19. package/dist/packs/mp-pack/index.d.ts +3 -0
  20. package/dist/packs/mp-pack/index.js +32 -0
  21. package/dist/packs/webpack/dev-server/index.d.ts +3 -0
  22. package/dist/packs/webpack/dev-server/index.js +64 -0
  23. package/dist/packs/webpack/dev-server/lib/ensurePort.d.ts +2 -0
  24. package/dist/packs/webpack/dev-server/lib/ensurePort.js +32 -0
  25. package/dist/packs/webpack/dev-server/lib/openBrowser.d.ts +2 -0
  26. package/dist/packs/webpack/dev-server/lib/openBrowser.js +23 -0
  27. package/dist/packs/webpack/dev-server/lib/openChrome.applescript +78 -0
  28. package/dist/packs/webpack/index.d.ts +3 -0
  29. package/dist/packs/webpack/index.js +92 -0
  30. package/dist/packs/webpack/webpack.d.ts +21 -0
  31. package/dist/packs/webpack/webpack.js +79 -0
  32. package/dist/presets/babel.d.ts +8 -0
  33. package/dist/presets/babel.js +59 -0
  34. package/dist/presets/common.d.ts +4 -0
  35. package/dist/presets/common.js +48 -0
  36. package/dist/presets/configs/minigame/assets/assetsEntryPlugin.d.ts +10 -0
  37. package/dist/presets/configs/minigame/assets/assetsEntryPlugin.js +46 -0
  38. package/dist/presets/configs/minigame/assets/index.d.ts +3 -0
  39. package/dist/presets/configs/minigame/assets/index.js +65 -0
  40. package/dist/presets/configs/minigame/service/index.d.ts +3 -0
  41. package/dist/presets/configs/minigame/service/index.js +34 -0
  42. package/dist/presets/configs/minigame/service/resolveLimitPlugin.d.ts +8 -0
  43. package/dist/presets/configs/minigame/service/resolveLimitPlugin.js +35 -0
  44. package/dist/presets/configs/minigame/service/serviceChunkPlugin.d.ts +9 -0
  45. package/dist/presets/configs/minigame/service/serviceChunkPlugin.js +69 -0
  46. package/dist/presets/configs/minigame/service/serviceEntryPlugin.d.ts +10 -0
  47. package/dist/presets/configs/minigame/service/serviceEntryPlugin.js +32 -0
  48. package/dist/presets/configs/miniprogram/assets/assetsEntryPlugin.d.ts +12 -0
  49. package/dist/presets/configs/miniprogram/assets/assetsEntryPlugin.js +132 -0
  50. package/dist/presets/configs/miniprogram/assets/index.d.ts +4 -0
  51. package/dist/presets/configs/miniprogram/assets/index.js +47 -0
  52. package/dist/presets/configs/miniprogram/render/component.d.ts +3 -0
  53. package/dist/presets/configs/miniprogram/render/component.js +47 -0
  54. package/dist/presets/configs/miniprogram/render/index.d.ts +5 -0
  55. package/dist/presets/configs/miniprogram/render/index.js +71 -0
  56. package/dist/presets/configs/miniprogram/render/render.d.ts +3 -0
  57. package/dist/presets/configs/miniprogram/render/render.js +49 -0
  58. package/dist/presets/configs/miniprogram/render/renderChunkPlugin.d.ts +8 -0
  59. package/dist/presets/configs/miniprogram/render/renderChunkPlugin.js +55 -0
  60. package/dist/presets/configs/miniprogram/render/sjsEntryPlugin.d.ts +15 -0
  61. package/dist/presets/configs/miniprogram/render/sjsEntryPlugin.js +163 -0
  62. package/dist/presets/configs/miniprogram/service/index.d.ts +5 -0
  63. package/dist/presets/configs/miniprogram/service/index.js +72 -0
  64. package/dist/presets/configs/miniprogram/service/resolveLimitPlugin.d.ts +8 -0
  65. package/dist/presets/configs/miniprogram/service/resolveLimitPlugin.js +66 -0
  66. package/dist/presets/configs/miniprogram/service/serviceChunkPlugin.d.ts +9 -0
  67. package/dist/presets/configs/miniprogram/service/serviceChunkPlugin.js +65 -0
  68. package/dist/presets/index.d.ts +2 -0
  69. package/dist/presets/index.js +95 -0
  70. package/dist/presets/loaders/mg-entry-loader.d.ts +1 -0
  71. package/dist/presets/loaders/mg-entry-loader.js +27 -0
  72. package/dist/presets/loaders/mini-style-loader.d.ts +1 -0
  73. package/dist/presets/loaders/mini-style-loader.js +72 -0
  74. package/dist/presets/loaders/mp-entry-loader.d.ts +1 -0
  75. package/dist/presets/loaders/mp-entry-loader.js +196 -0
  76. package/dist/presets/loaders/sjs-loader/index.d.ts +12 -0
  77. package/dist/presets/loaders/sjs-loader/index.js +605 -0
  78. package/dist/presets/loaders/sjs-loader/scope.d.ts +36 -0
  79. package/dist/presets/loaders/sjs-loader/scope.js +122 -0
  80. package/dist/presets/loaders/sjs-loader/tranform.d.ts +2 -0
  81. package/dist/presets/loaders/sjs-loader/tranform.js +31 -0
  82. package/dist/presets/loaders/wxss-loader.d.ts +1 -0
  83. package/dist/presets/loaders/wxss-loader.js +77 -0
  84. package/dist/presets/plugins/InjectorPlugin.d.ts +7 -0
  85. package/dist/presets/plugins/InjectorPlugin.js +14 -0
  86. package/dist/presets/prod.d.ts +4 -0
  87. package/dist/presets/prod.js +80 -0
  88. package/dist/types/index.d.ts +118 -0
  89. package/dist/types/index.js +13 -0
  90. package/dist/utils/asyncWebpack.d.ts +3 -0
  91. package/dist/utils/asyncWebpack.js +38 -0
  92. package/dist/utils/common.d.ts +8 -0
  93. package/dist/utils/common.js +36 -0
  94. package/dist/utils/const.d.ts +27 -0
  95. package/dist/utils/const.js +47 -0
  96. package/dist/utils/css.d.ts +2 -0
  97. package/dist/utils/css.js +41 -0
  98. package/dist/utils/depenedHelper.d.ts +31 -0
  99. package/dist/utils/depenedHelper.js +89 -0
  100. package/dist/utils/file.d.ts +2 -0
  101. package/dist/utils/file.js +67 -0
  102. package/dist/utils/getSuffixName.d.ts +3 -0
  103. package/dist/utils/getSuffixName.js +18 -0
  104. package/dist/utils/loader-utils.d.ts +15 -0
  105. package/dist/utils/loader-utils.js +59 -0
  106. package/dist/utils/postcssRpx2Vw.d.ts +12 -0
  107. package/dist/utils/postcssRpx2Vw.js +35 -0
  108. package/dist/utils/project.d.ts +27 -0
  109. package/dist/utils/project.js +164 -0
  110. package/dist/utils/projectConfig.d.ts +1 -0
  111. package/dist/utils/projectConfig.js +20 -0
  112. package/dist/utils/tagTransformMap.d.ts +35 -0
  113. package/dist/utils/tagTransformMap.js +38 -0
  114. package/dist/utils/utils.d.ts +7 -0
  115. package/dist/utils/utils.js +50 -0
  116. package/dist/utils/zip.d.ts +28 -0
  117. package/dist/utils/zip.js +287 -0
  118. package/package.json +6 -6
@@ -0,0 +1,605 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SJS_HELPER = void 0;
4
+ const lodash_1 = require("lodash");
5
+ const tranform_1 = require("./tranform");
6
+ const scope_1 = require("./scope");
7
+ exports.SJS_HELPER = '_sjs$';
8
+ const SETTER = `${exports.SJS_HELPER}.s`;
9
+ const GETTER = `${exports.SJS_HELPER}.g`;
10
+ const CALLER = `${exports.SJS_HELPER}.c`;
11
+ function sjsCompiler(code, onRequire) {
12
+ var _a;
13
+ const errors = [];
14
+ const offset = 1;
15
+ // scan 阶段只是对整个树的遍历,会对作用域进行收集,禁止修改语法树
16
+ // generate 阶段会生成 helper形式代码
17
+ // legacyGenerate 阶段 只生成一份修改 .constructor 访问的代码
18
+ let mode = 'scan';
19
+ // 普通变量作用域管理
20
+ const scopeManager = new scope_1.ScopeManager();
21
+ // require语句
22
+ const requireCallee = [];
23
+ // 找到对应行
24
+ function emitCompilerError(msg, span) {
25
+ if (mode !== 'scan')
26
+ return;
27
+ const message = msg.trim().split(/\s+/).length > 1 ? msg : `${msg} is disallowed`;
28
+ errors.push({ message, span: Object.assign({}, span) });
29
+ }
30
+ function handlePattern(pattern) {
31
+ switch (pattern.type) {
32
+ case "RestElement":
33
+ // function f(...a) {}
34
+ handlePattern(pattern.argument);
35
+ if (pattern.argument.type === "Identifier") {
36
+ scopeManager.pushIdentifier(pattern.argument);
37
+ }
38
+ break;
39
+ case "AssignmentPattern":
40
+ // 默认值语法 function f(a = 1) {}
41
+ handleExpression(pattern.right);
42
+ if (pattern.left.type === "Identifier") {
43
+ scopeManager.pushIdentifier(pattern.left);
44
+ }
45
+ break;
46
+ case 'Identifier':
47
+ // function f(a) {}
48
+ scopeManager.pushIdentifier(pattern);
49
+ break;
50
+ case "MemberExpression":
51
+ handleExpression(pattern);
52
+ break;
53
+ case "ArrayPattern":
54
+ emitCompilerError("Destructuring assignment like const [a, b] = array; is disallowed ", pattern.span);
55
+ break;
56
+ case "ObjectPattern":
57
+ emitCompilerError("Destructuring assignment like const {a, b} = obj; is disallowed ", pattern.span);
58
+ break;
59
+ default:
60
+ // @ts-ignore
61
+ emitCompilerError(pattern.type, pattern.span);
62
+ break;
63
+ }
64
+ }
65
+ function handleParam(p) {
66
+ var _a;
67
+ // 参数不支持装饰器
68
+ if ((_a = p === null || p === void 0 ? void 0 : p.decorators) === null || _a === void 0 ? void 0 : _a.length) {
69
+ emitCompilerError(p.type, p.span);
70
+ }
71
+ if (p.pat) {
72
+ handlePattern(p.pat);
73
+ }
74
+ }
75
+ function handleStatement(e) {
76
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
77
+ switch (e.type) {
78
+ case "BlockStatement":
79
+ scopeManager.enterScope();
80
+ (_a = e.stmts) === null || _a === void 0 ? void 0 : _a.forEach(handleStatement);
81
+ scopeManager.exitScope();
82
+ break;
83
+ case "TryStatement":
84
+ if (e.block) {
85
+ handleStatement(e.block);
86
+ }
87
+ // catch 部分是有参数的
88
+ scopeManager.enterScope();
89
+ if ((_b = e.handler) === null || _b === void 0 ? void 0 : _b.param) {
90
+ handlePattern((_c = e.handler) === null || _c === void 0 ? void 0 : _c.param);
91
+ }
92
+ if (((_e = (_d = e.handler) === null || _d === void 0 ? void 0 : _d.body) === null || _e === void 0 ? void 0 : _e.type) === "BlockStatement") {
93
+ (_g = (_f = e.handler) === null || _f === void 0 ? void 0 : _f.body) === null || _g === void 0 ? void 0 : _g.stmts.forEach(handleStatement);
94
+ }
95
+ scopeManager.exitScope();
96
+ if (e.finalizer) {
97
+ handleStatement(e.finalizer);
98
+ }
99
+ break;
100
+ case "ForStatement":
101
+ scopeManager.enterScope();
102
+ if (e.init) {
103
+ switch (e.init.type) {
104
+ case "VariableDeclaration":
105
+ handleStatement(e.init);
106
+ break;
107
+ default:
108
+ handleExpression(e.init);
109
+ break;
110
+ }
111
+ }
112
+ if (e.test) {
113
+ handleExpression(e.test);
114
+ }
115
+ if (e.update) {
116
+ handleExpression(e.update);
117
+ }
118
+ if (e.body.type === "BlockStatement") {
119
+ (_h = e.body.stmts) === null || _h === void 0 ? void 0 : _h.forEach(handleStatement);
120
+ }
121
+ else {
122
+ handleStatement(e.body);
123
+ }
124
+ scopeManager.exitScope();
125
+ break;
126
+ case "SwitchStatement":
127
+ // 处理switch条件
128
+ handleExpression(e.discriminant);
129
+ // 处理case条件
130
+ (_j = e.cases) === null || _j === void 0 ? void 0 : _j.forEach((case_) => {
131
+ var _a;
132
+ if (case_.test) {
133
+ handleExpression(case_.test);
134
+ }
135
+ (_a = case_.consequent) === null || _a === void 0 ? void 0 : _a.forEach(handleStatement);
136
+ });
137
+ break;
138
+ case "DoWhileStatement":
139
+ case "WhileStatement":
140
+ handleExpression(e.test);
141
+ handleStatement(e.body);
142
+ break;
143
+ case "IfStatement":
144
+ handleExpression(e.test);
145
+ handleStatement(e.consequent);
146
+ if (e.alternate) {
147
+ handleStatement(e.alternate);
148
+ }
149
+ break;
150
+ case "ExpressionStatement":
151
+ handleExpression(e.expression);
152
+ break;
153
+ case "FunctionDeclaration":
154
+ checkFunction(e);
155
+ scopeManager.pushIdentifier(e.identifier);
156
+ scopeManager.enterScope();
157
+ e.params.forEach(handleParam);
158
+ if (((_k = e === null || e === void 0 ? void 0 : e.body) === null || _k === void 0 ? void 0 : _k.type) === "BlockStatement") {
159
+ (_l = e.body.stmts) === null || _l === void 0 ? void 0 : _l.forEach(handleStatement);
160
+ }
161
+ scopeManager.exitScope();
162
+ break;
163
+ case "ReturnStatement":
164
+ if (e.argument) {
165
+ handleExpression(e.argument);
166
+ }
167
+ break;
168
+ case "VariableDeclaration":
169
+ for (const declaration of e.declarations) {
170
+ switch (declaration.id.type) {
171
+ case "Identifier":
172
+ scopeManager.pushIdentifier(declaration.id);
173
+ break;
174
+ default:
175
+ // @ts-ignore
176
+ emitCompilerError(declaration.id.type, declaration.id.span);
177
+ break;
178
+ }
179
+ if (declaration.init) {
180
+ handleExpression(declaration.init);
181
+ }
182
+ }
183
+ break;
184
+ case "BreakStatement":
185
+ case "DebuggerStatement":
186
+ case "ContinueStatement":
187
+ case "EmptyStatement":
188
+ break;
189
+ default:
190
+ emitCompilerError(e.type, e.span);
191
+ break;
192
+ }
193
+ }
194
+ function handleProperty(p) {
195
+ switch (p.type) {
196
+ case "Computed":
197
+ {
198
+ const expression = p.expression;
199
+ handleExpression(expression);
200
+ }
201
+ break;
202
+ case "Identifier":
203
+ break;
204
+ default:
205
+ emitCompilerError(p.type, p.span);
206
+ break;
207
+ }
208
+ }
209
+ function handleObjectPropertyName(key) {
210
+ switch (key.type) {
211
+ case "Computed":
212
+ {
213
+ const expression = key.expression;
214
+ handleExpression(expression);
215
+ }
216
+ break;
217
+ default:
218
+ break;
219
+ }
220
+ }
221
+ function handleObjectProperty(i) {
222
+ var _a, _b, _c;
223
+ switch (i.type) {
224
+ case "KeyValueProperty":
225
+ handleObjectPropertyName(i.key);
226
+ handleExpression(i.value);
227
+ break;
228
+ case "GetterProperty":
229
+ handleObjectPropertyName(i.key);
230
+ scopeManager.enterScope();
231
+ if (((_a = i.body) === null || _a === void 0 ? void 0 : _a.type) === "BlockStatement") {
232
+ i.body.stmts.forEach(handleStatement);
233
+ }
234
+ scopeManager.exitScope();
235
+ break;
236
+ case "SetterProperty":
237
+ handleObjectPropertyName(i.key);
238
+ scopeManager.enterScope();
239
+ handlePattern(i.param);
240
+ if (((_b = i.body) === null || _b === void 0 ? void 0 : _b.type) === "BlockStatement") {
241
+ i.body.stmts.forEach(handleStatement);
242
+ }
243
+ scopeManager.exitScope();
244
+ break;
245
+ case "Identifier":
246
+ scopeManager.pushAccess(i);
247
+ fixSpecialVarWhenGenerate(i);
248
+ break;
249
+ case "MethodProperty":
250
+ handleObjectPropertyName(i.key);
251
+ checkFunction(i);
252
+ scopeManager.enterScope();
253
+ i.params.forEach(handleParam);
254
+ if (((_c = i.body) === null || _c === void 0 ? void 0 : _c.type) === "BlockStatement") {
255
+ i.body.stmts.forEach(handleStatement);
256
+ }
257
+ scopeManager.exitScope();
258
+ break;
259
+ case "SpreadElement":
260
+ handleExpression(i.arguments);
261
+ break;
262
+ default:
263
+ // @ts-ignore
264
+ emitCompilerError(i.type, i.span);
265
+ break;
266
+ }
267
+ }
268
+ function modifyProperty(p) {
269
+ if (p.type === "Computed") {
270
+ handleExpression(p.expression);
271
+ return p.expression;
272
+ }
273
+ if (p.type === "Identifier") {
274
+ return {
275
+ type: 'StringLiteral',
276
+ span: p.span,
277
+ value: p.value,
278
+ raw: JSON.stringify(p.value)
279
+ };
280
+ }
281
+ if (p.type === "PrivateName") {
282
+ return { type: 'NullLiteral' };
283
+ }
284
+ }
285
+ function checkFunction(e) {
286
+ // 不允许使用 async 或者 generator 语法
287
+ if (e.async || e.generator) {
288
+ emitCompilerError(e.type, e.span);
289
+ }
290
+ }
291
+ function collectRequireWhenScan(c) {
292
+ if (mode !== 'scan') {
293
+ return;
294
+ }
295
+ requireCallee.push(c);
296
+ // 标记作用域
297
+ if (c.callee.type === 'Identifier') {
298
+ c.callee._xhsScope = scopeManager.getCurrentScope();
299
+ }
300
+ }
301
+ function fixSpecialVarWhenGenerate(id) {
302
+ var _a;
303
+ if (mode !== 'generate') {
304
+ return;
305
+ }
306
+ // 发现调用全局特殊变量
307
+ if (scope_1.SPECIFY_VAR.includes(id.value) && ((_a = id._xhsScope) === null || _a === void 0 ? void 0 : _a.checkGlobal(id.value))) {
308
+ // 生成阶段判断是否是调用全局环境
309
+ id.value = `${exports.SJS_HELPER}.${id.value}`;
310
+ }
311
+ }
312
+ function handleExpression(e) {
313
+ var _a, _b, _c, _d, _e;
314
+ switch (e.type) {
315
+ case "FunctionExpression":
316
+ checkFunction(e);
317
+ if (e.identifier) {
318
+ scopeManager.pushIdentifier(e.identifier);
319
+ }
320
+ scopeManager.enterScope();
321
+ e.params.forEach(handleParam);
322
+ if (((_a = e.body) === null || _a === void 0 ? void 0 : _a.type) === "BlockStatement") {
323
+ (_b = e.body.stmts) === null || _b === void 0 ? void 0 : _b.forEach(handleStatement);
324
+ }
325
+ scopeManager.exitScope();
326
+ break;
327
+ case "ArrowFunctionExpression":
328
+ checkFunction(e);
329
+ scopeManager.enterScope();
330
+ e.params.forEach(handlePattern);
331
+ if (e.body.type === "BlockStatement") {
332
+ (_c = e.body.stmts) === null || _c === void 0 ? void 0 : _c.forEach(handleStatement);
333
+ }
334
+ else {
335
+ handleExpression(e.body);
336
+ }
337
+ scopeManager.exitScope();
338
+ break;
339
+ case "CallExpression":
340
+ switch (e.callee.type) {
341
+ case "Import":
342
+ case "Super":
343
+ emitCompilerError(e.callee.type, e.span);
344
+ break;
345
+ default:
346
+ if (e.callee.type === "MemberExpression" && mode === 'generate') {
347
+ const oldCallee = e.callee;
348
+ const NewCallExpression = e;
349
+ NewCallExpression.type = "CallExpression";
350
+ NewCallExpression.callee = {
351
+ type: 'Identifier',
352
+ span: e.span,
353
+ value: CALLER,
354
+ optional: false
355
+ };
356
+ handleExpression(oldCallee.object);
357
+ e.arguments.forEach(i => handleExpression(i.expression));
358
+ NewCallExpression.arguments = [
359
+ { expression: modifyProperty(oldCallee.property) },
360
+ { expression: oldCallee.object },
361
+ {
362
+ expression: {
363
+ type: "ArrayExpression",
364
+ elements: e.arguments,
365
+ span: e.span
366
+ }
367
+ },
368
+ ];
369
+ }
370
+ else if (e.callee.type === "MemberExpression"
371
+ && mode === 'legacyGenerate'
372
+ && e.callee.property.type === "Identifier"
373
+ && e.callee.property.value === "constructor") {
374
+ e.callee.property.value = `${e.callee.property.value}.name`;
375
+ handleExpression(e.callee.object);
376
+ e.arguments.forEach(i => handleExpression(i.expression));
377
+ }
378
+ else {
379
+ if (e.callee.type === "Identifier") {
380
+ if (e.callee.value === "require") {
381
+ collectRequireWhenScan(e);
382
+ }
383
+ // 需要后置处理,否则callee.value会被修改
384
+ fixSpecialVarWhenGenerate(e.callee);
385
+ }
386
+ handleExpression(e.callee);
387
+ e.arguments.forEach(i => handleExpression(i.expression));
388
+ }
389
+ break;
390
+ }
391
+ break;
392
+ case "ArrayExpression":
393
+ (_d = e.elements) === null || _d === void 0 ? void 0 : _d.forEach(i => {
394
+ if (i) {
395
+ handleExpression(i.expression);
396
+ }
397
+ });
398
+ break;
399
+ case "ObjectExpression":
400
+ e.properties.forEach(handleObjectProperty);
401
+ break;
402
+ case "TemplateLiteral":
403
+ // 当中会有表达式
404
+ e.expressions.forEach(handleExpression);
405
+ break;
406
+ case "UpdateExpression":
407
+ if (e.argument.type === "MemberExpression" && mode === 'generate') {
408
+ const NewUpdateExpression = e;
409
+ NewUpdateExpression.type = "CallExpression";
410
+ NewUpdateExpression.callee = {
411
+ type: 'Identifier',
412
+ span: e.span,
413
+ value: SETTER,
414
+ optional: false
415
+ };
416
+ handleExpression(e.argument.object);
417
+ NewUpdateExpression.arguments = [
418
+ { expression: modifyProperty(e.argument.property) },
419
+ { expression: e.argument.object },
420
+ {
421
+ expression: {
422
+ type: 'StringLiteral',
423
+ span: e.span,
424
+ value: e.operator,
425
+ raw: JSON.stringify(e.operator)
426
+ }
427
+ },
428
+ ];
429
+ Reflect.deleteProperty(e, 'prefix');
430
+ Reflect.deleteProperty(e, 'operator');
431
+ Reflect.deleteProperty(e, 'argument');
432
+ }
433
+ else {
434
+ handleExpression(e.argument);
435
+ }
436
+ break;
437
+ case "UnaryExpression":
438
+ handleExpression(e.argument);
439
+ break;
440
+ case "AssignmentExpression":
441
+ if (e.left.type === 'MemberExpression' && mode === 'generate') {
442
+ const NewAssignmentExpression = e;
443
+ NewAssignmentExpression.type = "CallExpression";
444
+ NewAssignmentExpression.callee = {
445
+ type: 'Identifier',
446
+ span: e.span,
447
+ value: SETTER,
448
+ optional: false
449
+ };
450
+ handleExpression(e.right);
451
+ handleExpression(e.left.object);
452
+ NewAssignmentExpression.arguments = [
453
+ { expression: modifyProperty(e.left.property) },
454
+ { expression: e.left.object },
455
+ {
456
+ expression: {
457
+ type: 'StringLiteral',
458
+ span: e.span,
459
+ value: e.operator,
460
+ raw: JSON.stringify(e.operator)
461
+ }
462
+ },
463
+ { expression: e.right }
464
+ ];
465
+ Reflect.deleteProperty(e, 'left');
466
+ Reflect.deleteProperty(e, 'right');
467
+ Reflect.deleteProperty(e, 'operator');
468
+ }
469
+ else {
470
+ handlePattern(e.left);
471
+ handleExpression(e.right);
472
+ }
473
+ break;
474
+ case "BinaryExpression":
475
+ handleExpression(e.left);
476
+ handleExpression(e.right);
477
+ break;
478
+ case "ConditionalExpression":
479
+ handleExpression(e.test);
480
+ handleExpression(e.consequent);
481
+ handleExpression(e.alternate);
482
+ break;
483
+ case "MemberExpression":
484
+ if (mode === 'generate') {
485
+ const NewMemberExpression = e;
486
+ NewMemberExpression.type = "CallExpression";
487
+ NewMemberExpression.callee = {
488
+ type: 'Identifier',
489
+ span: e.span,
490
+ value: GETTER,
491
+ optional: false
492
+ };
493
+ handleExpression(e.object);
494
+ NewMemberExpression.arguments = [
495
+ { expression: modifyProperty(e.property) },
496
+ { expression: e.object }
497
+ ];
498
+ // 清除语法树
499
+ Reflect.deleteProperty(e, 'object');
500
+ Reflect.deleteProperty(e, 'property');
501
+ }
502
+ else if (mode === 'legacyGenerate' && e.property.type === "Identifier" && e.property.value === "constructor") {
503
+ e.property.value = `${e.property.value}.name`;
504
+ handleExpression(e.object);
505
+ }
506
+ else {
507
+ // 只遍历
508
+ handleExpression(e.object);
509
+ handleProperty(e.property);
510
+ }
511
+ break;
512
+ case "ParenthesisExpression":
513
+ handleExpression(e.expression);
514
+ break;
515
+ case "SequenceExpression":
516
+ (_e = e.expressions) === null || _e === void 0 ? void 0 : _e.forEach(handleExpression);
517
+ break;
518
+ case "Identifier":
519
+ scopeManager.pushAccess(e);
520
+ fixSpecialVarWhenGenerate(e);
521
+ break;
522
+ // 以下都是字面量无需处理
523
+ case "BigIntLiteral":
524
+ case "NullLiteral":
525
+ case "StringLiteral":
526
+ case "BooleanLiteral":
527
+ case "NumericLiteral":
528
+ case "ThisExpression":
529
+ case "RegExpLiteral":
530
+ break;
531
+ default:
532
+ // @ts-ignore
533
+ emitCompilerError(e.type, e.span);
534
+ break;
535
+ }
536
+ }
537
+ function getSourceCode(span) {
538
+ return code.slice(span.start - offset, span.end - offset);
539
+ }
540
+ let legacyModule;
541
+ const result = (0, tranform_1.transform)(code, (module) => {
542
+ // 1. 校验基本语法错误,收集变量作用域,构建作用域表
543
+ mode = "scan";
544
+ scopeManager.enterScope();
545
+ module.body.forEach(handleStatement);
546
+ scopeManager.exitScope();
547
+ scopeManager.stop();
548
+ // 2. 分析作用域表 找出不是sjs 标准的模块进行屏蔽
549
+ // 2.2 从最小作用域向上分析
550
+ const validResult = scopeManager.getDFSScope().map(i => i.anlysis()).filter(Boolean);
551
+ validResult.forEach(i => {
552
+ if (i) {
553
+ emitCompilerError(`identifier(${i.variable}) is undefined`, i.span);
554
+ }
555
+ });
556
+ // 2.1 require语句校验以及处理path
557
+ requireCallee.forEach(i => {
558
+ var _a, _b, _c;
559
+ // 调用全局环境 require
560
+ if (i.callee.type === "Identifier" && ((_a = i.callee._xhsScope) === null || _a === void 0 ? void 0 : _a.checkGlobal(i.callee.value))) {
561
+ const requirePath = (_c = (_b = i.arguments) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.expression;
562
+ if (requirePath && (requirePath === null || requirePath === void 0 ? void 0 : requirePath.type) === 'StringLiteral' && (requirePath === null || requirePath === void 0 ? void 0 : requirePath.value)) {
563
+ try {
564
+ const formatPath = onRequire === null || onRequire === void 0 ? void 0 : onRequire(requirePath === null || requirePath === void 0 ? void 0 : requirePath.value);
565
+ requirePath.value = formatPath;
566
+ requirePath.raw = JSON.stringify(formatPath);
567
+ }
568
+ catch (error) {
569
+ // 校验path 地址是否正确不正确进行报错
570
+ emitCompilerError(error.message, i.span);
571
+ }
572
+ }
573
+ else {
574
+ emitCompilerError('require() must provide static path, dynamic or empty path is disallowed', i.span);
575
+ }
576
+ }
577
+ });
578
+ // 3. 抛出前面检查出来的错误
579
+ if (errors.length) {
580
+ module.body = [];
581
+ return module;
582
+ }
583
+ // 上面的没出错,拷贝一份语法树用于生成兼容代码
584
+ legacyModule = (0, lodash_1.cloneDeep)(module);
585
+ // 4. 修改语法树生成 set get call 语法
586
+ mode = "generate";
587
+ module.body.forEach(handleStatement);
588
+ return module;
589
+ });
590
+ mode = 'legacyGenerate';
591
+ // 生成老版本的兼容代码
592
+ const legacyCode = ((_a = legacyModule === null || legacyModule === void 0 ? void 0 : legacyModule.body) === null || _a === void 0 ? void 0 : _a.length)
593
+ ? (0, tranform_1.transform)('var magic;', () => {
594
+ legacyModule.body.forEach(handleStatement);
595
+ return legacyModule;
596
+ }, 'es2015', true).code
597
+ : '';
598
+ return {
599
+ code: result.code,
600
+ map: result.map,
601
+ legacyCode,
602
+ errors,
603
+ };
604
+ }
605
+ exports.default = sjsCompiler;
@@ -0,0 +1,36 @@
1
+ import type { Span, Identifier } from '@swc/core';
2
+ export declare const SPECIFY_VAR: string[];
3
+ declare module "@swc/core" {
4
+ interface Identifier {
5
+ _xhsScope?: Scope;
6
+ }
7
+ }
8
+ export declare class Scope {
9
+ private parentScope;
10
+ private defines;
11
+ private access;
12
+ toString(): string;
13
+ /**
14
+ * @returns
15
+ */
16
+ anlysis(): {
17
+ variable: string;
18
+ span: Span;
19
+ } | undefined;
20
+ checkGlobal(key: string): boolean;
21
+ setAccess(key: string, value: Span): void;
22
+ setDefines(key: string, value: Span): void;
23
+ setParentScope(scope: Scope | undefined): void;
24
+ }
25
+ export declare class ScopeManager {
26
+ private _scopeStack;
27
+ private _scopeTables;
28
+ private _stop;
29
+ stop(): void;
30
+ enterScope(): void;
31
+ exitScope(): void;
32
+ getCurrentScope(): Scope | undefined;
33
+ pushIdentifier(id: Identifier): void;
34
+ pushAccess(id: Identifier): void;
35
+ getDFSScope(): Scope[];
36
+ }