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