@hadss/turbo-trans-json-plugin 1.0.0-rc.1 → 1.0.0-rc.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 (76) hide show
  1. package/dist/core/analyzers/ClassAnalyzer.d.ts +15 -0
  2. package/dist/core/analyzers/ClassAnalyzer.js +193 -144
  3. package/dist/core/analyzers/CustomTypeAnalyzer.d.ts +3 -0
  4. package/dist/core/analyzers/CustomTypeAnalyzer.js +65 -60
  5. package/dist/core/constants/DecoratorConstants.js +2 -1
  6. package/dist/core/import-rewrite/services/BuildProfileUpdater.js +1 -1
  7. package/dist/core/import-rewrite/services/ImportRewriteService.js +1 -1
  8. package/dist/core/interfaces/index.d.ts +2 -2
  9. package/dist/core/services/CodeAnalysisService.js +2 -1
  10. package/dist/core/services/CodeGenerationService/generators/OriginalClassGenerator.d.ts +2 -0
  11. package/dist/core/services/CodeGenerationService/generators/OriginalClassGenerator.js +22 -15
  12. package/dist/core/services/CodeGenerationService/generators/SendableClassGenerator.d.ts +22 -0
  13. package/dist/core/services/CodeGenerationService/generators/SendableClassGenerator.js +194 -129
  14. package/dist/core/services/CodeGenerationService/generators/SerializerGenerator.js +1 -1
  15. package/dist/core/services/CodeGenerationService/generators/TempSerializerGenerator.js +2 -1
  16. package/dist/core/services/CodeGenerationService/shared/ImportManager.d.ts +2 -2
  17. package/dist/core/template/HandlebarsTemplateEngine.d.ts +2 -0
  18. package/dist/core/template/HandlebarsTemplateEngine.js +21 -2
  19. package/dist/core/utils/DeepCopyUtil.js +1 -1
  20. package/dist/core/utils/SerializationPathUtil.d.ts +1 -1
  21. package/dist/core/utils/TsMorphUtil.js +2 -1
  22. package/dist/json-plugin/JSONExecuteController.d.ts +4 -0
  23. package/dist/json-plugin/JSONExecuteController.js +46 -36
  24. package/dist/json-plugin/interfaces/impl/TargetContext.js +4 -2
  25. package/dist/json-plugin/tasks/BaseTask.d.ts +2 -2
  26. package/dist/json-plugin/tasks/WatchTask.js +2 -1
  27. package/package.json +1 -1
  28. package/src/core/Types.ts +90 -90
  29. package/src/core/analyzers/ClassAnalyzer.ts +335 -230
  30. package/src/core/analyzers/CustomTypeAnalyzer.ts +145 -73
  31. package/src/core/constants/DecoratorConstants.ts +7 -6
  32. package/src/core/constants/PathConstants.ts +7 -7
  33. package/src/core/constants/StringConstants.ts +95 -95
  34. package/src/core/handlers/BaseTypeHandler.ts +11 -2
  35. package/src/core/handlers/CustomClassHandler.ts +4 -4
  36. package/src/core/handlers/DateHandler.ts +54 -46
  37. package/src/core/handlers/DecimalHandler.ts +53 -45
  38. package/src/core/handlers/EnumHandler.ts +2 -1
  39. package/src/core/handlers/GenericContainerHandler.ts +3 -1
  40. package/src/core/handlers/TupleHandler.ts +2 -1
  41. package/src/core/handlers/TypeHandlerRegistry.ts +2 -1
  42. package/src/core/handlers/UnionTypeHandler.ts +8 -7
  43. package/src/core/import-rewrite/services/BuildProfileUpdater.ts +6 -4
  44. package/src/core/import-rewrite/services/ImportRewriteService.ts +1 -1
  45. package/src/core/import-rewrite/services/ImportTransformService.ts +2 -2
  46. package/src/core/import-rewrite/types/ImportRewriteTypes.ts +3 -3
  47. package/src/core/index.ts +4 -4
  48. package/src/core/interfaces/ITask.ts +6 -5
  49. package/src/core/interfaces/ITaskContext.ts +9 -9
  50. package/src/core/interfaces/index.ts +2 -2
  51. package/src/core/logger/Logger.ts +28 -28
  52. package/src/core/services/CodeAnalysisService.ts +2 -1
  53. package/src/core/services/CodeGenerationEngine.ts +42 -42
  54. package/src/core/services/CodeGenerationService/generators/OriginalClassGenerator.ts +25 -22
  55. package/src/core/services/CodeGenerationService/generators/SendableClassGenerator.ts +261 -170
  56. package/src/core/services/CodeGenerationService/generators/SerializerGenerator.ts +1 -1
  57. package/src/core/services/CodeGenerationService/generators/TempSerializerGenerator.ts +5 -3
  58. package/src/core/services/CodeGenerationService/shared/ImportManager.ts +8 -8
  59. package/src/core/template/HandlebarsTemplateEngine.ts +39 -11
  60. package/src/core/utils/ConfigManager.ts +2 -1
  61. package/src/core/utils/DeepCopyUtil.ts +1 -1
  62. package/src/core/utils/GenericTypeSubstitutionUtil.ts +1 -8
  63. package/src/core/utils/SerializationPathUtil.ts +7 -6
  64. package/src/core/utils/TsMorphUtil.ts +4 -1
  65. package/src/index.ts +2 -2
  66. package/src/json-plugin/JSONExecuteController.ts +51 -38
  67. package/src/json-plugin/interfaces/IModuleContext.ts +8 -8
  68. package/src/json-plugin/interfaces/ITargetContext.ts +6 -6
  69. package/src/json-plugin/interfaces/impl/ModuleContext.ts +10 -10
  70. package/src/json-plugin/interfaces/impl/TargetContext.ts +63 -58
  71. package/src/json-plugin/tasks/BaseTask.ts +5 -3
  72. package/src/json-plugin/tasks/CleanTask.ts +7 -7
  73. package/src/json-plugin/tasks/WatchTask.ts +20 -18
  74. package/template/SerializerPerformanceTemplate.hbs +5 -5
  75. package/template/SerializerStrictTemplate.hbs +1 -1
  76. package/template/SerializerTemplate.hbs +59 -42
