@hadss/turbo-trans-json-plugin 1.0.0-rc.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 (195) hide show
  1. package/LICENSE +177 -0
  2. package/README.md +253 -0
  3. package/dist/core/Types.d.ts +196 -0
  4. package/dist/core/Types.js +47 -0
  5. package/dist/core/analyzers/ClassAnalyzer.d.ts +23 -0
  6. package/dist/core/analyzers/ClassAnalyzer.js +480 -0
  7. package/dist/core/analyzers/CustomTypeAnalyzer.d.ts +21 -0
  8. package/dist/core/analyzers/CustomTypeAnalyzer.js +243 -0
  9. package/dist/core/analyzers/SendableMergeChecker.d.ts +9 -0
  10. package/dist/core/analyzers/SendableMergeChecker.js +100 -0
  11. package/dist/core/analyzers/SendableMergeabilityRegistry.d.ts +7 -0
  12. package/dist/core/analyzers/SendableMergeabilityRegistry.js +23 -0
  13. package/dist/core/constants/DecoratorConstants.d.ts +7 -0
  14. package/dist/core/constants/DecoratorConstants.js +13 -0
  15. package/dist/core/constants/PathConstants.d.ts +6 -0
  16. package/dist/core/constants/PathConstants.js +10 -0
  17. package/dist/core/constants/StringConstants.d.ts +83 -0
  18. package/dist/core/constants/StringConstants.js +87 -0
  19. package/dist/core/constants/index.d.ts +3 -0
  20. package/dist/core/constants/index.js +19 -0
  21. package/dist/core/handlers/BaseTypeHandler.d.ts +23 -0
  22. package/dist/core/handlers/BaseTypeHandler.js +57 -0
  23. package/dist/core/handlers/CustomClassHandler.d.ts +21 -0
  24. package/dist/core/handlers/CustomClassHandler.js +191 -0
  25. package/dist/core/handlers/DateHandler.d.ts +2 -0
  26. package/dist/core/handlers/DateHandler.js +60 -0
  27. package/dist/core/handlers/DecimalHandler.d.ts +2 -0
  28. package/dist/core/handlers/DecimalHandler.js +60 -0
  29. package/dist/core/handlers/EnumHandler.d.ts +2 -0
  30. package/dist/core/handlers/EnumHandler.js +89 -0
  31. package/dist/core/handlers/GenericContainerHandler.d.ts +2 -0
  32. package/dist/core/handlers/GenericContainerHandler.js +440 -0
  33. package/dist/core/handlers/GenericHandler.d.ts +18 -0
  34. package/dist/core/handlers/GenericHandler.js +92 -0
  35. package/dist/core/handlers/HandlerBootstrap.d.ts +2 -0
  36. package/dist/core/handlers/HandlerBootstrap.js +28 -0
  37. package/dist/core/handlers/ITypeHandler.d.ts +23 -0
  38. package/dist/core/handlers/ITypeHandler.js +8 -0
  39. package/dist/core/handlers/PrimitiveHandler.d.ts +2 -0
  40. package/dist/core/handlers/PrimitiveHandler.js +127 -0
  41. package/dist/core/handlers/TupleHandler.d.ts +2 -0
  42. package/dist/core/handlers/TupleHandler.js +98 -0
  43. package/dist/core/handlers/TypeHandlerRegistry.d.ts +20 -0
  44. package/dist/core/handlers/TypeHandlerRegistry.js +113 -0
  45. package/dist/core/handlers/UnionTypeHandler.d.ts +2 -0
  46. package/dist/core/handlers/UnionTypeHandler.js +263 -0
  47. package/dist/core/handlers/index.d.ts +2 -0
  48. package/dist/core/handlers/index.js +5 -0
  49. package/dist/core/import-rewrite/services/BuildProfileUpdater.d.ts +8 -0
  50. package/dist/core/import-rewrite/services/BuildProfileUpdater.js +92 -0
  51. package/dist/core/import-rewrite/services/ImportRewriteService.d.ts +9 -0
  52. package/dist/core/import-rewrite/services/ImportRewriteService.js +61 -0
  53. package/dist/core/import-rewrite/services/ImportTransformService.d.ts +15 -0
  54. package/dist/core/import-rewrite/services/ImportTransformService.js +109 -0
  55. package/dist/core/import-rewrite/strategies/ImportScanStrategy.d.ts +17 -0
  56. package/dist/core/import-rewrite/strategies/ImportScanStrategy.js +137 -0
  57. package/dist/core/import-rewrite/types/ImportRewriteTypes.d.ts +17 -0
  58. package/dist/core/import-rewrite/types/ImportRewriteTypes.js +2 -0
  59. package/dist/core/index.d.ts +9 -0
  60. package/dist/core/index.js +27 -0
  61. package/dist/core/interfaces/ITask.d.ts +7 -0
  62. package/dist/core/interfaces/ITask.js +2 -0
  63. package/dist/core/interfaces/ITaskContext.d.ts +11 -0
  64. package/dist/core/interfaces/ITaskContext.js +2 -0
  65. package/dist/core/interfaces/index.d.ts +2 -0
  66. package/dist/core/interfaces/index.js +2 -0
  67. package/dist/core/logger/Logger.d.ts +13 -0
  68. package/dist/core/logger/Logger.js +78 -0
  69. package/dist/core/services/CodeAnalysisService.d.ts +7 -0
  70. package/dist/core/services/CodeAnalysisService.js +43 -0
  71. package/dist/core/services/CodeGenerationEngine.d.ts +12 -0
  72. package/dist/core/services/CodeGenerationEngine.js +102 -0
  73. package/dist/core/services/CodeGenerationService/CodeGenerationService.d.ts +13 -0
  74. package/dist/core/services/CodeGenerationService/CodeGenerationService.js +110 -0
  75. package/dist/core/services/CodeGenerationService/generators/MergedSendableClassGenerator.d.ts +13 -0
  76. package/dist/core/services/CodeGenerationService/generators/MergedSendableClassGenerator.js +119 -0
  77. package/dist/core/services/CodeGenerationService/generators/OriginalClassGenerator.d.ts +21 -0
  78. package/dist/core/services/CodeGenerationService/generators/OriginalClassGenerator.js +224 -0
  79. package/dist/core/services/CodeGenerationService/generators/SendableClassGenerator.d.ts +24 -0
  80. package/dist/core/services/CodeGenerationService/generators/SendableClassGenerator.js +307 -0
  81. package/dist/core/services/CodeGenerationService/generators/SerializerGenerator.d.ts +28 -0
  82. package/dist/core/services/CodeGenerationService/generators/SerializerGenerator.js +259 -0
  83. package/dist/core/services/CodeGenerationService/generators/TempSerializerGenerator.d.ts +19 -0
  84. package/dist/core/services/CodeGenerationService/generators/TempSerializerGenerator.js +178 -0
  85. package/dist/core/services/CodeGenerationService/index.d.ts +1 -0
  86. package/dist/core/services/CodeGenerationService/index.js +5 -0
  87. package/dist/core/services/CodeGenerationService/shared/ImportManager.d.ts +27 -0
  88. package/dist/core/services/CodeGenerationService/shared/ImportManager.js +127 -0
  89. package/dist/core/template/HandlebarsTemplateEngine.d.ts +26 -0
  90. package/dist/core/template/HandlebarsTemplateEngine.js +226 -0
  91. package/dist/core/utils/ConfigManager.d.ts +10 -0
  92. package/dist/core/utils/ConfigManager.js +32 -0
  93. package/dist/core/utils/CustomError.d.ts +30 -0
  94. package/dist/core/utils/CustomError.js +37 -0
  95. package/dist/core/utils/DeepCopyUtil.d.ts +15 -0
  96. package/dist/core/utils/DeepCopyUtil.js +138 -0
  97. package/dist/core/utils/GenericTypeSubstitutionUtil.d.ts +9 -0
  98. package/dist/core/utils/GenericTypeSubstitutionUtil.js +68 -0
  99. package/dist/core/utils/SerializationPathUtil.d.ts +18 -0
  100. package/dist/core/utils/SerializationPathUtil.js +107 -0
  101. package/dist/core/utils/TsMorphUtil.d.ts +8 -0
  102. package/dist/core/utils/TsMorphUtil.js +34 -0
  103. package/dist/index.d.ts +4 -0
  104. package/dist/index.js +57 -0
  105. package/dist/json-plugin/JSONExecuteController.d.ts +13 -0
  106. package/dist/json-plugin/JSONExecuteController.js +103 -0
  107. package/dist/json-plugin/constants/TaskConstants.d.ts +7 -0
  108. package/dist/json-plugin/constants/TaskConstants.js +11 -0
  109. package/dist/json-plugin/interfaces/IModuleContext.d.ts +10 -0
  110. package/dist/json-plugin/interfaces/IModuleContext.js +2 -0
  111. package/dist/json-plugin/interfaces/ITargetContext.d.ts +8 -0
  112. package/dist/json-plugin/interfaces/ITargetContext.js +2 -0
  113. package/dist/json-plugin/interfaces/impl/ModuleContext.d.ts +12 -0
  114. package/dist/json-plugin/interfaces/impl/ModuleContext.js +24 -0
  115. package/dist/json-plugin/interfaces/impl/TargetContext.d.ts +23 -0
  116. package/dist/json-plugin/interfaces/impl/TargetContext.js +113 -0
  117. package/dist/json-plugin/tasks/BaseTask.d.ts +14 -0
  118. package/dist/json-plugin/tasks/BaseTask.js +53 -0
  119. package/dist/json-plugin/tasks/CleanTask.d.ts +8 -0
  120. package/dist/json-plugin/tasks/CleanTask.js +25 -0
  121. package/dist/json-plugin/tasks/CodeProcessingTask.d.ts +8 -0
  122. package/dist/json-plugin/tasks/CodeProcessingTask.js +26 -0
  123. package/dist/json-plugin/tasks/SyncTask.d.ts +8 -0
  124. package/dist/json-plugin/tasks/SyncTask.js +21 -0
  125. package/dist/json-plugin/tasks/WatchTask.d.ts +11 -0
  126. package/dist/json-plugin/tasks/WatchTask.js +102 -0
  127. package/package.json +46 -0
  128. package/src/core/Types.ts +356 -0
  129. package/src/core/analyzers/ClassAnalyzer.ts +824 -0
  130. package/src/core/analyzers/CustomTypeAnalyzer.ts +337 -0
  131. package/src/core/analyzers/SendableMergeChecker.ts +195 -0
  132. package/src/core/analyzers/SendableMergeabilityRegistry.ts +72 -0
  133. package/src/core/constants/DecoratorConstants.ts +27 -0
  134. package/src/core/constants/PathConstants.ts +31 -0
  135. package/src/core/constants/StringConstants.ts +152 -0
  136. package/src/core/constants/index.ts +21 -0
  137. package/src/core/handlers/BaseTypeHandler.ts +121 -0
  138. package/src/core/handlers/CustomClassHandler.ts +278 -0
  139. package/src/core/handlers/DateHandler.ts +75 -0
  140. package/src/core/handlers/DecimalHandler.ts +75 -0
  141. package/src/core/handlers/EnumHandler.ts +142 -0
  142. package/src/core/handlers/GenericContainerHandler.ts +621 -0
  143. package/src/core/handlers/GenericHandler.ts +130 -0
  144. package/src/core/handlers/HandlerBootstrap.ts +64 -0
  145. package/src/core/handlers/ITypeHandler.ts +133 -0
  146. package/src/core/handlers/PrimitiveHandler.ts +159 -0
  147. package/src/core/handlers/TupleHandler.ts +145 -0
  148. package/src/core/handlers/TypeHandlerRegistry.ts +236 -0
  149. package/src/core/handlers/UnionTypeHandler.ts +400 -0
  150. package/src/core/handlers/index.ts +18 -0
  151. package/src/core/import-rewrite/services/BuildProfileUpdater.ts +145 -0
  152. package/src/core/import-rewrite/services/ImportRewriteService.ts +129 -0
  153. package/src/core/import-rewrite/services/ImportTransformService.ts +200 -0
  154. package/src/core/import-rewrite/strategies/ImportScanStrategy.ts +303 -0
  155. package/src/core/import-rewrite/types/ImportRewriteTypes.ts +100 -0
  156. package/src/core/index.ts +31 -0
  157. package/src/core/interfaces/ITask.ts +23 -0
  158. package/src/core/interfaces/ITaskContext.ts +94 -0
  159. package/src/core/interfaces/index.ts +17 -0
  160. package/src/core/logger/Logger.ts +149 -0
  161. package/src/core/services/CodeAnalysisService.ts +67 -0
  162. package/src/core/services/CodeGenerationEngine.ts +181 -0
  163. package/src/core/services/CodeGenerationService/CodeGenerationService.ts +159 -0
  164. package/src/core/services/CodeGenerationService/generators/MergedSendableClassGenerator.ts +189 -0
  165. package/src/core/services/CodeGenerationService/generators/OriginalClassGenerator.ts +314 -0
  166. package/src/core/services/CodeGenerationService/generators/SendableClassGenerator.ts +421 -0
  167. package/src/core/services/CodeGenerationService/generators/SerializerGenerator.ts +392 -0
  168. package/src/core/services/CodeGenerationService/generators/TempSerializerGenerator.ts +277 -0
  169. package/src/core/services/CodeGenerationService/index.ts +16 -0
  170. package/src/core/services/CodeGenerationService/shared/ImportManager.ts +191 -0
  171. package/src/core/template/HandlebarsTemplateEngine.ts +282 -0
  172. package/src/core/utils/ConfigManager.ts +49 -0
  173. package/src/core/utils/CustomError.ts +51 -0
  174. package/src/core/utils/DeepCopyUtil.ts +185 -0
  175. package/src/core/utils/GenericTypeSubstitutionUtil.ts +136 -0
  176. package/src/core/utils/SerializationPathUtil.ts +142 -0
  177. package/src/core/utils/TsMorphUtil.ts +50 -0
  178. package/src/index.ts +81 -0
  179. package/src/json-plugin/JSONExecuteController.ts +134 -0
  180. package/src/json-plugin/constants/TaskConstants.ts +22 -0
  181. package/src/json-plugin/interfaces/IModuleContext.ts +27 -0
  182. package/src/json-plugin/interfaces/ITargetContext.ts +25 -0
  183. package/src/json-plugin/interfaces/impl/ModuleContext.ts +45 -0
  184. package/src/json-plugin/interfaces/impl/TargetContext.ts +196 -0
  185. package/src/json-plugin/tasks/BaseTask.ts +94 -0
  186. package/src/json-plugin/tasks/CleanTask.ts +36 -0
  187. package/src/json-plugin/tasks/CodeProcessingTask.ts +41 -0
  188. package/src/json-plugin/tasks/SyncTask.ts +33 -0
  189. package/src/json-plugin/tasks/WatchTask.ts +99 -0
  190. package/template/SerializerPerformanceTemplate.hbs +35 -0
  191. package/template/SerializerRegisterTemplate.hbs +10 -0
  192. package/template/SerializerStrictTemplate.hbs +89 -0
  193. package/template/SerializerTemplate.hbs +176 -0
  194. package/tsconfig.json +17 -0
  195. package/tslint.json +3 -0
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseTypeHandler = void 0;
4
+ const Types_1 = require("../Types");
5
+ class BaseTypeHandler {
6
+ getSerializerName() {
7
+ return `${this.getTypeName()}Serializer`;
8
+ }
9
+ getTypeName() {
10
+ return this.capitalize(this.kind);
11
+ }
12
+ capitalize(str) {
13
+ return str.charAt(0).toUpperCase() + str.slice(1);
14
+ }
15
+ applyWithParam(withParam, defaultInstantiation, structure) {
16
+ if (!withParam) {
17
+ return defaultInstantiation;
18
+ }
19
+ if (this.containsGenericType(structure)) {
20
+ return `new WithEntrySerializer(${withParam}, [${this.generateTypeKeySerializers(structure)}])`;
21
+ }
22
+ else {
23
+ return `new WithEntryContextualSerializer(${withParam}, [${this.generateTypeKeys(structure)}])`;
24
+ }
25
+ }
26
+ containsGenericType(structure) {
27
+ if (structure.kind === Types_1.PropertyKind.GENERIC) {
28
+ return true;
29
+ }
30
+ if (structure.args && structure.args.length > 0) {
31
+ return structure.args.some(arg => this.containsGenericType(arg));
32
+ }
33
+ if (structure.unionDetails && structure.unionDetails.length > 0) {
34
+ return structure.unionDetails.some(member => this.containsGenericType(member));
35
+ }
36
+ return false;
37
+ }
38
+ generateTypeKeySerializers(structure) {
39
+ if (structure.args && structure.args.length > 0) {
40
+ const { TypeHandlerRegistry } = require('./TypeHandlerRegistry');
41
+ return structure.args.map((arg) => {
42
+ return TypeHandlerRegistry.getInstance().generateInstantiation(arg);
43
+ }).join(',\n');
44
+ }
45
+ return '';
46
+ }
47
+ generateTypeKeys(structure) {
48
+ if (structure.args && structure.args.length > 0) {
49
+ const { TypeHandlerRegistry } = require('./TypeHandlerRegistry');
50
+ return structure.args.map(arg => {
51
+ return TypeHandlerRegistry.getInstance().generateTypeKey(arg);
52
+ }).join(', ');
53
+ }
54
+ return '';
55
+ }
56
+ }
57
+ exports.BaseTypeHandler = BaseTypeHandler;
@@ -0,0 +1,21 @@
1
+ import { TypeNode } from 'ts-morph';
2
+ import { BaseTypeHandler } from './BaseTypeHandler';
3
+ import { ITypeHandler, TypeContext, ConversionDirection } from './ITypeHandler';
4
+ import { PropertyKind, TypeStructure, SerializerMetadata } from '../Types';
5
+ export declare class CustomClassHandler extends BaseTypeHandler implements ITypeHandler {
6
+ readonly name = "CustomClassHandler";
7
+ readonly kind = PropertyKind.OBJECT;
8
+ readonly priority = 10;
9
+ matches(typeNode: TypeNode): boolean;
10
+ parse(typeNode: TypeNode, context: TypeContext): TypeStructure;
11
+ private parseGenericArguments;
12
+ private handleMissingTypeDependency;
13
+ private handleTypeAlias;
14
+ getSerializerMetadata(structure: TypeStructure, withParam?: string): SerializerMetadata;
15
+ generateInstantiation(structure: TypeStructure): string;
16
+ generateTypeDeclaration(structure: TypeStructure, withParam?: string): string;
17
+ generateTypeKey(structure: TypeStructure): string;
18
+ generateSendableTypeDeclaration(structure: TypeStructure): string;
19
+ generatePropertyConversion(structure: TypeStructure, sourceValue: string, direction: ConversionDirection): string;
20
+ }
21
+ export declare function createCustomClassHandler(): ITypeHandler;
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CustomClassHandler = void 0;
4
+ exports.createCustomClassHandler = createCustomClassHandler;
5
+ const ts_morph_1 = require("ts-morph");
6
+ const BaseTypeHandler_1 = require("./BaseTypeHandler");
7
+ const ITypeHandler_1 = require("./ITypeHandler");
8
+ const Types_1 = require("../Types");
9
+ const CustomTypeAnalyzer_1 = require("../analyzers/CustomTypeAnalyzer");
10
+ const ClassAnalyzer_1 = require("../analyzers/ClassAnalyzer");
11
+ const CustomError_1 = require("../utils/CustomError");
12
+ class CustomClassHandler extends BaseTypeHandler_1.BaseTypeHandler {
13
+ constructor() {
14
+ super(...arguments);
15
+ this.name = 'CustomClassHandler';
16
+ this.kind = Types_1.PropertyKind.OBJECT;
17
+ this.priority = 10;
18
+ }
19
+ matches(typeNode) {
20
+ return typeNode.getKind() === ts_morph_1.SyntaxKind.TypeReference;
21
+ }
22
+ parse(typeNode, context) {
23
+ const typeRef = typeNode;
24
+ const customTypeName = typeRef.getTypeName().getText();
25
+ const typeArgs = typeRef.getTypeArguments();
26
+ const { dependencies, parsedArgs } = this.parseGenericArguments(typeArgs, context);
27
+ const typeDependency = CustomTypeAnalyzer_1.CustomTypeAnalyzer.getInstance()
28
+ .findDefinition(customTypeName, typeRef.getSourceFile());
29
+ if (!typeDependency) {
30
+ return this.handleMissingTypeDependency(customTypeName);
31
+ }
32
+ if (typeDependency.typeKind === Types_1.TypeKind.TYPE) {
33
+ return this.handleTypeAlias(typeDependency, typeNode);
34
+ }
35
+ const maxArgDepth = parsedArgs.length > 0
36
+ ? Math.max(...parsedArgs.map(arg => arg.depth))
37
+ : 0;
38
+ if (typeDependency.typeKind === Types_1.TypeKind.INTERFACE) {
39
+ return {
40
+ kind: this.kind,
41
+ depth: parsedArgs.length > 0 ? 1 + maxArgDepth : 0,
42
+ sourceText: typeNode.getText(),
43
+ interfaceDetails: typeDependency.details,
44
+ args: parsedArgs,
45
+ dependencies: [typeDependency, ...dependencies]
46
+ };
47
+ }
48
+ else if (typeDependency.typeKind === Types_1.TypeKind.CLASS) {
49
+ return {
50
+ kind: this.kind,
51
+ depth: parsedArgs.length > 0 ? 1 + maxArgDepth : 0,
52
+ sourceText: typeNode.getText(),
53
+ classDetails: typeDependency.details,
54
+ args: parsedArgs,
55
+ dependencies: [typeDependency, ...dependencies]
56
+ };
57
+ }
58
+ else {
59
+ return {
60
+ kind: Types_1.PropertyKind.UNKNOWN,
61
+ depth: 0,
62
+ sourceText: customTypeName,
63
+ args: [],
64
+ dependencies: []
65
+ };
66
+ }
67
+ }
68
+ parseGenericArguments(typeArgs, context) {
69
+ const dependencies = [];
70
+ const parsedArgs = typeArgs.map(arg => {
71
+ const { TypeHandlerRegistry } = require('./TypeHandlerRegistry');
72
+ const argStructure = TypeHandlerRegistry.getInstance().parseType(arg, {
73
+ ...context,
74
+ depth: context.depth + 1
75
+ });
76
+ dependencies.push(...argStructure.dependencies);
77
+ return argStructure;
78
+ });
79
+ return { dependencies, parsedArgs };
80
+ }
81
+ handleMissingTypeDependency(customTypeName) {
82
+ return {
83
+ kind: Types_1.PropertyKind.UNKNOWN,
84
+ depth: 0,
85
+ sourceText: customTypeName,
86
+ args: [],
87
+ dependencies: []
88
+ };
89
+ }
90
+ handleTypeAlias(typeDependency, typeNode) {
91
+ const typeAliasDetails = typeDependency.details;
92
+ return {
93
+ ...typeAliasDetails.resolvedType,
94
+ sourceText: typeNode.getText(),
95
+ dependencies: [typeDependency, ...typeAliasDetails.resolvedType.dependencies]
96
+ };
97
+ }
98
+ getSerializerMetadata(structure, withParam) {
99
+ const serializerName = `${structure.sourceText}Serializer`;
100
+ const defaultInstantiation = this.generateInstantiation(structure);
101
+ return {
102
+ name: serializerName,
103
+ typeDeclaration: this.generateTypeDeclaration(structure, withParam),
104
+ instantiationTemplate: this.applyWithParam(withParam, defaultInstantiation, structure),
105
+ encodeMethod: 'encodeSerializableElement',
106
+ decodeMethod: 'deserialize',
107
+ decoderType: `${structure.sourceText} | undefined`,
108
+ needsTypeAssertion: false
109
+ };
110
+ }
111
+ generateInstantiation(structure) {
112
+ if (structure.args && structure.args.length > 0) {
113
+ const typeName = structure.sourceText.slice(0, structure.sourceText.indexOf('<'));
114
+ const argsSerializers = structure.args.map(arg => {
115
+ const { TypeHandlerRegistry } = require('./TypeHandlerRegistry');
116
+ const handler = TypeHandlerRegistry.getInstance().getHandlerForKind(arg.kind);
117
+ return handler.generateInstantiation(arg);
118
+ });
119
+ return `new ${typeName}SerializerFactory().getSerializer(${argsSerializers.join(', ')})`;
120
+ }
121
+ const typeName = structure.sourceText;
122
+ return `${typeName}Serializer.INSTANCE`;
123
+ }
124
+ generateTypeDeclaration(structure, withParam) {
125
+ if (structure.args && structure.args.length > 0) {
126
+ return `Serializer<${structure.sourceText}>`;
127
+ }
128
+ if (withParam) {
129
+ return `Serializer<${structure.sourceText}>`;
130
+ }
131
+ return `${structure.sourceText}Serializer`;
132
+ }
133
+ generateTypeKey(structure) {
134
+ if (structure.args && structure.args.length > 0) {
135
+ const classKey = structure.sourceText.slice(0, structure.sourceText.indexOf('<'));
136
+ const genericKeys = structure.args.map(arg => {
137
+ const { TypeHandlerRegistry } = require('./TypeHandlerRegistry');
138
+ const handler = TypeHandlerRegistry.getInstance().getHandlerForKind(arg.kind);
139
+ return handler.generateTypeKey(arg);
140
+ });
141
+ return `{ classKey: '${classKey}', genericTypes: [${genericKeys.join(', ')}] }`;
142
+ }
143
+ return structure.sourceText;
144
+ }
145
+ generateSendableTypeDeclaration(structure) {
146
+ const classDetails = structure.classDetails;
147
+ if (!classDetails || !classDetails.classDecl) {
148
+ return structure.sourceText;
149
+ }
150
+ const classAnalysis = ClassAnalyzer_1.ClassAnalyzer.analyzeClass(classDetails.classDecl);
151
+ if (classAnalysis.decorators.serializable?.generateSendable) {
152
+ const typeName = structure.sourceText;
153
+ if (structure.args && structure.args.length > 0) {
154
+ const className = typeName.slice(0, typeName.indexOf('<'));
155
+ const genericPart = typeName.slice(typeName.indexOf('<'));
156
+ return `Sendable${className}${genericPart}`;
157
+ }
158
+ else {
159
+ return `Sendable${typeName}`;
160
+ }
161
+ }
162
+ if (classDetails.classDecl.getDecorator('Sendable')) {
163
+ return structure.sourceText;
164
+ }
165
+ else {
166
+ throw new CustomError_1.CustomError(`Type ${classDetails.classDecl.getName()} is not sendable.
167
+ please add @Sendable or @Serializable({ generateSendable: true })`, CustomError_1.ErrorCodes.NOT_SENDABLE);
168
+ }
169
+ return structure.sourceText;
170
+ }
171
+ generatePropertyConversion(structure, sourceValue, direction) {
172
+ const classDetails = structure.classDetails;
173
+ if (!classDetails || !classDetails.classDecl) {
174
+ return sourceValue;
175
+ }
176
+ const classAnalysis = ClassAnalyzer_1.ClassAnalyzer.analyzeClass(classDetails.classDecl);
177
+ if (classAnalysis.decorators.serializable?.generateSendable) {
178
+ if (direction === ITypeHandler_1.ConversionDirection.TO_SENDABLE) {
179
+ return `${sourceValue}.toSendable()`;
180
+ }
181
+ else {
182
+ return `${sourceValue}.toOrigin()`;
183
+ }
184
+ }
185
+ return sourceValue;
186
+ }
187
+ }
188
+ exports.CustomClassHandler = CustomClassHandler;
189
+ function createCustomClassHandler() {
190
+ return new CustomClassHandler();
191
+ }
@@ -0,0 +1,2 @@
1
+ import { ITypeHandler } from './ITypeHandler';
2
+ export declare function createDateHandler(): ITypeHandler;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createDateHandler = createDateHandler;
4
+ const ts_morph_1 = require("ts-morph");
5
+ const Types_1 = require("../Types");
6
+ const BaseTypeHandler_1 = require("./BaseTypeHandler");
7
+ class DateHandler extends BaseTypeHandler_1.BaseTypeHandler {
8
+ constructor() {
9
+ super(...arguments);
10
+ this.name = 'DateHandler';
11
+ this.kind = Types_1.PropertyKind.Date;
12
+ this.priority = 95;
13
+ }
14
+ matches(typeNode, context) {
15
+ if (typeNode.getKind() === ts_morph_1.SyntaxKind.TypeReference) {
16
+ const typeRef = typeNode;
17
+ const refName = typeRef.getTypeName().getText();
18
+ return refName === 'Date';
19
+ }
20
+ return false;
21
+ }
22
+ parse(typeNode, context) {
23
+ return {
24
+ kind: Types_1.PropertyKind.Date,
25
+ depth: 0,
26
+ sourceText: typeNode.getText(),
27
+ args: [],
28
+ dependencies: []
29
+ };
30
+ }
31
+ getSerializerMetadata(structure, withParam) {
32
+ return {
33
+ name: 'DateSerializer',
34
+ typeDeclaration: 'DateSerializer',
35
+ instantiationTemplate: 'DateSerializer.INSTANCE',
36
+ encodeMethod: 'encodeSerializableElement',
37
+ decodeMethod: 'deserialize',
38
+ decoderType: 'Date | undefined',
39
+ needsTypeAssertion: false
40
+ };
41
+ }
42
+ generateInstantiation(structure) {
43
+ return 'DateSerializer.INSTANCE';
44
+ }
45
+ generateTypeDeclaration(structure) {
46
+ return 'DateSerializer';
47
+ }
48
+ generateTypeKey(structure) {
49
+ return structure.sourceText;
50
+ }
51
+ generateSendableTypeDeclaration(structure) {
52
+ return structure.sourceText;
53
+ }
54
+ generatePropertyConversion(structure, sourceValue, direction) {
55
+ return sourceValue;
56
+ }
57
+ }
58
+ function createDateHandler() {
59
+ return new DateHandler();
60
+ }
@@ -0,0 +1,2 @@
1
+ import { ITypeHandler } from './ITypeHandler';
2
+ export declare function createDecimalHandler(): ITypeHandler;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createDecimalHandler = createDecimalHandler;
4
+ const ts_morph_1 = require("ts-morph");
5
+ const Types_1 = require("../Types");
6
+ const BaseTypeHandler_1 = require("./BaseTypeHandler");
7
+ class DecimalHandler extends BaseTypeHandler_1.BaseTypeHandler {
8
+ constructor() {
9
+ super(...arguments);
10
+ this.name = 'DecimalHandler';
11
+ this.kind = Types_1.PropertyKind.Decimal;
12
+ this.priority = 95;
13
+ }
14
+ matches(typeNode, context) {
15
+ if (typeNode.getKind() === ts_morph_1.SyntaxKind.TypeReference) {
16
+ const typeRef = typeNode;
17
+ const refName = typeRef.getTypeName().getText();
18
+ return refName === 'Decimal';
19
+ }
20
+ return false;
21
+ }
22
+ parse(typeNode, context) {
23
+ return {
24
+ kind: Types_1.PropertyKind.Decimal,
25
+ depth: 0,
26
+ sourceText: typeNode.getText(),
27
+ args: [],
28
+ dependencies: []
29
+ };
30
+ }
31
+ getSerializerMetadata(structure, withParam) {
32
+ return {
33
+ name: 'DecimalSerializer',
34
+ typeDeclaration: 'DecimalSerializer',
35
+ instantiationTemplate: 'DecimalSerializer.INSTANCE',
36
+ encodeMethod: 'encodeSerializableElement',
37
+ decodeMethod: 'deserialize',
38
+ decoderType: 'Decimal | undefined',
39
+ needsTypeAssertion: false
40
+ };
41
+ }
42
+ generateInstantiation(structure) {
43
+ return 'DecimalSerializer.INSTANCE';
44
+ }
45
+ generateTypeDeclaration(structure) {
46
+ return 'DecimalSerializer';
47
+ }
48
+ generateTypeKey(structure) {
49
+ return structure.sourceText;
50
+ }
51
+ generateSendableTypeDeclaration(structure) {
52
+ return structure.sourceText;
53
+ }
54
+ generatePropertyConversion(structure, sourceValue, direction) {
55
+ return sourceValue;
56
+ }
57
+ }
58
+ function createDecimalHandler() {
59
+ return new DecimalHandler();
60
+ }
@@ -0,0 +1,2 @@
1
+ import { ITypeHandler } from './ITypeHandler';
2
+ export declare function createEnumHandler(): ITypeHandler;
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createEnumHandler = createEnumHandler;
4
+ const ts_morph_1 = require("ts-morph");
5
+ const Types_1 = require("../Types");
6
+ const CustomTypeAnalyzer_1 = require("../analyzers/CustomTypeAnalyzer");
7
+ const BaseTypeHandler_1 = require("./BaseTypeHandler");
8
+ const CustomError_1 = require("../utils/CustomError");
9
+ class EnumHandler extends BaseTypeHandler_1.BaseTypeHandler {
10
+ constructor() {
11
+ super(...arguments);
12
+ this.name = 'EnumHandler';
13
+ this.kind = Types_1.PropertyKind.ENUM;
14
+ this.priority = 95;
15
+ }
16
+ matches(typeNode) {
17
+ if (typeNode.getKind() !== ts_morph_1.SyntaxKind.TypeReference) {
18
+ return false;
19
+ }
20
+ const typeRef = typeNode;
21
+ const customTypeName = typeRef.getTypeName().getText();
22
+ const typeDependency = CustomTypeAnalyzer_1.CustomTypeAnalyzer.getInstance()
23
+ .findDefinition(customTypeName, typeRef.getSourceFile());
24
+ return typeDependency?.typeKind === Types_1.TypeKind.ENUM;
25
+ }
26
+ parse(typeNode) {
27
+ const typeRef = typeNode;
28
+ const enumName = typeRef.getTypeName().getText();
29
+ const typeDependency = CustomTypeAnalyzer_1.CustomTypeAnalyzer.getInstance()
30
+ .findDefinition(enumName, typeRef.getSourceFile());
31
+ if (!typeDependency || typeDependency.typeKind !== Types_1.TypeKind.ENUM) {
32
+ throw new CustomError_1.CustomError(`Not an enum type: ${enumName}`, CustomError_1.ErrorCodes.IS_NOT_ENUM);
33
+ }
34
+ const enumDetails = typeDependency.details;
35
+ return {
36
+ kind: Types_1.PropertyKind.ENUM,
37
+ depth: 0,
38
+ sourceText: enumName,
39
+ args: [],
40
+ enumDetails: enumDetails,
41
+ dependencies: [typeDependency]
42
+ };
43
+ }
44
+ getSerializerMetadata(structure, withParam) {
45
+ if (!structure.enumDetails) {
46
+ throw new CustomError_1.CustomError('EnumHandler: missing enumDetails in structure', CustomError_1.ErrorCodes.ENUM_STRUCTURE_NOT_FOUND);
47
+ }
48
+ const enumName = structure.sourceText;
49
+ const valueType = structure.enumDetails.valueType;
50
+ const defaultInstantiation = this.generateInstantiation(structure);
51
+ return {
52
+ name: 'EnumSerializer',
53
+ typeDeclaration: this.generateTypeDeclaration(structure),
54
+ instantiationTemplate: this.applyWithParam(withParam, defaultInstantiation, structure),
55
+ encodeMethod: 'encodeSerializableElement',
56
+ decodeMethod: 'deserialize',
57
+ decoderType: `${enumName} | undefined`,
58
+ needsTypeAssertion: valueType === 'string'
59
+ };
60
+ }
61
+ generateInstantiation(structure) {
62
+ if (!structure.enumDetails) {
63
+ throw new CustomError_1.CustomError('EnumHandler: missing enumDetails for instantiation', CustomError_1.ErrorCodes.ENUM_STRUCTURE_NOT_FOUND);
64
+ }
65
+ const enumType = structure.enumDetails.valueType;
66
+ const enumName = `'${structure.sourceText}'`;
67
+ const enumMembers = structure.enumDetails.members.map(member => `['${member.name}', ${member.literalValue}]`).join(', ');
68
+ return `new EnumSerializer<${enumType}>(${enumName}, [${enumMembers}])`;
69
+ }
70
+ generateTypeDeclaration(structure) {
71
+ if (!structure.enumDetails) {
72
+ throw new CustomError_1.CustomError('EnumHandler: missing enumDetails for type declaration', CustomError_1.ErrorCodes.ENUM_STRUCTURE_NOT_FOUND);
73
+ }
74
+ const valueType = structure.enumDetails.valueType;
75
+ return `EnumSerializer<${valueType}>`;
76
+ }
77
+ generateTypeKey(structure) {
78
+ return structure.sourceText;
79
+ }
80
+ generateSendableTypeDeclaration(structure) {
81
+ return structure.sourceText;
82
+ }
83
+ generatePropertyConversion(_structure, sourceValue) {
84
+ return sourceValue;
85
+ }
86
+ }
87
+ function createEnumHandler() {
88
+ return new EnumHandler();
89
+ }
@@ -0,0 +1,2 @@
1
+ import { ITypeHandler } from './ITypeHandler';
2
+ export declare function createGenericContainerHandlers(): ITypeHandler[];