@aiot-toolkit/parser 2.0.5-beta.8 → 2.0.5-widget-provider-beta.1

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 (107) hide show
  1. package/README.md +11 -11
  2. package/lib/index.d.ts +1 -4
  3. package/lib/index.js +0 -27
  4. package/lib/utils/ParserUtil.js +15 -15
  5. package/lib/ux/config/ExtensionConfig.js +2 -2
  6. package/lib/ux/config/FeatureConfig.js +19 -19
  7. package/lib/ux/config/vela/StyleAttributeConfig.js +87 -87
  8. package/lib/ux/enum/StyleSelectorType.js +6 -6
  9. package/lib/ux/enum/TemplateNodeType.js +2 -2
  10. package/lib/ux/enum/android/StyleSelectorName.js +2 -2
  11. package/lib/ux/parser/ScriptParser.js +2 -2
  12. package/lib/ux/parser/StyleParser.js +62 -62
  13. package/lib/ux/parser/TemplateValueParser.js +49 -49
  14. package/lib/ux/parser/UxParser.js +11 -11
  15. package/lib/ux/translate/android/StyleToTypescript.js +51 -51
  16. package/lib/ux/translate/android/TemplateToTypescript.js +51 -51
  17. package/lib/ux/translate/android/UxToTypescript.js +14 -14
  18. package/lib/ux/translate/android/attributeTranslate/ForTranslate.js +17 -17
  19. package/lib/ux/translate/android/attributeTranslate/IfTranslate.js +9 -9
  20. package/lib/ux/translate/vela/ScriptToTypescript.js +13 -12
  21. package/lib/ux/translate/vela/StyleToTypescript.js +10 -10
  22. package/lib/ux/translate/vela/TemplateToTypescript.js +74 -74
  23. package/lib/ux/translate/vela/TranslateCache.js +2 -2
  24. package/lib/ux/translate/vela/UxToTypescript.js +6 -6
  25. package/lib/ux/translate/vela/VelaContext.js +2 -2
  26. package/lib/ux/translate/vela/plugins/e2e.js +61 -61
  27. package/lib/ux/translate/vela/protobuf/BinaryPlugin.js +172 -172
  28. package/lib/ux/translate/vela/protobuf/protobuf.js +235 -235
  29. package/lib/ux/translate/vela/protobuf/protobufControl.js +159 -159
  30. package/lib/ux/translate/vela/protobuf/vdom_pb.js +2374 -2374
  31. package/lib/ux/translate/vela/runtime/velaTestLibrary.js +104 -104
  32. package/lib/ux/translate/vela/utils/AttributeConfig.js +15 -15
  33. package/lib/ux/translate/vela/utils/ExtendedBoxStyle.js +38 -38
  34. package/lib/ux/translate/vela/utils/SourceMapUtil.js +30 -30
  35. package/lib/ux/translate/vela/utils/TemplateUtil.d.ts +10 -8
  36. package/lib/ux/translate/vela/utils/TemplateUtil.js +206 -191
  37. package/lib/ux/translate/vela/wrap/CbTranslate.js +8 -8
  38. package/lib/ux/translate/vela/wrap/CfTranslate.js +14 -14
  39. package/lib/ux/translate/vela/wrap/CiTranslate.js +11 -11
  40. package/lib/ux/utils/BabelUtil.js +35 -35
  41. package/lib/ux/utils/ElementConfigUtil.js +24 -24
  42. package/lib/ux/utils/StyleMapUtil.js +26 -16
  43. package/lib/ux/utils/StyleUtil.js +176 -174
  44. package/lib/ux/utils/UxUtil.js +32 -32
  45. package/lib/ux/validate/ElementValidate.js +2 -2
  46. package/lib/ux/validate/UxFileValidate.js +2 -2
  47. package/package.json +6 -6
  48. package/lib/xts/XtsParser.d.ts +0 -20
  49. package/lib/xts/XtsParser.js +0 -86
  50. package/lib/xts/XtsToTypescript.d.ts +0 -69
  51. package/lib/xts/XtsToTypescript.js +0 -894
  52. package/lib/xts/config/CommonAttributeList.d.ts +0 -6
  53. package/lib/xts/config/CommonAttributeList.js +0 -17
  54. package/lib/xts/config/classCount.json +0 -38
  55. package/lib/xts/config/commonAttribute.json +0 -84
  56. package/lib/xts/config/componentList.d.ts +0 -56
  57. package/lib/xts/config/componentList.js +0 -9
  58. package/lib/xts/config/predefinedComponent.json +0 -91
  59. package/lib/xts/config/render.json +0 -31
  60. package/lib/xts/data/ElementType.d.ts +0 -6
  61. package/lib/xts/data/ElementType.js +0 -5
  62. package/lib/xts/data/element/CommentElement.d.ts +0 -16
  63. package/lib/xts/data/element/CommentElement.js +0 -26
  64. package/lib/xts/data/element/ElementBase.d.ts +0 -14
  65. package/lib/xts/data/element/ElementBase.js +0 -20
  66. package/lib/xts/data/element/ForElement.d.ts +0 -58
  67. package/lib/xts/data/element/ForElement.js +0 -81
  68. package/lib/xts/data/element/IfElement.d.ts +0 -55
  69. package/lib/xts/data/element/IfElement.js +0 -87
  70. package/lib/xts/data/element/NodeElement.d.ts +0 -39
  71. package/lib/xts/data/element/NodeElement.js +0 -86
  72. package/lib/xts/enum/AttributeType.d.ts +0 -31
  73. package/lib/xts/enum/AttributeType.js +0 -53
  74. package/lib/xts/enum/Framework.d.ts +0 -98
  75. package/lib/xts/enum/Framework.js +0 -107
  76. package/lib/xts/interface/IContext.d.ts +0 -11
  77. package/lib/xts/interface/IContext.js +0 -1
  78. package/lib/xts/interface/IElement.d.ts +0 -17
  79. package/lib/xts/interface/IElement.js +0 -5
  80. package/lib/xts/interface/IExpressNode.d.ts +0 -20
  81. package/lib/xts/interface/IExpressNode.js +0 -1
  82. package/lib/xts/interface/config/ICommon.d.ts +0 -23
  83. package/lib/xts/interface/config/ICommon.js +0 -5
  84. package/lib/xts/interface/config/IRenderNode.d.ts +0 -25
  85. package/lib/xts/interface/config/IRenderNode.js +0 -1
  86. package/lib/xts/interface/validate/IAttibuteValidate.d.ts +0 -8
  87. package/lib/xts/interface/validate/IAttibuteValidate.js +0 -1
  88. package/lib/xts/interface/validate/IComponentValidate.d.ts +0 -9
  89. package/lib/xts/interface/validate/IComponentValidate.js +0 -1
  90. package/lib/xts/interface/validate/IRenderValidate.d.ts +0 -10
  91. package/lib/xts/interface/validate/IRenderValidate.js +0 -1
  92. package/lib/xts/interface/validate/ISourceFileValidate.d.ts +0 -7
  93. package/lib/xts/interface/validate/ISourceFileValidate.js +0 -1
  94. package/lib/xts/utils/AttributeUtil.d.ts +0 -73
  95. package/lib/xts/utils/AttributeUtil.js +0 -206
  96. package/lib/xts/utils/TypeUtil.d.ts +0 -60
  97. package/lib/xts/utils/TypeUtil.js +0 -97
  98. package/lib/xts/utils/TypescriptUtil.d.ts +0 -42
  99. package/lib/xts/utils/TypescriptUtil.js +0 -128
  100. package/lib/xts/validate/AttibuteValidate.d.ts +0 -18
  101. package/lib/xts/validate/AttibuteValidate.js +0 -97
  102. package/lib/xts/validate/ComponentValidate.d.ts +0 -19
  103. package/lib/xts/validate/ComponentValidate.js +0 -90
  104. package/lib/xts/validate/RenderValidate.d.ts +0 -63
  105. package/lib/xts/validate/RenderValidate.js +0 -239
  106. package/lib/xts/validate/SourceFileValidate.d.ts +0 -10
  107. package/lib/xts/validate/SourceFileValidate.js +0 -43