@@ -13,9 +13,9 @@
13
13
  * limitations under the License.
14
14
  */
15
15
 
16
- import { HvigorLogger } from '@ohos/hvigor'
16
+ import { HvigorLogger } from '@ohos/hvigor';
17
17
 
18
- const PREFIX = '[TSerialization]'
18
+ const PREFIX = '[TSerialization]';
19
19
 
20
20
  /**
21
21
  * TSerialization 日志工具类
@@ -23,28 +23,28 @@ const PREFIX = '[TSerialization]'
23
23
  */
24
24
  export class Logger {
25
25
  /** 当前模块上下文 */
26
- private static currentModule: string = ''
26
+ private static currentModule: string = '';
27
27
 
28
28
  /**
29
29
  * 设置当前模块上下文
30
30
  * @param moduleName 模块名称
31
31
  */
32
32
  static setModuleContext(moduleName: string): void {
33
- this.currentModule = moduleName
33
+ this.currentModule = moduleName;
34
34
  }
35
35
 
36
36
  /**
37
37
  * 清除当前模块上下文
38
38
  */
39
39
  static clearModuleContext(): void {
40
- this.currentModule = ''
40
+ this.currentModule = '';
41
41
  }
42
42
 
43
43
  /**
44
44
  * 获取当前模块上下文
45
45
  */
46
46
  static getCurrentModule(): string {
47
- return this.currentModule
47
+ return this.currentModule;
48
48
  }
49
49
 
50
50
  /**
@@ -53,8 +53,8 @@ export class Logger {
53
53
  * @returns 格式化后的消息
54
54
  */
55
55
  private static formatMessage(msg: string): string {
56
- const modulePrefix = this.currentModule ? `[${this.currentModule}]` : ''
57
- return `${PREFIX}${modulePrefix} ${msg}`
56
+ const modulePrefix = this.currentModule ? `[${this.currentModule}]` : '';
57
+ return `${PREFIX}${modulePrefix} ${msg}`;
58
58
  }
59
59
 
60
60
  /**
@@ -63,11 +63,11 @@ export class Logger {
63
63
  * @param args 额外参数
64
64
  */
65
65
  static error(msg: string, ...args: unknown[]): void {
66
- const formattedMsg = this.formatMessage(msg)
66
+ const formattedMsg = this.formatMessage(msg);
67
67
  if (args.length > 0) {
68
- HvigorLogger.getLogger().error(formattedMsg, ...args)
68
+ HvigorLogger.getLogger().error(formattedMsg, ...args);
69
69
  } else {
70
- HvigorLogger.getLogger().error(formattedMsg)
70
+ HvigorLogger.getLogger().error(formattedMsg);
71
71
  }
72
72
  }
73
73
 
@@ -77,11 +77,11 @@ export class Logger {
77
77
  * @param args 额外参数
78
78
  */
79
79
  static info(msg: string, ...args: unknown[]): void {
80
- const formattedMsg = this.formatMessage(msg)
80
+ const formattedMsg = this.formatMessage(msg);
81
81
  if (args.length > 0) {
82
- HvigorLogger.getLogger().info(formattedMsg, ...args)
82
+ HvigorLogger.getLogger().info(formattedMsg, ...args);
83
83
  } else {
84
- HvigorLogger.getLogger().info(formattedMsg)
84
+ HvigorLogger.getLogger().info(formattedMsg);
85
85
  }
86
86
  }
87
87
 
@@ -91,11 +91,11 @@ export class Logger {
91
91
  * @param args 额外参数
92
92
  */
93
93
  static warn(msg: string, ...args: unknown[]): void {
94
- const formattedMsg = this.formatMessage(msg)
94
+ const formattedMsg = this.formatMessage(msg);
95
95
  if (args.length > 0) {
96
- HvigorLogger.getLogger().warn(formattedMsg, ...args)
96
+ HvigorLogger.getLogger().warn(formattedMsg, ...args);
97
97
  } else {
98
- HvigorLogger.getLogger().warn(formattedMsg)
98
+ HvigorLogger.getLogger().warn(formattedMsg);
99
99
  }
100
100
  }
101
101
 
@@ -105,11 +105,11 @@ export class Logger {
105
105
  * @param args 额外参数
106
106
  */
107
107
  static debug(msg: string, ...args: unknown[]): void {
108
- const formattedMsg = this.formatMessage(msg)
108
+ const formattedMsg = this.formatMessage(msg);
109
109
  if (args.length > 0) {
110
- HvigorLogger.getLogger().debug(formattedMsg, ...args)
110
+ HvigorLogger.getLogger().debug(formattedMsg, ...args);
111
111
  } else {
112
- HvigorLogger.getLogger().debug(formattedMsg)
112
+ HvigorLogger.getLogger().debug(formattedMsg);
113
113
  }
114
114
  }
115
115
 
@@ -120,13 +120,13 @@ export class Logger {
120
120
  * @returns 函数执行结果
121
121
  */
122
122
  static withModuleContext<T>(moduleName: string, fn: () => T): T {
123
- const previousModule = this.currentModule
123
+ const previousModule = this.currentModule;
124
124
  try {
125
- this.setModuleContext(moduleName)
126
- return fn()
125
+ this.setModuleContext(moduleName);
126
+ return fn();
127
127
  } finally {
128
128
  // 恢复之前的模块上下文
129
- this.currentModule = previousModule
129
+ this.currentModule = previousModule;
130
130
  }
131
131
  }
132
132
 
@@ -137,13 +137,13 @@ export class Logger {
137
137
  * @returns Promise
138
138
  */
139
139
  static async withModuleContextAsync<T>(moduleName: string, fn: () => Promise<T>): Promise<T> {
140
- const previousModule = this.currentModule
140
+ const previousModule = this.currentModule;
141
141
  try {
142
- this.setModuleContext(moduleName)
143
- return await fn()
142
+ this.setModuleContext(moduleName);
143
+ return await fn();
144
144
  } finally {
145
145
  // 恢复之前的模块上下文
146
- this.currentModule = previousModule
146
+ this.currentModule = previousModule;
147
147
  }
148
148
  }
149
149
  }
@@ -19,7 +19,8 @@ import { ClassAnalyzer } from '../analyzers/ClassAnalyzer';
19
19
  import { TsMorphUtil } from '../utils/TsMorphUtil';
20
20
 
21
21
  export class CodeAnalysisService {
22
- constructor() { }
22
+ constructor() {
23
+ }
23
24
 
24
25
  analyzeFile(filePath: string): ClassAnalysis[] {
25
26
  Logger.debug(`开始分析文件: ${filePath}`);
@@ -21,15 +21,15 @@ import { SendableMergeChecker } from '../analyzers/SendableMergeChecker';
21
21
  import { CustomTypeAnalyzer } from '../analyzers/CustomTypeAnalyzer';
22
22
 
23
23
  export class CodeGenerationEngine {
24
- private readonly analysisService: CodeAnalysisService
25
- private readonly generationService: CodeGenerationService
24
+ private readonly analysisService: CodeAnalysisService;
25
+ private readonly generationService: CodeGenerationService;
26
26
 
27
27
  // 保存分析结果供导入重写使用
28
- private allClassAnalysis: ClassAnalysis[] = []
28
+ private allClassAnalysis: ClassAnalysis[] = [];
29
29
 
30
30
  constructor() {
31
- this.analysisService = new CodeAnalysisService()
32
- this.generationService = new CodeGenerationService()
31
+ this.analysisService = new CodeAnalysisService();
32
+ this.generationService = new CodeGenerationService();
33
33
  }
34
34
 
35
35
  /**
@@ -39,72 +39,72 @@ export class CodeGenerationEngine {
39
39
  */
40
40
  processFilesUnified(scanFiles: string[], context: ITaskContext): IGenerationResult {
41
41
  if (!scanFiles || scanFiles.length === 0) {
42
- Logger.info('没有待处理的源文件')
42
+ Logger.info('没有待处理的源文件');
43
43
  return {
44
44
  generatedFiles: [],
45
45
  skippedFiles: []
46
- }
46
+ };
47
47
  }
48
48
 
49
- const generatedFiles: IGeneratedFile[] = []
50
- const skippedFiles: string[] = []
49
+ const generatedFiles: IGeneratedFile[] = [];
50
+ const skippedFiles: string[] = [];
51
51
 
52
52
  // 重置分析结果和合并性注册表
53
- this.allClassAnalysis = []
54
- SendableMergeabilityRegistry.clear()
53
+ this.allClassAnalysis = [];
54
+ SendableMergeabilityRegistry.clear();
55
55
 
56
- Logger.info(`开始处理 ${scanFiles.length} 个源文件`)
56
+ Logger.info(`开始处理 ${scanFiles.length} 个源文件`);
57
57
 
58
58
  // ========== 阶段1:分析所有文件并检查合并性 ==========
59
- Logger.debug(`[阶段1] 开始分析所有文件`)
60
- const fileAnalysisMap = new Map<string, ClassAnalysis[]>()
59
+ Logger.debug(`[阶段1] 开始分析所有文件`);
60
+ const fileAnalysisMap = new Map<string, ClassAnalysis[]>();
61
61
 
62
62
  // 步骤1.1:分析所有文件的基本信息
63
63
  for (const filePath of scanFiles) {
64
- const classAnalysis = this.analysisService.analyzeFile(filePath)
64
+ const classAnalysis = this.analysisService.analyzeFile(filePath);
65
65
 
66
66
  if (classAnalysis.length === 0) {
67
- skippedFiles.push(filePath)
68
- Logger.debug(`跳过文件(无@Serializable类): ${filePath}`)
69
- continue
67
+ skippedFiles.push(filePath);
68
+ Logger.debug(`跳过文件(无@Serializable类): ${filePath}`);
69
+ continue;
70
70
  }
71
71
 
72
72
  // 保存分析结果
73
- fileAnalysisMap.set(filePath, classAnalysis)
74
- this.allClassAnalysis.push(...classAnalysis)
73
+ fileAnalysisMap.set(filePath, classAnalysis);
74
+ this.allClassAnalysis.push(...classAnalysis);
75
75
  }
76
76
 
77
- Logger.debug(`[阶段1.1] 完成基本分析,共 ${this.allClassAnalysis.length} 个类`)
77
+ Logger.debug(`[阶段1.1] 完成基本分析,共 ${this.allClassAnalysis.length} 个类`);
78
78
 
79
79
  // 步骤1.2:检查所有类的合并性并注册到全局注册表
80
- Logger.debug(`[阶段1.2] 开始检查合并性并注册`)
80
+ Logger.debug(`[阶段1.2] 开始检查合并性并注册`);
81
81
  for (const analysis of this.allClassAnalysis) {
82
82
  // 仅对启用 generateSendable 的类检查合并性
83
83
  if (analysis.decorators.serializable?.generateSendable) {
84
- analysis.canMerge = SendableMergeChecker.check(analysis)
85
- SendableMergeabilityRegistry.register(analysis.className, analysis.canMerge)
84
+ analysis.canMerge = SendableMergeChecker.check(analysis);
85
+ SendableMergeabilityRegistry.register(analysis.className, analysis.canMerge);
86
86
  } else {
87
87
  // 未启用 generateSendable 的类,注册为不可合并
88
- SendableMergeabilityRegistry.register(analysis.className, false)
88
+ SendableMergeabilityRegistry.register(analysis.className, false);
89
89
  }
90
90
  }
91
91
 
92
92
  // ========== 阶段2:生成所有文件 ==========
93
- Logger.debug(`[阶段2] 开始生成所有文件`)
93
+ Logger.debug(`[阶段2] 开始生成所有文件`);
94
94
 
95
95
  for (const [filePath, classAnalysis] of fileAnalysisMap.entries()) {
96
- const generatedFile = this.generationService.generateForSourceFile(filePath, classAnalysis, context)
96
+ const generatedFile = this.generationService.generateForSourceFile(filePath, classAnalysis, context);
97
97
  if (generatedFile) {
98
- generatedFiles.push(generatedFile)
99
- Logger.debug(`成功处理文件: ${filePath}`)
98
+ generatedFiles.push(generatedFile);
99
+ Logger.debug(`成功处理文件: ${filePath}`);
100
100
  } else {
101
- Logger.warn(`文件生成失败: ${filePath}`)
101
+ Logger.warn(`文件生成失败: ${filePath}`);
102
102
  }
103
103
  }
104
104
 
105
- Logger.info(`处理完成,成功 ${generatedFiles.length} 个,跳过 ${skippedFiles.length} 个`)
105
+ Logger.info(`处理完成,成功 ${generatedFiles.length} 个,跳过 ${skippedFiles.length} 个`);
106
106
 
107
- return { generatedFiles, skippedFiles }
107
+ return { generatedFiles, skippedFiles };
108
108
  }
109
109
 
110
110
  /**
@@ -113,19 +113,19 @@ export class CodeGenerationEngine {
113
113
  * @returns 生成的文件信息,如果无需生成则返回null
114
114
  */
115
115
  processFileUnified(filePath: string, context: ITaskContext): IGeneratedFile | null {
116
- const classAnalysis = this.analysisService.analyzeFile(filePath)
116
+ const classAnalysis = this.analysisService.analyzeFile(filePath);
117
117
 
118
118
  // 如果没有@Serializable类,跳过生成
119
119
  if (classAnalysis.length === 0) {
120
- Logger.debug(`源文件 ${filePath} 无@Serializable类,跳过生成`)
121
- return null
120
+ Logger.debug(`源文件 ${filePath} 无@Serializable类,跳过生成`);
121
+ return null;
122
122
  }
123
123
 
124
124
  // 保存分析结果供导入重写使用
125
- this.allClassAnalysis.push(...classAnalysis)
125
+ this.allClassAnalysis.push(...classAnalysis);
126
126
 
127
127
  // 生成对应文件
128
- return this.generationService.generateForSourceFile(filePath, classAnalysis, context)
128
+ return this.generationService.generateForSourceFile(filePath, classAnalysis, context);
129
129
  }
130
130
 
131
131
 
@@ -165,7 +165,7 @@ export class CodeGenerationEngine {
165
165
  * 供外部使用(如调试)
166
166
  */
167
167
  getAllAnalysisResults(): ClassAnalysis[] {
168
- return [...this.allClassAnalysis]
168
+ return [...this.allClassAnalysis];
169
169
  }
170
170
 
171
171
  /**
@@ -173,9 +173,9 @@ export class CodeGenerationEngine {
173
173
  * 注意:这个方法应该在整个流程(包括导入重写)完成后调用
174
174
  */
175
175
  cleanup(): void {
176
- this.analysisService.dispose()
177
- this.allClassAnalysis = []
178
- CustomTypeAnalyzer.getInstance().clearCache()
179
- SendableMergeabilityRegistry.clear()
176
+ this.analysisService.dispose();
177
+ this.allClassAnalysis = [];
178
+ CustomTypeAnalyzer.getInstance().clearCache();
179
+ SendableMergeabilityRegistry.clear();
180
180
  }
181
181
  }
@@ -203,28 +203,8 @@ export class OriginalClassGenerator {
203
203
  // ============= toSendable方法生成 =============
204
204
 
205
205
  private generateConvertToSendableMethodBody(classAnalysis: ClassAnalysis, returnType: string): string {
206
- const constructorProps: PropertyAnalysis[] = [];
207
- // 遍历 constructorParams 按顺序处理
208
- classAnalysis.constructorParams.forEach((cp) => {
209
- // 查找 classAnalysis.properties 中是否存在该属性
210
- const matchingProperty = classAnalysis.properties.find((p) => p.name === cp.name);
211
-
212
- // 如果找到匹配的属性,按顺序添加到 constructorProps
213
- if (matchingProperty) {
214
- constructorProps.push({
215
- ...matchingProperty,
216
- type: {
217
- ...matchingProperty.type,
218
- // 使用 constructorParam 中的 isOptional
219
- isOptional: cp.isOptional,
220
- }
221
- });
222
- }
223
- });
224
-
225
- const assignmentProps = classAnalysis.properties.filter((p) => {
226
- return classAnalysis.constructorParams.every((cp) => cp.name !== p.name);
227
- });
206
+ const constructorProps = this.getConstructorProperties(classAnalysis);
207
+ const assignmentProps = this.getAssignmentProperties(classAnalysis);
228
208
  const statements: string[] = [];
229
209
 
230
210
  // 生成构造函数调用
@@ -247,6 +227,29 @@ export class OriginalClassGenerator {
247
227
  return statements.join('\n');
248
228
  }
249
229
 
230
+ private getConstructorProperties(classAnalysis: ClassAnalysis): PropertyAnalysis[] {
231
+ const constructorProps: PropertyAnalysis[] = [];
232
+ classAnalysis.constructorParams.forEach((cp) => {
233
+ const matchingProperty = classAnalysis.properties.find((p) => p.name === cp.name);
234
+ if (matchingProperty) {
235
+ constructorProps.push({
236
+ ...matchingProperty,
237
+ type: {
238
+ ...matchingProperty.type,
239
+ isOptional: cp.isOptional,
240
+ }
241
+ });
242
+ }
243
+ });
244
+ return constructorProps;
245
+ }
246
+
247
+ private getAssignmentProperties(classAnalysis: ClassAnalysis): PropertyAnalysis[] {
248
+ return classAnalysis.properties.filter((p) => {
249
+ return classAnalysis.constructorParams.every((cp) => cp.name !== p.name);
250
+ });
251
+ }
252
+
250
253
  private generateConstructorCall(constructorProps: PropertyAnalysis[], returnType: string): string {
251
254
  if (constructorProps.length === 0) {
252
255
  return `new ${returnType}()`;