xhs-mp-compiler-cli 1.0.1 → 1.0.2-beta.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 (110) hide show
  1. package/package.json +2 -2
  2. package/dist/bin/xhs-mp-cli-build.d.ts +0 -2
  3. package/dist/bin/xhs-mp-cli-build.js +0 -40
  4. package/dist/bin/xhs-mp-cli-dev.d.ts +0 -2
  5. package/dist/bin/xhs-mp-cli-dev.js +0 -81
  6. package/dist/bin/xhs-mp-cli.d.ts +0 -2
  7. package/dist/bin/xhs-mp-cli.js +0 -16
  8. package/dist/build/index.d.ts +0 -3
  9. package/dist/build/index.js +0 -22
  10. package/dist/dev-server/index.d.ts +0 -3
  11. package/dist/dev-server/index.js +0 -62
  12. package/dist/dev-server/lib/ensurePort.d.ts +0 -2
  13. package/dist/dev-server/lib/ensurePort.js +0 -32
  14. package/dist/dev-server/lib/openBrowser.d.ts +0 -2
  15. package/dist/dev-server/lib/openBrowser.js +0 -23
  16. package/dist/dev-server/lib/openChrome.applescript +0 -78
  17. package/dist/globalData/SjsModule.d.ts +0 -32
  18. package/dist/globalData/SjsModule.js +0 -34
  19. package/dist/index.d.ts +0 -11
  20. package/dist/index.js +0 -114
  21. package/dist/types/index.d.ts +0 -106
  22. package/dist/types/index.js +0 -13
  23. package/dist/utils/asyncWebpack.d.ts +0 -3
  24. package/dist/utils/asyncWebpack.js +0 -38
  25. package/dist/utils/combineExtJson.d.ts +0 -3
  26. package/dist/utils/combineExtJson.js +0 -74
  27. package/dist/utils/common.d.ts +0 -7
  28. package/dist/utils/common.js +0 -35
  29. package/dist/utils/depenedHelper.d.ts +0 -31
  30. package/dist/utils/depenedHelper.js +0 -89
  31. package/dist/utils/getCssSuffixName.d.ts +0 -1
  32. package/dist/utils/getCssSuffixName.js +0 -9
  33. package/dist/utils/getMlSuffixName.d.ts +0 -1
  34. package/dist/utils/getMlSuffixName.js +0 -6
  35. package/dist/utils/getPrefixName.d.ts +0 -1
  36. package/dist/utils/getPrefixName.js +0 -6
  37. package/dist/utils/projectConfig.d.ts +0 -1
  38. package/dist/utils/projectConfig.js +0 -20
  39. package/dist/utils/transformAppJson.d.ts +0 -16
  40. package/dist/utils/transformAppJson.js +0 -199
  41. package/dist/utils/validateAppJson.d.ts +0 -4
  42. package/dist/utils/validateAppJson.js +0 -111
  43. package/dist/webpack-config/index.d.ts +0 -4
  44. package/dist/webpack-config/index.js +0 -41
  45. package/dist/webpack-config/lib/const.d.ts +0 -13
  46. package/dist/webpack-config/lib/const.js +0 -15
  47. package/dist/webpack-config/lib/css.d.ts +0 -2
  48. package/dist/webpack-config/lib/css.js +0 -41
  49. package/dist/webpack-config/lib/postcssRpx2Vw.d.ts +0 -12
  50. package/dist/webpack-config/lib/postcssRpx2Vw.js +0 -35
  51. package/dist/webpack-config/lib/tagTransformMap.d.ts +0 -35
  52. package/dist/webpack-config/lib/tagTransformMap.js +0 -38
  53. package/dist/webpack-config/lib/utils.d.ts +0 -5
  54. package/dist/webpack-config/lib/utils.js +0 -37
  55. package/dist/webpack-config/loaders/component-entry-loader.d.ts +0 -1
  56. package/dist/webpack-config/loaders/component-entry-loader.js +0 -31
  57. package/dist/webpack-config/loaders/component-entry-requirements-loader.d.ts +0 -1
  58. package/dist/webpack-config/loaders/component-entry-requirements-loader.js +0 -24
  59. package/dist/webpack-config/loaders/mini-style-loader.d.ts +0 -1
  60. package/dist/webpack-config/loaders/mini-style-loader.js +0 -69
  61. package/dist/webpack-config/loaders/render-entry-loader.d.ts +0 -1
  62. package/dist/webpack-config/loaders/render-entry-loader.js +0 -50
  63. package/dist/webpack-config/loaders/service-entry-loader.d.ts +0 -1
  64. package/dist/webpack-config/loaders/service-entry-loader.js +0 -51
  65. package/dist/webpack-config/loaders/sjs-loader/index.d.ts +0 -12
  66. package/dist/webpack-config/loaders/sjs-loader/index.js +0 -609
  67. package/dist/webpack-config/loaders/sjs-loader/scope.d.ts +0 -36
  68. package/dist/webpack-config/loaders/sjs-loader/scope.js +0 -122
  69. package/dist/webpack-config/loaders/sjs-loader/tranform.d.ts +0 -2
  70. package/dist/webpack-config/loaders/sjs-loader/tranform.js +0 -31
  71. package/dist/webpack-config/loaders/utils.d.ts +0 -13
  72. package/dist/webpack-config/loaders/utils.js +0 -41
  73. package/dist/webpack-config/loaders/wxss-loader.d.ts +0 -1
  74. package/dist/webpack-config/loaders/wxss-loader.js +0 -76
  75. package/dist/webpack-config/plugins/VueLoaderPlugin.d.ts +0 -19
  76. package/dist/webpack-config/plugins/VueLoaderPlugin.js +0 -205
  77. package/dist/webpack-config/plugins/XhsMpErrorTransformPlugin.d.ts +0 -8
  78. package/dist/webpack-config/plugins/XhsMpErrorTransformPlugin.js +0 -40
  79. package/dist/webpack-config/plugins/XhsMpJsonPlugin.d.ts +0 -36
  80. package/dist/webpack-config/plugins/XhsMpJsonPlugin.js +0 -71
  81. package/dist/webpack-config/presets/babel.d.ts +0 -8
  82. package/dist/webpack-config/presets/babel.js +0 -57
  83. package/dist/webpack-config/presets/common.d.ts +0 -4
  84. package/dist/webpack-config/presets/common.js +0 -40
  85. package/dist/webpack-config/presets/mp/MpEntryPlugin.d.ts +0 -23
  86. package/dist/webpack-config/presets/mp/MpEntryPlugin.js +0 -87
  87. package/dist/webpack-config/presets/mp/index.d.ts +0 -4
  88. package/dist/webpack-config/presets/mp/index.js +0 -48
  89. package/dist/webpack-config/presets/prod.d.ts +0 -4
  90. package/dist/webpack-config/presets/prod.js +0 -83
  91. package/dist/webpack-config/presets/render/ComponentEntryPlugin.d.ts +0 -18
  92. package/dist/webpack-config/presets/render/ComponentEntryPlugin.js +0 -77
  93. package/dist/webpack-config/presets/render/RenderChunkPlugin.d.ts +0 -5
  94. package/dist/webpack-config/presets/render/RenderChunkPlugin.js +0 -50
  95. package/dist/webpack-config/presets/render/RenderEntryPlugin.d.ts +0 -14
  96. package/dist/webpack-config/presets/render/RenderEntryPlugin.js +0 -42
  97. package/dist/webpack-config/presets/render/SjsEntryPlugin.d.ts +0 -31
  98. package/dist/webpack-config/presets/render/SjsEntryPlugin.js +0 -160
  99. package/dist/webpack-config/presets/render/index.d.ts +0 -4
  100. package/dist/webpack-config/presets/render/index.js +0 -62
  101. package/dist/webpack-config/presets/service/ServiceEntryPlugin.d.ts +0 -8
  102. package/dist/webpack-config/presets/service/ServiceEntryPlugin.js +0 -36
  103. package/dist/webpack-config/presets/service/XhsMpServiceChunkPlugin.d.ts +0 -6
  104. package/dist/webpack-config/presets/service/XhsMpServiceChunkPlugin.js +0 -46
  105. package/dist/webpack-config/presets/service/XhsResolveLimitPlugin.d.ts +0 -8
  106. package/dist/webpack-config/presets/service/XhsResolveLimitPlugin.js +0 -65
  107. package/dist/webpack-config/presets/service/XhsV2AssetsPlugin.d.ts +0 -5
  108. package/dist/webpack-config/presets/service/XhsV2AssetsPlugin.js +0 -27
  109. package/dist/webpack-config/presets/service/index.d.ts +0 -4
  110. package/dist/webpack-config/presets/service/index.js +0 -39
@@ -1,609 +0,0 @@
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')
@@ -1,36 +0,0 @@
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
- }