@@ -1,894 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- var _path = _interopRequireDefault(require("path"));
8
- var _tsMorph = require("ts-morph");
9
- var _sharedUtils = require("@aiot-toolkit/shared-utils");
10
- var _CommentElement = _interopRequireDefault(require("./data/element/CommentElement"));
11
- var _ForElement = _interopRequireDefault(require("./data/element/ForElement"));
12
- var _IfElement = _interopRequireDefault(require("./data/element/IfElement"));
13
- var _NodeElement = _interopRequireDefault(require("./data/element/NodeElement"));
14
- var _AttributeType = _interopRequireDefault(require("./enum/AttributeType"));
15
- var _Framework = require("./enum/Framework");
16
- var _AttributeUtil = _interopRequireDefault(require("./utils/AttributeUtil"));
17
- var _TypeUtil = _interopRequireDefault(require("./utils/TypeUtil"));
18
- var _TypescriptUtil = _interopRequireDefault(require("./utils/TypescriptUtil"));
19
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
20
- /**
21
- * xts 树转换为 ts 树
22
- *
23
- * 过程为
24
- * 1. 创建 ts 树
25
- * 1. 遍历 xts 树
26
- * 2. 遇到预期的节点时,在ts 树中创建对应的节点
27
- */
28
-
29
- class XtsToTypescript {
30
- mapList = [];
31
- elementIndex = 0;
32
- _offsetList = [];
33
- tsFrameWorkImports = (() => new Set())();
34
- constructor(project, onLog, projectContext, filePath) {
35
- this.project = project;
36
- this.onLog = onLog;
37
- this.projectContext = projectContext;
38
- this.filePath = filePath;
39
- this.onLog = _sharedUtils.WrapCallback.wrapOnLog(onLog);
40
- }
41
- get context() {
42
- return {
43
- sourceFile: this._sourceFile,
44
- onLog: this.onLog,
45
- offsetList: this._offsetList
46
- };
47
- }
48
- translate(xtsTree, offsetList) {
49
- const oldFile = this.project.getSourceFile('temp.ts');
50
- if (oldFile) {
51
- this.project.removeSourceFile(oldFile);
52
- }
53
- const result = this.project.createSourceFile('temp.ts');
54
- this.mapList = [];
55
- this._offsetList = offsetList;
56
- this._sourceFile = xtsTree;
57
- this._newFile = result;
58
-
59
- // 循环 xtsTree,一一对应生成目标节点
60
- xtsTree.forEachChild(node => {
61
- switch (node.getKind()) {
62
- case _tsMorph.SyntaxKind.ClassDeclaration:
63
- this.translateClassNode(node, result);
64
- break;
65
- case _tsMorph.SyntaxKind.ImportDeclaration:
66
- this.translateFeatureImport(node, result);
67
- break;
68
- // 不在需要生成静态代理 参考 https://jira.n.xiaomi.com/browse/VELAPLATFO-21439
69
- // case SyntaxKind.InterfaceDeclaration:
70
- // this.translateInterfaceNode(node as InterfaceDeclaration, result)
71
- // break
72
- default:
73
- const nodeContent = node.getText();
74
- result.addStatements([nodeContent]);
75
- break;
76
- }
77
- });
78
-
79
- // 找到所有 tsframework 的类型,如果没有导入的话,将其加入导入列表
80
- xtsTree.transform(traversal => {
81
- const node = traversal.visitChildren();
82
- if (node.kind === _tsMorph.SyntaxKind.TypeReference) {
83
- if (Object.values(_Framework.tsFrameWorkExports).includes(node.getText())) {
84
- this.tsFrameWorkImports.add(node.getText());
85
- }
86
- }
87
- return node;
88
- });
89
- result.addImportDeclaration({
90
- moduleSpecifier: _AttributeUtil.default.getFrameworkImportFrom(this.filePath, this.projectContext.projectPath),
91
- namedImports: [...this.tsFrameWorkImports]
92
- });
93
- result.addStatements([`//# sourceMappingURL=index.ts.map`]);
94
- return {
95
- ast: result,
96
- mapList: this.mapList.concat()
97
- };
98
- }
99
- translateFeatureImport(node, result) {
100
- const list = [{
101
- name: '@mios.router',
102
- type: 'MiosRouter'
103
- }, {
104
- name: '@mios.storage',
105
- type: 'MiosStorage'
106
- }];
107
- const moduleSpecifier = node.getModuleSpecifier();
108
- const index = list.findIndex(t => moduleSpecifier.getText().includes(t.name));
109
- if (index > -1) {
110
- const newNode = result.addStatements(`const ${node.getImportClause()?.getText()} = requireFeature(${moduleSpecifier.getText()}) as ${list[index].type}`);
111
- this.tsFrameWorkImports.add('requireFeature');
112
- this.tsFrameWorkImports.add(list[index].type);
113
- // TODO: 细化map
114
- this.addMapData(node, newNode[0]);
115
- } else {
116
- const nodeContent = node.getText();
117
- result.addStatements([nodeContent]);
118
- }
119
- }
120
- addMapData(sourceNode, newNode) {
121
- if (!sourceNode || !newNode) {
122
- return;
123
- }
124
- this.mapList.push(new _sharedUtils.MapData(sourceNode.getText(), _TypescriptUtil.default.getNodePostion(sourceNode, this.context.sourceFile, this.context.offsetList), _TypescriptUtil.default.getNodePostion(newNode, this._newFile)));
125
- }
126
- getParentClassName(classNode) {
127
- // 根据修饰符判定父类
128
- // 如果有 parentClass 修饰符,则取出值,并以值为父类
129
- // 有1个特例是:如果是 Component 且有@main 修饰符,则父类是Page
130
- let result;
131
- const parentDecorator = classNode.getDecorator('parentClass');
132
- if (parentDecorator) {
133
- const arg = parentDecorator.getArguments()[0];
134
- const argText = arg?.getText();
135
- if (argText === _Framework.tsFrameWork.exports.Component && classNode.getDecorator('Main')) {
136
- result = _Framework.tsFrameWork.exports.Page;
137
- this.tsFrameWorkImports.add(_Framework.tsFrameWork.exports.Page);
138
- } else {
139
- // APP or ViewAspect or Component
140
- result = argText;
141
- this.tsFrameWorkImports.add(result);
142
- }
143
- }
144
- return result;
145
- }
146
- isPageOrComponent(t) {
147
- return t === _Framework.tsFrameWorkExports.Page || t === _Framework.tsFrameWorkExports.Component;
148
- }
149
- translateClassNode(sourceNode, targetFile) {
150
- const isNormalClassNode = _TypeUtil.default.isNormalClass(sourceNode);
151
- if (isNormalClassNode) {
152
- this.translateNormalClassNode(sourceNode, targetFile);
153
- return;
154
- }
155
- // 存储Property Node
156
- let propertyNode = [];
157
-
158
- // class 的类型
159
- const xtsClassType = this.getParentClassName(sourceNode);
160
-
161
- // 添加类和 interface,再遍历 sourceNode,添加成员
162
- // Page 和 Component 提取响应式数据的 interface
163
- let interefaNode;
164
- if (this.isPageOrComponent(xtsClassType)) {
165
- interefaNode = targetFile.addInterface({
166
- name: _Framework.HomeState.interface,
167
- isExported: true,
168
- extends: [_Framework.tsFrameWork.exports.IComponentState]
169
- });
170
- this.tsFrameWorkImports.add(_Framework.tsFrameWork.exports.IComponentState);
171
- }
172
- const xtsImplements = [];
173
- if (this.isPageOrComponent(xtsClassType)) xtsImplements.push(_Framework.HomeState.interface);
174
- const classNode = targetFile.addClass({
175
- name: sourceNode.getName(),
176
- isDefaultExport: true,
177
- extends: xtsClassType,
178
- implements: xtsImplements
179
- });
180
- this.addMapData(sourceNode.getNameNode(), classNode.getNameNode());
181
-
182
- // 添加构造函数
183
- const parameters = [];
184
- if (this.isPageOrComponent(xtsClassType)) {
185
- parameters.push({
186
- name: 'params',
187
- type: _Framework.HomeState.interface,
188
- hasQuestionToken: true
189
- });
190
- }
191
- const classConstructor = classNode.addConstructor({
192
- parameters,
193
- statements: [`super()`]
194
- });
195
- sourceNode.forEachChild(node => {
196
- switch (node.getKind()) {
197
- // 修饰符
198
- case _tsMorph.SyntaxKind.Decorator:
199
- break;
200
- // 函数
201
- case _tsMorph.SyntaxKind.MethodDeclaration:
202
- this.translateMemberMethod(node, classNode);
203
- break;
204
- // 成员属性
205
- case _tsMorph.SyntaxKind.PropertyDeclaration:
206
- const specialDecorator = _TypeUtil.default.getSpecialDecorator(node);
207
- if (specialDecorator) {
208
- propertyNode.push(node);
209
- this.translateMemberProperty(node, classNode);
210
- // 特殊成员添加到提取的 interface 中
211
- if (interefaNode) {
212
- const nodeType = node.getTypeNode()?.getText() || 'any';
213
- interefaNode.addProperty({
214
- hasQuestionToken: true,
215
- name: node.getName(),
216
- type: nodeType
217
- });
218
- }
219
- } else {
220
- classNode.addMember(node.getText());
221
- }
222
- break;
223
- case _tsMorph.SyntaxKind.Identifier:
224
- break;
225
- default:
226
- const nodeContent = node.getText();
227
- classNode.addMember(nodeContent);
228
- break;
229
- }
230
- });
231
-
232
- // 添加 updateWithParams 定义和调用
233
- if (this.isPageOrComponent(xtsClassType)) {
234
- let updateWithParamsCodeArr = ['let flag = false;'];
235
- propertyNode.forEach(node => {
236
- const name = node.getName();
237
- const type = node.getTypeNode()?.getText() || 'any';
238
- if (_TypeUtil.default.isPrimitiveType(type)) {
239
- updateWithParamsCodeArr = updateWithParamsCodeArr.concat([`if (params.${name} !== undefined) {`, ` const newVal = params.${name} as ${type}`, ` if (this.${name} !== newVal) {`, ` this.${name} = newVal;`, ` if(!flag)flag = true;`, ` }`, `}`]);
240
- } else {
241
- updateWithParamsCodeArr = updateWithParamsCodeArr.concat([`if (params.${name} !== undefined) {`, ` const newVal = params.${name} as ${type}`, ` this.${name} = newVal;`, ` if(!flag)flag = true;`, `}`]);
242
- }
243
- });
244
- updateWithParamsCodeArr.push('return flag;');
245
- classNode.addMethod({
246
- name: 'updateWithParams',
247
- parameters: [{
248
- type: _Framework.HomeState.interface,
249
- name: 'params'
250
- }],
251
- returnType: 'boolean',
252
- statements: updateWithParamsCodeArr
253
- });
254
- classConstructor.addStatements(['this.updateWithParams__(params)']);
255
- }
256
- }
257
- translateNormalClassNode(sourceNode, targetFile) {
258
- // 不在需要生成静态代理,参考 https://jira.n.xiaomi.com/browse/VELAPLATFO-21439
259
-
260
- const newClassNode = targetFile.addClass({
261
- name: sourceNode.getName(),
262
- // extends: 'AbstractPropertySubscriber',
263
- isDefaultExport: sourceNode.isDefaultExport()
264
- });
265
- this.addMapData(sourceNode.getNameNode(), newClassNode.getNameNode());
266
- // 记录类中所有 private 的成员属性
267
- // let privatePropertyList = sourceNode
268
- // .getMembers()
269
- // .filter((node) => node instanceof PropertyDeclaration && node.getScope() === Scope.Private)
270
- // .map((node) => (node as PropertyDeclaration).getName())
271
- // 循环子节点
272
- sourceNode.forEachChild(node => {
273
- switch (node.getKind()) {
274
- // case SyntaxKind.PropertyDeclaration:
275
- // if (node instanceof PropertyDeclaration) {
276
- // // 1. 判断是否为私有成员属性,如果不是private,添加对应的get, set函数
277
- // // 2. 如果是private,则直接添加节点
278
- // const nodeScope = node.getScope()
279
- // const pNode = newClassNode.addProperty(node.getStructure())
280
- // if (nodeScope !== Scope.Private) {
281
- // const nodeName = node.getName()
282
- // const nodeType = node.getTypeNode()
283
- // const nodeTypeStr = nodeType?.getText()
284
- // pNode.set({
285
- // name: `${nodeName}_`,
286
- // scope: Scope.Private
287
- // })
288
- // const isSimpleTypeData = TypeUtil.isSimpleType(nodeTypeStr)
289
- // if (isSimpleTypeData) {
290
- // this.addGetAccesorFunction(newClassNode, nodeName, nodeTypeStr, `${nodeName}_`)
291
- // this.addSetAccesorFunction(newClassNode, nodeName, nodeTypeStr, `${nodeName}_`)
292
- // } else {
293
- // // 复杂类型的 set 函数
294
- // this.addGetAccesorFunction(newClassNode, nodeName, nodeTypeStr, `${nodeName}_`)
295
- // this.addProxySetAccesorFunction(
296
- // newClassNode,
297
- // nodeName,
298
- // nodeType as TypeReferenceNode
299
- // )
300
- // }
301
- // }
302
- // this.addMapData(node.getNameNode(), pNode.getNameNode())
303
- // }
304
- // break
305
- // case SyntaxKind.GetAccessor:
306
- // this.translateGetOrSet(node as GetAccessorDeclaration, newClassNode, privatePropertyList)
307
- // break
308
- // case SyntaxKind.SetAccessor:
309
- // this.translateGetOrSet(node as SetAccessorDeclaration, newClassNode, privatePropertyList)
310
- // break
311
- case _tsMorph.SyntaxKind.Identifier:
312
- break;
313
- default:
314
- const nodeContent = node.getText();
315
- newClassNode.addMember(nodeContent);
316
- break;
317
- }
318
- });
319
- }
320
- translateInterfaceNode(sourceNode, targetFile) {
321
- // 添加接口
322
- const struct = sourceNode.getStructure();
323
- const interfaceNode = targetFile.addInterface(struct);
324
- this.addMapData(sourceNode.getNameNode(), interfaceNode.getNameNode());
325
- //生成代理类
326
- const type = sourceNode.getName();
327
- const defaultName = 'rawValue__';
328
- const proxyClassNode = targetFile.addClass({
329
- name: `Proxy${type}`,
330
- extends: 'AbstractProxyValueSubscriber',
331
- implements: [type]
332
- });
333
- proxyClassNode.addProperty({
334
- name: defaultName,
335
- type: type,
336
- scope: _tsMorph.Scope.Private
337
- });
338
- // 生成代理类构造函数
339
- const constructor = proxyClassNode.addConstructor({
340
- parameters: [{
341
- name: 'value',
342
- type: type
343
- }, {
344
- name: 'owner',
345
- type: 'IPropertySubscriber'
346
- }, {
347
- name: 'info',
348
- type: 'PropertyType'
349
- }],
350
- statements: ['super(owner, info)', `this.${defaultName} = value`]
351
- });
352
- const interfaceProperties = [];
353
- // 循环 interface中 Property
354
- sourceNode.getMembers().forEach(node => {
355
- // 成员属性
356
- if (node instanceof _tsMorph.PropertySignature) {
357
- const name = node.getName();
358
- const typeNode = node.getTypeNode();
359
- const typeStr = typeNode ? typeNode.getText() : '';
360
- const returnName = `${name}_`;
361
- const isSimpleTypeData = _TypeUtil.default.isSimpleType(typeStr);
362
- if (isSimpleTypeData) {
363
- // 生成get函数
364
- this.addGetAccesorFunction(proxyClassNode, name, typeStr, returnName);
365
- this.addSetAccesorFunction(proxyClassNode, name, typeStr, returnName);
366
- } else {
367
- interfaceProperties.push(node);
368
- proxyClassNode.addProperty({
369
- name: `${name}_`,
370
- type: typeStr,
371
- scope: _tsMorph.Scope.Private
372
- });
373
- // 构造函数中给复杂类型赋值
374
- constructor.addStatements([`this.${name}_ = new Proxy${typeStr}(value.${name}, this, '${name}')`]);
375
- // 生成get函数
376
- this.addGetAccesorFunction(proxyClassNode, name, typeStr, returnName);
377
- this.addProxySetAccesorFunction(proxyClassNode, name, typeNode);
378
- }
379
- } else {
380
- // 成员函数
381
- const nodeContent = node.getText();
382
- proxyClassNode.addMember(nodeContent);
383
- }
384
- });
385
- // 生成set中的赋值语句
386
- let setValueStr = '';
387
- interfaceProperties.forEach(item => {
388
- const name = item.getName();
389
- setValueStr += `this.${name}_ = value.${name}`;
390
- });
391
- // getValue__、setValue__
392
- proxyClassNode.addMethods([{
393
- name: 'getValue__',
394
- returnType: type,
395
- statements: [`return this.${defaultName};`]
396
- }, {
397
- name: 'setValue__',
398
- parameters: [{
399
- type: type,
400
- name: 'value'
401
- }],
402
- statements: [`this.stopNotify__ = true;`, `this.${defaultName} = value;`, `${setValueStr}`, `this.stopNotify__ = false;`]
403
- }]);
404
- }
405
- translateGetOrSet(sourceNode, classNode, privatePropertyList) {
406
- let node;
407
- // 1. 将原本的 get set 函数添加到 classNode 上
408
- if (sourceNode instanceof _tsMorph.GetAccessorDeclaration) {
409
- node = classNode.addGetAccessor(sourceNode.getStructure());
410
- } else {
411
- node = classNode.addSetAccessor(sourceNode.getStructure());
412
- }
413
- this.addMapData(sourceNode.getNameNode(), node.getNameNode());
414
- // 2. 若 get set 函数类型为 private 是则直接返回
415
- const scope = sourceNode.getScope();
416
- if (scope === _tsMorph.Scope.Private) {
417
- return;
418
- }
419
- // 3. 判断函数对应的成员变量是否为 private 是则(get name)修改函数名为(get name_),并添加一个新的同名函数(get name)
420
- // 不是则不修改函数名,也不用添加一个新的同名函数
421
- for (let item in privatePropertyList) {
422
- const matchs = privatePropertyList[item].match(/^_*(.*)$/);
423
- const name = matchs ? matchs[1] : '';
424
- const nodeName = sourceNode.getName();
425
- if (name === nodeName) {
426
- node.set({
427
- name: `${nodeName}_`
428
- });
429
- if (sourceNode instanceof _tsMorph.GetAccessorDeclaration) {
430
- const nodeType = sourceNode.getReturnTypeNode()?.getText();
431
- this.addGetAccesorFunction(classNode, nodeName, nodeType, `${nodeName}_`);
432
- } else {
433
- const nodeType = sourceNode.getParameter('value')?.getTypeNode()?.getText();
434
- this.addSetAccesorFunction(classNode, nodeName, nodeType, `${nodeName}_`);
435
- }
436
- }
437
- }
438
- }
439
- addGetAccesorFunction(classNode, name, type, returnName) {
440
- classNode.addGetAccessor({
441
- name,
442
- returnType: type,
443
- statements: [`this.propertyRead('${name}');`, `return this.${returnName}`]
444
- });
445
- }
446
- addSetAccesorFunction(classNode, name, type, returnName) {
447
- const statements = [`if (this.${returnName} == value) return\nthis.${returnName} = value\nthis.propertyChanged('${name}');
448
- `];
449
- classNode.addSetAccessor({
450
- name,
451
- parameters: [{
452
- type,
453
- name: 'value'
454
- }],
455
- statements: statements
456
- });
457
- }
458
- addProxySetAccesorFunction(classNode, name, typeNode) {
459
- const type = typeNode.getText();
460
- const statements = this.getStatements(name, typeNode);
461
- classNode.addSetAccessor({
462
- name,
463
- parameters: [{
464
- type,
465
- name: 'value'
466
- }],
467
- statements: statements
468
- });
469
- }
470
- translateMemberMethod(sourceNode, classNode) {
471
- const methodName = sourceNode.getName();
472
- if (['render'].includes(methodName)) {
473
- this.translateRenderMethod(sourceNode, classNode);
474
- } else {
475
- this.translateNormalMethod(sourceNode, classNode);
476
- }
477
- }
478
- translateRenderMethod(sourceNode, classNode) {
479
- const bodyChildren = _TypescriptUtil.default.getBlockChildren(sourceNode.getBody());
480
- const methodNode = classNode.addMethod({
481
- name: sourceNode.getName(),
482
- returnType: _Framework.tsFrameWork.exports.VTag
483
- });
484
- this.tsFrameWorkImports.add(_Framework.tsFrameWork.exports.VTag);
485
- this.addMapData(sourceNode.getNameNode(), methodNode.getNameNode());
486
- if (bodyChildren) {
487
- const elementList = this.splitElement(bodyChildren);
488
- this.translateElementList(elementList, methodNode);
489
- }
490
- if (this.elementIndex > 0) {
491
- methodNode.addStatements('return node_1;');
492
- }
493
- }
494
- translateElementList(elementList, methodNode, parentNodeName) {
495
- for (let i = 0; i < elementList.length; i++) {
496
- const element = elementList[i];
497
- switch (true) {
498
- case element instanceof _NodeElement.default:
499
- {
500
- this.translateNodeElement(element, methodNode, parentNodeName);
501
- break;
502
- }
503
- case element instanceof _IfElement.default:
504
- {
505
- this.translateIfElement(element, methodNode, parentNodeName);
506
- break;
507
- }
508
- case element instanceof _ForElement.default:
509
- this.translateForElement(element, methodNode, parentNodeName);
510
- break;
511
- case element instanceof _CommentElement.default:
512
- break;
513
- default:
514
- return this.onLog({
515
- message: `unexpected sourceNode type`,
516
- level: _sharedUtils.Loglevel.THROW
517
- });
518
- }
519
- }
520
- }
521
- translateForElement(sourceNode, methodNode, parentNodeName) {
522
- const {
523
- target,
524
- keyFunction,
525
- renderArguments,
526
- renderElementList
527
- } = sourceNode;
528
- const forFun = methodNode.addStatements(`this.renderFor__()`)[0];
529
- const express = forFun.getExpression();
530
-
531
- // 渲染函数的参数固定为2个,且优化使用源码中的参数名称
532
- const renderArgumentsList = new Array(2).fill(undefined).map((item, index) => {
533
- if (renderArguments && renderArguments[index]) {
534
- return renderArguments[index].getText();
535
- }
536
- return `__${index}`;
537
- });
538
- // 添加 序号、目标数据 render、key
539
- const [, targetNode, renderNode] = express.addArguments([`'${++this.elementIndex}'`, target.getText(), `(${renderArgumentsList.join(', ')}, parent?: ${_Framework.tsFrameWork.exports.VTag}) => {}`, keyFunction ? keyFunction.getText() : 'undefined', parentNodeName ? `${parentNodeName}` : 'undefined']);
540
- this.tsFrameWorkImports.add(_Framework.tsFrameWork.exports.VTag);
541
- this.addMapData(target, targetNode);
542
- if (renderElementList) {
543
- const renderFun = renderNode;
544
- // 添加render 的内容
545
- this.translateElementList(renderElementList, renderFun, 'parent');
546
- }
547
- }
548
- translateIfElement(sourceNode, methodNode, parentNodeName) {
549
- const {
550
- expression,
551
- elseElement,
552
- elements
553
- } = sourceNode;
554
- const isElse = sourceNode.isElse;
555
- if (isElse) {
556
- // 如果是 else, 只渲染自身的元素
557
- this.translateElementList(elements, methodNode, 'parent');
558
- } else {
559
- // 添加renderIf
560
- const renderFun = methodNode.addStatements([`this.renderIf__()`])[0];
561
- const express = renderFun.getExpression();
562
- // 添加序号
563
- express.addArgument(`'${++this.elementIndex}'`);
564
- // 添加if 条件
565
- express.addArgument(`() => ${expression.getText()}`);
566
-
567
- // 添加if 自身的元素
568
- const renderElementFunNode = express.addArgument(`(parent?: ${_Framework.tsFrameWork.exports.VTag}) => {}`);
569
- this.translateElementList(elements, renderElementFunNode, 'parent');
570
- // 递归添加 else
571
- if (elseElement) {
572
- const elseFunNode = express.addArgument(`(parent?: ${_Framework.tsFrameWork.exports.VTag}) => {}`);
573
- this.translateIfElement(elseElement, elseFunNode, 'parent');
574
- this.tsFrameWorkImports.add(_Framework.tsFrameWork.exports.VTag);
575
- } else {
576
- express.addArgument('undefined');
577
- }
578
-
579
- // 添加父节点
580
- if (parentNodeName) {
581
- express.addArgument(parentNodeName);
582
- }
583
- }
584
- }
585
- translateNodeElement(sourceNode, methodNode, parentNodeName) {
586
- const {
587
- expressList,
588
- children
589
- } = sourceNode;
590
- // 从expressList获取所有表达式的名称和值,第1项做为tag
591
- let callList = expressList.map(item => _TypescriptUtil.default.splitExpression(item)).flat();
592
- const tag = callList[0];
593
- const attributeList = callList.slice(1);
594
- const index = ++this.elementIndex;
595
- const nodeName = `node_${index}`;
596
- const stateMap = new Map();
597
- function createVariable(name) {
598
- stateMap.set(_AttributeUtil.default.createVarName(name, index), methodNode.addVariableStatement({
599
- declarations: [{
600
- name: _AttributeUtil.default.createVarName(name, index),
601
- initializer: '{}'
602
- }]
603
- }));
604
- }
605
- for (const key in _AttributeType.default.ALL_LIST) {
606
- const name = _AttributeType.default.toString(_AttributeType.default.ALL_LIST[key]);
607
- createVariable(name);
608
- }
609
-
610
- // 在函数体中添加元素
611
- const statements = methodNode.addStatements([`const ${nodeName} = this.renderTag__('${index}', '${tag.name.getText().toLowerCase()}', {});`]);
612
-
613
- // renderTag__ 的第三个参数
614
- const express = statements[0];
615
- const initValue = express.getDeclarations()[0].getInitializer();
616
-
617
- // 获取第3个参数,准备给其添加属性
618
- const option = initValue.getArguments()[2];
619
- const dir = _path.default.dirname(this.filePath);
620
- const root = this.projectContext.projectPath;
621
- // 如果有初始值,添加 attr 属性,并把放到 attr.value 中
622
- if (tag.value && tag.value.length) {
623
- if (tag.value.length > 1) {
624
- this.onLog({
625
- message: `The argument contains a maximum of 1`,
626
- level: _sharedUtils.Loglevel.ERROR,
627
- position: _TypescriptUtil.default.getNodePostion(tag.name, this.context.sourceFile, this.context.offsetList)
628
- });
629
- } else {
630
- const attr = stateMap.get(_AttributeUtil.default.createVarName(_AttributeType.default.toString(_AttributeType.default.ATTRIBUTE), index))?.getDeclarations()[0];
631
- let initializer = tag.value[0].getText();
632
- // 如果是图片相关的 value 需要转化
633
- if (_AttributeType.default.ImageComponet.includes(tag.name.getText())) {
634
- initializer = _AttributeUtil.default.transformSrc(initializer, dir, root);
635
- }
636
- if (_AttributeUtil.default.isDynamicValue(tag.value[0])) {
637
- _AttributeUtil.default.assignProp(option, {
638
- name: `hasDynamicAttr`,
639
- initializer: 'true'
640
- });
641
- }
642
- ;
643
- attr.getInitializer().addPropertyAssignment({
644
- name: 'value',
645
- initializer
646
- });
647
- }
648
- }
649
- this.addMapData(tag.name, initValue.getExpression());
650
-
651
- // 根据属性名,分别添加到 attr、style、event 中
652
- if (attributeList && attributeList.length) {
653
- // 给attributeList排序,以便按照 attr, event, style 顺序添加属性,防止节点位置错乱
654
- // 例如:[style1, event1, style2], 先添加style1, event1,位置正确;然后添加style2,实际代码会把 event1 往下挤一行,此时 event1 位置错误
655
- const sortedList = attributeList.concat().sort((a, b) => {
656
- const typeA = _AttributeUtil.default.getAttributeType(a.name.getText());
657
- const typeB = _AttributeUtil.default.getAttributeType(b.name.getText());
658
- return _AttributeType.default.ALL_LIST.indexOf(typeA) - _AttributeType.default.ALL_LIST.indexOf(typeB);
659
- });
660
- sortedList.forEach(item => {
661
- const {
662
- attributeItem,
663
- isDynamic,
664
- type
665
- } = _AttributeUtil.default.addAttribute(item, stateMap, index, dir, root, this.pushXtsImport.bind(this));
666
- if (isDynamic && (_AttributeType.default.isStyle(type) || type === _AttributeType.default.toString(_AttributeType.default.ATTRIBUTE))) {
667
- _AttributeUtil.default.assignProp(option, {
668
- name: `hasDynamic${_sharedUtils.StringUtil.capitalizeFirstLetter(type)}`,
669
- initializer: String(isDynamic)
670
- });
671
- }
672
- this.addMapData(item.value[0], attributeItem.getInitializer());
673
- });
674
- }
675
-
676
- /** 遍历子节点后,将空的属性删除掉 */
677
- for (const [name, stateMent] of stateMap) {
678
- if (stateMent.getDeclarations()[0].getInitializer()?.getText() === '{}') {
679
- stateMent.remove();
680
- } else {
681
- option.addPropertyAssignment({
682
- name: _AttributeUtil.default.reverseVarName(name),
683
- initializer: name
684
- });
685
- }
686
- }
687
-
688
- // 如果有父元素,则 addChild
689
- if (parentNodeName) {
690
- initValue.addArgument(parentNodeName);
691
- }
692
-
693
- // 如果有子元素,递归
694
- if (children && children.length) {
695
- this.translateElementList(children, methodNode, nodeName);
696
- }
697
- return callList;
698
- }
699
-
700
- /**
701
- *
702
- * @param nodeList
703
- * @returns
704
- */
705
- splitElement(nodeList) {
706
- const result = [];
707
- const typeList = [_CommentElement.default, _ForElement.default, _IfElement.default, _NodeElement.default];
708
- let i = 0;
709
- while (i < nodeList.length) {
710
- const node = nodeList[i];
711
- const matchType = typeList.find(item => item.match(node));
712
- if (matchType) {
713
- const collectResult = matchType.collect(this.context, nodeList, i, this.splitElement.bind(this));
714
- result.push(collectResult.element);
715
- i += collectResult.offset;
716
- } else {
717
- this.onLog({
718
- message: `no matchType`,
719
- level: _sharedUtils.Loglevel.ERROR,
720
- position: _TypescriptUtil.default.getNodePostion(node, this.context.sourceFile, this.context.offsetList)
721
- });
722
- }
723
- }
724
- return result;
725
- }
726
- translateNormalMethod(sourceNode, classNode) {
727
- // 添加方法
728
- const struct = sourceNode.getStructure();
729
- const methodNode = classNode.addMethod(struct);
730
-
731
- // 遍历新旧函数的标识符,记录对应关系
732
- const sourceIdentifiers = sourceNode.getDescendantsOfKind(_tsMorph.SyntaxKind.Identifier);
733
- const newIdentifiers = methodNode.getDescendantsOfKind(_tsMorph.SyntaxKind.Identifier);
734
- sourceIdentifiers.forEach((item, index) => {
735
- this.addMapData(item, newIdentifiers[index]);
736
- });
737
- }
738
- translateMemberProperty(sourceNode, classNode) {
739
- const name = sourceNode.getName();
740
- const typeNode = sourceNode.getTypeNode();
741
- const type = typeNode?.getText();
742
- const initValue = sourceNode.getInitializer()?.getText();
743
- const privateName = `${name}`;
744
-
745
- // 在构造函数中插入赋值
746
- if (initValue) {
747
- const constructorNode = classNode.getConstructors()[0];
748
- const initializerStr = sourceNode.getInitializer()?.getText();
749
-
750
- // 不在需要生成静态代理 参考 https://jira.n.xiaomi.com/browse/VELAPLATFO-21439
751
- // 1. 区分数据类型,生成 initializerStr :简单数据赋值,Map、Set赋值,interface和类赋值,Array赋值
752
- // 2. Array类型需要给多层数组添加typedArr_ctors
753
- // 3. 添加到构造函数中
754
- // const isSimpleTypeData = TypeUtil.isSimpleType(type)
755
- // let initializerStr = ''
756
- // let typedArrCtors_ = ''
757
- // initializerStr = initializerData ? initializerData : ''
758
- // if (isSimpleTypeData) {
759
- // } else {
760
- // const { typeArguments, typedArrCtorsStr } = this.translateComplexInitalizer(sourceNode)
761
- // initializerStr = typeArguments
762
- // typedArrCtors_ = typedArrCtorsStr
763
- // }
764
- // if (constructorNode) {
765
- // typedArrCtors_ && constructorNode.addStatements(`${typedArrCtors_}`)
766
- // constructorNode.addStatements(`this.${privateName} = ${initializerStr || ''}`)
767
- // }
768
- constructorNode.addStatements(`this.${privateName} = ${initializerStr || ''};`);
769
- }
770
-
771
- // 生成私有属性
772
- const privateNode = classNode.addProperty({
773
- name: privateName,
774
- type: type
775
- // scope: Scope.Private
776
- });
777
- this.addMapData(sourceNode.getNameNode(), privateNode.getNameNode());
778
- // 不在需要生成静态代理,参考 https://jira.n.xiaomi.com/browse/VELAPLATFO-21439
779
- // 生成 get set
780
- // this.addGetAccesorFunction(classNode, name, type, privateName)
781
- // isSimpleTypeData
782
- // ? this.addSetAccesorFunction(classNode, name, type, privateName)
783
- // : this.addProxySetAccesorFunction(classNode, name, typeNode as TypeReferenceNode)
784
- }
785
- /**
786
- * 处理代理类的构造函数赋值
787
- * 需要区分Array,Map,Set和Interface,Class
788
- * @param sourceNode
789
- * @returns
790
- */
791
- translateComplexInitalizer(sourceNode) {
792
- const name = sourceNode.getName();
793
- const typeNode = sourceNode.getTypeNode();
794
- const initializerData = sourceNode.getInitializer()?.getText();
795
- let typeArguments = '';
796
- let typeStr = '';
797
- let typedArrCtorsStr = '';
798
- let typedArrCtors = '[]';
799
- if (typeNode instanceof _tsMorph.TypeReferenceNode) {
800
- typeStr = typeNode.getTypeName().getText();
801
- const typeArgumentNodes = typeNode.getTypeArguments();
802
- let typeArgsArray = [];
803
- typeArgumentNodes.forEach(node => {
804
- typeArgsArray.push(node.getText());
805
- // 多层嵌套
806
- if (node instanceof _tsMorph.TypeReferenceNode) {
807
- typedArrCtorsStr = this.translateMultiLayerArray(node);
808
- }
809
- });
810
- typeArguments = typeArgsArray.join(', ');
811
- } else if (typeNode instanceof _tsMorph.ArrayTypeNode) {
812
- // string[][]嵌套
813
- typeStr = 'Array';
814
- const typeArrayNode = typeNode.getElementTypeNode();
815
- typeArguments = typeArrayNode.getText();
816
- if (typeArrayNode instanceof _tsMorph.ArrayTypeNode) {
817
- typedArrCtorsStr = this.translateMultiLayerArray(typeArrayNode);
818
- }
819
- }
820
- if (typedArrCtorsStr) {
821
- typedArrCtors = `${name}_ctors`;
822
- typedArrCtorsStr = `const ${typedArrCtors}= [\n${typedArrCtorsStr}\n];`;
823
- }
824
- typeArguments = typeArguments ? `new Typed${typeStr}Proxy<${typeArguments}>(${initializerData}, this, ${name}, ${typedArrCtors})` : `new Proxy${typeStr}(${initializerData}, this, '${name}')`;
825
- return {
826
- typeArguments,
827
- typedArrCtorsStr
828
- };
829
- }
830
- /**
831
- * 处理多层数组在构造函数中的代理和赋值
832
- * @param sourceNode
833
- * @returns
834
- */
835
- translateMultiLayerArray(sourceNode) {
836
- let typedArrCtors1 = '';
837
- let typedArrCtors2 = '';
838
- let typeArguments = '';
839
- let typeName = '';
840
- let typeStr = '';
841
- if (sourceNode instanceof _tsMorph.ArrayTypeNode) {
842
- // 例如节点为string[][][]
843
- const typeNode = sourceNode.getElementTypeNode();
844
- typeArguments = typeNode.getText();
845
- typeName = sourceNode.getText();
846
- typeStr = 'Array';
847
- if (typeNode instanceof _tsMorph.ArrayTypeNode) {
848
- typedArrCtors2 = this.translateMultiLayerArray(typeNode);
849
- }
850
- } else {
851
- // 例如节点为Array<Array<string>>
852
- typeName = sourceNode.getText();
853
- typeStr = sourceNode.getTypeName().getText();
854
- const typeArgumentNodes = sourceNode.getTypeArguments();
855
- let typeArgsArray = [];
856
- typeArgumentNodes.forEach(node => {
857
- typeArgsArray.push(node.getText());
858
- if (node instanceof _tsMorph.TypeReferenceNode) {
859
- typedArrCtors2 += this.translateMultiLayerArray(node);
860
- }
861
- });
862
- typeArguments = typeArgsArray.join(', ');
863
- }
864
- typedArrCtors1 = `
865
- function(items:${typeName}, owner: IPropertySubscriber, info: PropertyType, proxyCtors: Function[]): Object {
866
- return new Typed${typeStr}Proxy<${typeArguments}>(items, owner, info, proxyCtors);
867
- }`;
868
- return `${typedArrCtors1}\n${typedArrCtors2}`;
869
- }
870
- getStatements(name, typeNode) {
871
- const isProp = false;
872
- const resultStatements = [];
873
- const isInterface = _TypeUtil.default.isCustomType(typeNode);
874
- const type = typeNode?.getText();
875
- if (isProp) {
876
- resultStatements.push(`if (this.stopUpdateProps__) return`);
877
- }
878
- if (isInterface) {
879
- const interfaceStatements = [`const oldValue = this.${name}_ as Proxy${type};`, `if (oldValue == value || oldValue.getValue__() == value) return;`, `if (value instanceof Proxy${type}) {`, ` oldValue.unSubscribe(this, '${name}');`, ` (value as Proxy${type}).subscribe(this, '${name}');`, ` this.${name}_ = value;`, `} else {`, ` oldValue.setValue__(value);`, `}`, `this.propertyChanged('${name}');`];
880
- resultStatements.push(...interfaceStatements);
881
- } else {
882
- const privateName = `${name}_`;
883
- const otherStatements = [`const oldValue = this.${privateName};`, `if (oldValue == value) return;`, `const oldProxy = oldValue as Object as IProxyValueSubscriber;`, `if (oldProxy.getValue__() == value) return;`, `if ($__.isProxyValueSubscriber(value)) {`, `oldProxy.unSubscribe(this, '${name}');`, `(value as Object as IProxyValueSubscriber).subscribe(this, '${name}');`, `this.${privateName} = value;`, `} else {`, `oldProxy.setValue__(value);`, `}`, `this.propertyChanged('${name}');`];
884
- resultStatements.push(...otherStatements);
885
- }
886
- return resultStatements;
887
- }
888
- pushXtsImport(target) {
889
- if (Object.values(_Framework.tsFrameWorkExports).includes(target)) {
890
- this.tsFrameWorkImports.add(target);
891
- }
892
- }
893
- }
894
- var _default = exports.default = XtsToTypescript;