@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,440 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createGenericContainerHandlers = createGenericContainerHandlers;
4
+ const ts_morph_1 = require("ts-morph");
5
+ const Types_1 = require("../Types");
6
+ const ITypeHandler_1 = require("./ITypeHandler");
7
+ const BaseTypeHandler_1 = require("./BaseTypeHandler");
8
+ const CustomError_1 = require("../utils/CustomError");
9
+ const Logger_1 = require("../logger/Logger");
10
+ class GenericContainerHandler extends BaseTypeHandler_1.BaseTypeHandler {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.priority = 90;
14
+ }
15
+ matches(typeNode) {
16
+ const syntaxKind = typeNode.getKind();
17
+ if (syntaxKind === ts_morph_1.SyntaxKind.ArrayType) {
18
+ return this.kind === Types_1.PropertyKind.ARRAY;
19
+ }
20
+ if (syntaxKind === ts_morph_1.SyntaxKind.TypeReference) {
21
+ const typeRef = typeNode;
22
+ const refName = typeRef.getTypeName().getText();
23
+ return this.typeNames.includes(refName);
24
+ }
25
+ return false;
26
+ }
27
+ parse(typeNode, context) {
28
+ const syntaxKind = typeNode.getKind();
29
+ if (syntaxKind === ts_morph_1.SyntaxKind.ArrayType) {
30
+ return this.parseArrayLiteral(typeNode, context);
31
+ }
32
+ if (syntaxKind === ts_morph_1.SyntaxKind.TypeReference) {
33
+ return this.parseGenericType(typeNode, context);
34
+ }
35
+ throw new CustomError_1.CustomError(`Unexpected syntax kind for ${this.name}: ${syntaxKind}`, CustomError_1.ErrorCodes.UNEXPECTED_GENERIC);
36
+ }
37
+ parseArrayLiteral(typeNode, context) {
38
+ const elementTypeNode = typeNode.getElementTypeNode();
39
+ Logger_1.Logger.debug('GenericHandler.parseArrayLiteral', typeNode.getText(), elementTypeNode.getText(), elementTypeNode.getKind());
40
+ const { TypeHandlerRegistry } = require('./TypeHandlerRegistry');
41
+ const elementType = TypeHandlerRegistry.getInstance().parseType(elementTypeNode, {
42
+ ...context,
43
+ depth: context.depth + 1
44
+ });
45
+ return {
46
+ kind: this.kind,
47
+ depth: context.depth,
48
+ sourceText: typeNode.getText(),
49
+ args: [elementType],
50
+ dependencies: elementType.dependencies
51
+ };
52
+ }
53
+ parseGenericType(typeNode, context) {
54
+ const typeArgs = typeNode.getTypeArguments();
55
+ if (typeArgs.length !== this.argsCount) {
56
+ throw new CustomError_1.CustomError(`${this.name} expects ${this.argsCount} type argument(s), got ${typeArgs.length}`, CustomError_1.ErrorCodes.GENERIC_NOT_MATCH);
57
+ }
58
+ const allDependencies = [];
59
+ const parsedArgs = typeArgs.map((argNode) => {
60
+ const { TypeHandlerRegistry } = require('./TypeHandlerRegistry');
61
+ Logger_1.Logger.debug(`[GenericContainerHandler] parse: ${typeNode.getText()} -> ${typeNode.getKind()}`);
62
+ const argStructure = TypeHandlerRegistry.getInstance().parseType(argNode, {
63
+ ...context,
64
+ depth: context.depth + 1
65
+ });
66
+ allDependencies.push(...argStructure.dependencies);
67
+ return argStructure;
68
+ });
69
+ return {
70
+ kind: this.kind,
71
+ depth: context.depth,
72
+ sourceText: typeNode.getText(),
73
+ args: parsedArgs,
74
+ dependencies: allDependencies
75
+ };
76
+ }
77
+ getSerializerMetadata(structure, withParam) {
78
+ const serializerName = this.getSerializerName();
79
+ const defaultInstantiation = this.generateInstantiation(structure);
80
+ return {
81
+ name: serializerName,
82
+ typeDeclaration: this.generateTypeDeclaration(structure),
83
+ instantiationTemplate: this.applyWithParam(withParam, defaultInstantiation, structure),
84
+ encodeMethod: 'encodeSerializableElement',
85
+ decodeMethod: 'deserialize',
86
+ decoderType: `${structure.sourceText} | undefined`,
87
+ needsTypeAssertion: false
88
+ };
89
+ }
90
+ generateInstantiation(structure) {
91
+ if (!structure.args || structure.args.length !== this.argsCount) {
92
+ throw new CustomError_1.CustomError(`${this.name}: expected ${this.argsCount} type argument(s), got ${structure.args?.length || 0}`, CustomError_1.ErrorCodes.GENERIC_NOT_MATCH);
93
+ }
94
+ if (this.argsCount === 1) {
95
+ return this.generateSingleArgInstantiation(structure);
96
+ }
97
+ else {
98
+ return this.generateDoubleArgInstantiation(structure);
99
+ }
100
+ }
101
+ generateTypeDeclaration(structure) {
102
+ if (!structure.args || structure.args.length !== this.argsCount) {
103
+ throw new CustomError_1.CustomError(`${this.name}: expected ${this.argsCount} type argument(s), got ${structure.args?.length || 0}`, CustomError_1.ErrorCodes.GENERIC_NOT_MATCH);
104
+ }
105
+ if (this.argsCount === 1) {
106
+ return this.generateSingleArgTypeDeclaration(structure);
107
+ }
108
+ else {
109
+ return this.generateDoubleArgTypeDeclaration(structure);
110
+ }
111
+ }
112
+ generateTypeKey() {
113
+ return this.getTypeKeyString();
114
+ }
115
+ generateSingleArgInstantiation(structure) {
116
+ Logger_1.Logger.info('generateSingleArgInstantiation: sourceText: %s, kind: %s, args: sourceText %s, kind: %s', structure.sourceText, structure.kind, structure.args.map((arg) => arg.sourceText).join(','), structure.args.map((arg) => arg.kind).join(','));
117
+ const serializerName = this.getSerializerName();
118
+ const elementType = structure.args[0];
119
+ const { TypeHandlerRegistry } = require('./TypeHandlerRegistry');
120
+ const elementHandler = TypeHandlerRegistry.getInstance().getHandlerForKind(elementType.kind);
121
+ const elementSerializer = elementHandler.generateInstantiation(elementType);
122
+ return `new ${serializerName}<${elementType.sourceText}>(${elementSerializer})`;
123
+ }
124
+ generateDoubleArgInstantiation(structure) {
125
+ Logger_1.Logger.info('generateDoubleArgInstantiation:', structure.sourceText, structure.kind, structure.args.join(','));
126
+ const serializerName = this.getSerializerName();
127
+ const keyType = structure.args[0];
128
+ const valueType = structure.args[1];
129
+ const { TypeHandlerRegistry } = require('./TypeHandlerRegistry');
130
+ const keyHandler = TypeHandlerRegistry.getInstance().getHandlerForKind(keyType.kind);
131
+ const valueHandler = TypeHandlerRegistry.getInstance().getHandlerForKind(valueType.kind);
132
+ const keySerializer = keyHandler.generateInstantiation(keyType);
133
+ const valueSerializer = valueHandler.generateInstantiation(valueType);
134
+ return `new ${serializerName}<${keyType.sourceText}, ${valueType.sourceText}>(${keySerializer}, ${valueSerializer})`;
135
+ }
136
+ generateSingleArgTypeDeclaration(structure) {
137
+ const elementType = structure.args[0];
138
+ const serializerName = this.getSerializerName();
139
+ return `${serializerName}<${elementType.sourceText}>`;
140
+ }
141
+ generateDoubleArgTypeDeclaration(structure) {
142
+ const keyType = structure.args[0];
143
+ const valueType = structure.args[1];
144
+ const serializerName = this.getSerializerName();
145
+ return `${serializerName}<${keyType.sourceText}, ${valueType.sourceText}>`;
146
+ }
147
+ generateSendableTypeDeclaration(structure) {
148
+ if (!structure.args || structure.args.length !== this.argsCount) {
149
+ throw new CustomError_1.CustomError(`${this.name}: expected ${this.argsCount} type argument(s), got ${structure.args?.length || 0}`, CustomError_1.ErrorCodes.GENERIC_NOT_MATCH);
150
+ }
151
+ const registry = require('./TypeHandlerRegistry').TypeHandlerRegistry.getInstance();
152
+ if (this.argsCount === 1) {
153
+ const elementType = structure.args[0];
154
+ const elementHandler = registry.getHandlerForKind(elementType.kind);
155
+ const sendableElementType = elementHandler.generateSendableTypeDeclaration(elementType);
156
+ return `${this.getSendableContainerName()}<${sendableElementType}>`;
157
+ }
158
+ else {
159
+ const keyType = structure.args[0];
160
+ const valueType = structure.args[1];
161
+ const keyHandler = registry.getHandlerForKind(keyType.kind);
162
+ const valueHandler = registry.getHandlerForKind(valueType.kind);
163
+ const sendableKeyType = keyHandler.generateSendableTypeDeclaration(keyType);
164
+ const sendableValueType = valueHandler.generateSendableTypeDeclaration(valueType);
165
+ return `${this.getSendableContainerName()}<${sendableKeyType}, ${sendableValueType}>`;
166
+ }
167
+ }
168
+ generatePropertyConversion(_structure, sourceValue, direction) {
169
+ if (direction === ITypeHandler_1.ConversionDirection.TO_SENDABLE) {
170
+ return this.generateToSendableConversion(sourceValue);
171
+ }
172
+ else {
173
+ return this.generateToOriginConversion(sourceValue);
174
+ }
175
+ }
176
+ generateToSendableConversion(sourceValue) {
177
+ const sendableContainer = this.getSendableContainerName();
178
+ if (this.argsCount === 1) {
179
+ return `new ${sendableContainer}(...${sourceValue})`;
180
+ }
181
+ else {
182
+ return `new ${sendableContainer}(${sourceValue}.entries())`;
183
+ }
184
+ }
185
+ generateToOriginConversion(sourceValue) {
186
+ const originContainer = this.getOriginContainerName();
187
+ if (this.argsCount === 1) {
188
+ return `new ${originContainer}(...${sourceValue})`;
189
+ }
190
+ else {
191
+ return `new ${originContainer}(${sourceValue}.entries())`;
192
+ }
193
+ }
194
+ }
195
+ class ArrayHandler extends GenericContainerHandler {
196
+ constructor() {
197
+ super(...arguments);
198
+ this.name = 'ArrayHandler';
199
+ this.kind = Types_1.PropertyKind.ARRAY;
200
+ this.typeNames = ['Array'];
201
+ this.argsCount = 1;
202
+ }
203
+ getTypeKeyString() {
204
+ return `'array'`;
205
+ }
206
+ getSerializerName() {
207
+ return 'ArraySerializer';
208
+ }
209
+ getSendableContainerName() {
210
+ return 'collections.Array';
211
+ }
212
+ getOriginContainerName() {
213
+ return 'Array';
214
+ }
215
+ }
216
+ class MapHandler extends GenericContainerHandler {
217
+ constructor() {
218
+ super(...arguments);
219
+ this.name = 'MapHandler';
220
+ this.kind = Types_1.PropertyKind.MAP;
221
+ this.typeNames = ['Map'];
222
+ this.argsCount = 2;
223
+ }
224
+ getTypeKeyString() {
225
+ return `'map'`;
226
+ }
227
+ getSerializerName() {
228
+ return 'MapSerializer';
229
+ }
230
+ getSendableContainerName() {
231
+ return 'collections.Map';
232
+ }
233
+ getOriginContainerName() {
234
+ return 'Map';
235
+ }
236
+ }
237
+ class SetHandler extends GenericContainerHandler {
238
+ constructor() {
239
+ super(...arguments);
240
+ this.name = 'SetHandler';
241
+ this.kind = Types_1.PropertyKind.SET;
242
+ this.typeNames = ['Set'];
243
+ this.argsCount = 1;
244
+ }
245
+ getTypeKeyString() {
246
+ return `'set'`;
247
+ }
248
+ getSerializerName() {
249
+ return 'SetSerializer';
250
+ }
251
+ getSendableContainerName() {
252
+ return 'collections.Set';
253
+ }
254
+ getOriginContainerName() {
255
+ return 'Set';
256
+ }
257
+ }
258
+ class RecordHandler extends GenericContainerHandler {
259
+ constructor() {
260
+ super(...arguments);
261
+ this.name = 'RecordHandler';
262
+ this.kind = Types_1.PropertyKind.RECORD;
263
+ this.typeNames = ['Record'];
264
+ this.argsCount = 2;
265
+ }
266
+ getTypeKeyString() {
267
+ return `'map'`;
268
+ }
269
+ getSerializerName() {
270
+ return 'RecordSerializer';
271
+ }
272
+ getSendableContainerName() {
273
+ return 'collections.Map';
274
+ }
275
+ getOriginContainerName() {
276
+ return 'Map';
277
+ }
278
+ }
279
+ class CollectionsArrayHandler extends GenericContainerHandler {
280
+ constructor() {
281
+ super(...arguments);
282
+ this.name = 'CollectionsArrayHandler';
283
+ this.kind = Types_1.PropertyKind.COLLECTIONS_ARRAY;
284
+ this.typeNames = ['collections.Array'];
285
+ this.argsCount = 1;
286
+ }
287
+ getTypeKeyString() {
288
+ return `'array'`;
289
+ }
290
+ getSerializerName() {
291
+ return 'CollectionsArraySerializer';
292
+ }
293
+ getSendableContainerName() {
294
+ return 'collections.Array';
295
+ }
296
+ getOriginContainerName() {
297
+ return 'Array';
298
+ }
299
+ }
300
+ class CollectionsSetHandler extends GenericContainerHandler {
301
+ constructor() {
302
+ super(...arguments);
303
+ this.name = 'CollectionsSetHandler';
304
+ this.kind = Types_1.PropertyKind.COLLECTIONS_SET;
305
+ this.typeNames = ['collections.Set'];
306
+ this.argsCount = 1;
307
+ }
308
+ getTypeKeyString() {
309
+ return `'set'`;
310
+ }
311
+ getSerializerName() {
312
+ return 'CollectionsSetSerializer';
313
+ }
314
+ getSendableContainerName() {
315
+ return 'collections.Set';
316
+ }
317
+ getOriginContainerName() {
318
+ return 'Set';
319
+ }
320
+ }
321
+ class CollectionsMapHandler extends GenericContainerHandler {
322
+ constructor() {
323
+ super(...arguments);
324
+ this.name = 'CollectionsMapHandler';
325
+ this.kind = Types_1.PropertyKind.COLLECTIONS_MAP;
326
+ this.typeNames = ['collections.Map'];
327
+ this.argsCount = 2;
328
+ }
329
+ getTypeKeyString() {
330
+ return `'map'`;
331
+ }
332
+ getSerializerName() {
333
+ return 'CollectionsMapSerializer';
334
+ }
335
+ getSendableContainerName() {
336
+ return 'collections.Map';
337
+ }
338
+ getOriginContainerName() {
339
+ return 'Map';
340
+ }
341
+ }
342
+ class ArrayListHandler extends GenericContainerHandler {
343
+ constructor() {
344
+ super(...arguments);
345
+ this.name = 'ArrayListHandler';
346
+ this.kind = Types_1.PropertyKind.ARRAY_LIST;
347
+ this.typeNames = ['ArrayList'];
348
+ this.argsCount = 1;
349
+ }
350
+ getTypeKeyString() {
351
+ return `'ArrayList'`;
352
+ }
353
+ getSerializerName() {
354
+ return 'ArrayListSerializer';
355
+ }
356
+ getSendableContainerName() {
357
+ throw new CustomError_1.CustomError('toSendable ArrayList type is not supported.', CustomError_1.ErrorCodes.TYPE_NOT_SUPPORT);
358
+ }
359
+ getOriginContainerName() {
360
+ throw new CustomError_1.CustomError('toOrgin ArrayList type is not supported.', CustomError_1.ErrorCodes.TYPE_NOT_SUPPORT);
361
+ }
362
+ }
363
+ class HashMapHandler extends GenericContainerHandler {
364
+ constructor() {
365
+ super(...arguments);
366
+ this.name = 'HashMapHandler';
367
+ this.kind = Types_1.PropertyKind.HASH_MAP;
368
+ this.typeNames = ['HashMap'];
369
+ this.argsCount = 2;
370
+ }
371
+ getTypeKeyString() {
372
+ return `'HashMap'`;
373
+ }
374
+ getSerializerName() {
375
+ return 'HashMapSerializer';
376
+ }
377
+ getSendableContainerName() {
378
+ throw new CustomError_1.CustomError('toSendable HashMap type is not supported.', CustomError_1.ErrorCodes.TYPE_NOT_SUPPORT);
379
+ }
380
+ getOriginContainerName() {
381
+ throw new CustomError_1.CustomError('toOrgin HashMap type is not supported.', CustomError_1.ErrorCodes.TYPE_NOT_SUPPORT);
382
+ }
383
+ }
384
+ class HashSetHandler extends GenericContainerHandler {
385
+ constructor() {
386
+ super(...arguments);
387
+ this.name = 'HashSetHandler';
388
+ this.kind = Types_1.PropertyKind.HASH_SET;
389
+ this.typeNames = ['HashSet'];
390
+ this.argsCount = 1;
391
+ }
392
+ getTypeKeyString() {
393
+ return `'HashSet'`;
394
+ }
395
+ getSerializerName() {
396
+ return 'HashSetSerializer';
397
+ }
398
+ getSendableContainerName() {
399
+ throw new CustomError_1.CustomError('toSendable HashSet type is not supported.', CustomError_1.ErrorCodes.TYPE_NOT_SUPPORT);
400
+ }
401
+ getOriginContainerName() {
402
+ throw new CustomError_1.CustomError('toOrgin HashSet type is not supported.', CustomError_1.ErrorCodes.TYPE_NOT_SUPPORT);
403
+ }
404
+ }
405
+ class ListHandler extends GenericContainerHandler {
406
+ constructor() {
407
+ super(...arguments);
408
+ this.name = 'ListHandler';
409
+ this.kind = Types_1.PropertyKind.LIST;
410
+ this.typeNames = ['List'];
411
+ this.argsCount = 1;
412
+ }
413
+ getTypeKeyString() {
414
+ return `'List'`;
415
+ }
416
+ getSerializerName() {
417
+ return 'ListSerializer';
418
+ }
419
+ getSendableContainerName() {
420
+ throw new CustomError_1.CustomError('toSendable List type is not supported.', CustomError_1.ErrorCodes.TYPE_NOT_SUPPORT);
421
+ }
422
+ getOriginContainerName() {
423
+ throw new CustomError_1.CustomError('toOrgin List type is not supported.', CustomError_1.ErrorCodes.TYPE_NOT_SUPPORT);
424
+ }
425
+ }
426
+ function createGenericContainerHandlers() {
427
+ return [
428
+ new ArrayHandler(),
429
+ new SetHandler(),
430
+ new MapHandler(),
431
+ new RecordHandler(),
432
+ new CollectionsArrayHandler(),
433
+ new CollectionsSetHandler(),
434
+ new CollectionsMapHandler(),
435
+ new ArrayListHandler(),
436
+ new HashMapHandler(),
437
+ new HashSetHandler(),
438
+ new ListHandler()
439
+ ];
440
+ }
@@ -0,0 +1,18 @@
1
+ import { TypeNode } from 'ts-morph';
2
+ import { PropertyKind, TypeStructure, SerializerMetadata } from '../Types';
3
+ import { ITypeHandler, TypeContext, ConversionDirection } from './ITypeHandler';
4
+ import { BaseTypeHandler } from './BaseTypeHandler';
5
+ export declare class GenericHandler extends BaseTypeHandler implements ITypeHandler {
6
+ readonly name = "GenericHandler";
7
+ readonly kind = PropertyKind.GENERIC;
8
+ readonly priority = 95;
9
+ matches(typeNode: TypeNode, context: TypeContext): boolean;
10
+ parse(typeNode: TypeNode): TypeStructure;
11
+ getSerializerMetadata(structure: TypeStructure, withParam?: string): SerializerMetadata;
12
+ generateInstantiation(structure: TypeStructure): string;
13
+ generateTypeDeclaration(structure: TypeStructure): string;
14
+ generateTypeKey(structure: TypeStructure): string;
15
+ generateSendableTypeDeclaration(structure: TypeStructure): string;
16
+ generatePropertyConversion(structure: TypeStructure, sourceValue: string, direction: ConversionDirection): string;
17
+ }
18
+ export declare function createGenericHandler(): ITypeHandler;
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GenericHandler = void 0;
4
+ exports.createGenericHandler = createGenericHandler;
5
+ const ts_morph_1 = require("ts-morph");
6
+ const Types_1 = require("../Types");
7
+ const ITypeHandler_1 = require("./ITypeHandler");
8
+ const BaseTypeHandler_1 = require("./BaseTypeHandler");
9
+ class GenericHandler extends BaseTypeHandler_1.BaseTypeHandler {
10
+ constructor() {
11
+ super(...arguments);
12
+ this.name = 'GenericHandler';
13
+ this.kind = Types_1.PropertyKind.GENERIC;
14
+ this.priority = 95;
15
+ }
16
+ matches(typeNode, context) {
17
+ if (typeNode.getKind() !== ts_morph_1.SyntaxKind.TypeReference) {
18
+ return false;
19
+ }
20
+ const typeRef = typeNode;
21
+ const typeName = typeRef.getTypeName().getText();
22
+ if (typeRef.getTypeArguments().length > 0) {
23
+ return false;
24
+ }
25
+ return context.genericParams.includes(typeName);
26
+ }
27
+ parse(typeNode) {
28
+ const typeRef = typeNode;
29
+ const typeName = typeRef.getTypeName().getText();
30
+ return {
31
+ kind: this.kind,
32
+ depth: 0,
33
+ sourceText: typeName,
34
+ args: [],
35
+ dependencies: []
36
+ };
37
+ }
38
+ getSerializerMetadata(structure, withParam) {
39
+ const defaultInstantiation = this.generateInstantiation(structure);
40
+ return {
41
+ name: 'Serializer',
42
+ typeDeclaration: this.generateTypeDeclaration(structure),
43
+ instantiationTemplate: this.applyWithParam(withParam, defaultInstantiation, structure),
44
+ encodeMethod: 'encodeSerializableElement',
45
+ decodeMethod: 'deserialize',
46
+ decoderType: `${structure.sourceText} | undefined`,
47
+ needsTypeAssertion: false
48
+ };
49
+ }
50
+ generateInstantiation(structure) {
51
+ const typeName = structure.sourceText;
52
+ const lowerName = typeName.toLowerCase();
53
+ return `${lowerName}Serializer`;
54
+ }
55
+ generateTypeDeclaration(structure) {
56
+ const typeName = structure.sourceText;
57
+ return `Serializer<${typeName}>`;
58
+ }
59
+ generateTypeKey(structure) {
60
+ const typeName = structure.sourceText;
61
+ return `'${typeName}'`;
62
+ }
63
+ generateSendableTypeDeclaration(structure) {
64
+ return structure.sourceText;
65
+ }
66
+ generatePropertyConversion(structure, sourceValue, direction) {
67
+ if (direction === ITypeHandler_1.ConversionDirection.TO_SENDABLE) {
68
+ return `((): ${structure.sourceText}${structure.isOptional ? ' | undefined' : ''} => {
69
+ const sendable: ESObject = ${sourceValue};
70
+ if (sendable.toSendable) {
71
+ return sendable.toSendable();
72
+ } else {
73
+ return ${sourceValue}${structure.isOptional ? '' : '!'};
74
+ }
75
+ })()`;
76
+ }
77
+ else {
78
+ return `((): ${structure.sourceText}${structure.isOptional ? ' | undefined' : ''} => {
79
+ const origin: ESObject = ${sourceValue};
80
+ if (origin.toOrigin) {
81
+ return origin.toOrigin();
82
+ } else {
83
+ return ${sourceValue}${structure.isOptional ? '' : '!'};
84
+ }
85
+ })()`;
86
+ }
87
+ }
88
+ }
89
+ exports.GenericHandler = GenericHandler;
90
+ function createGenericHandler() {
91
+ return new GenericHandler();
92
+ }
@@ -0,0 +1,2 @@
1
+ import { TypeHandlerRegistry } from './TypeHandlerRegistry';
2
+ export declare function initializeTypeHandlers(): TypeHandlerRegistry;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.initializeTypeHandlers = initializeTypeHandlers;
4
+ const TypeHandlerRegistry_1 = require("./TypeHandlerRegistry");
5
+ const PrimitiveHandler_1 = require("./PrimitiveHandler");
6
+ const GenericContainerHandler_1 = require("./GenericContainerHandler");
7
+ const UnionTypeHandler_1 = require("./UnionTypeHandler");
8
+ const EnumHandler_1 = require("./EnumHandler");
9
+ const GenericHandler_1 = require("./GenericHandler");
10
+ const CustomClassHandler_1 = require("./CustomClassHandler");
11
+ const TupleHandler_1 = require("./TupleHandler");
12
+ const DateHandler_1 = require("./DateHandler");
13
+ const DecimalHandler_1 = require("./DecimalHandler");
14
+ function initializeTypeHandlers() {
15
+ const registry = TypeHandlerRegistry_1.TypeHandlerRegistry.getInstance();
16
+ registry.registerAll((0, PrimitiveHandler_1.createPrimitiveHandlers)());
17
+ registry.registerAll((0, GenericContainerHandler_1.createGenericContainerHandlers)());
18
+ registry.registerAll((0, UnionTypeHandler_1.createUnionTypeHandlers)());
19
+ registry.register((0, EnumHandler_1.createEnumHandler)());
20
+ registry.register((0, GenericHandler_1.createGenericHandler)());
21
+ registry.register((0, CustomClassHandler_1.createCustomClassHandler)());
22
+ registry.register((0, TupleHandler_1.createTupleTypeHandlers)());
23
+ registry.register((0, DateHandler_1.createDateHandler)());
24
+ registry.registerAll([
25
+ (0, DecimalHandler_1.createDecimalHandler)()
26
+ ]);
27
+ return registry;
28
+ }
@@ -0,0 +1,23 @@
1
+ import { TypeNode } from 'ts-morph';
2
+ import { PropertyKind, SerializerMetadata, TypeStructure } from '..';
3
+ export interface ITypeHandler {
4
+ readonly name: string;
5
+ readonly kind: PropertyKind;
6
+ readonly priority: number;
7
+ matches(typeNode: TypeNode, context: TypeContext): boolean;
8
+ parse(typeNode: TypeNode, context: TypeContext): TypeStructure;
9
+ getSerializerMetadata(structure: TypeStructure, withParam?: string): SerializerMetadata;
10
+ generateInstantiation(structure: TypeStructure): string;
11
+ generateTypeDeclaration(structure: TypeStructure): string;
12
+ generateTypeKey(structure: TypeStructure): string;
13
+ generateSendableTypeDeclaration(structure: TypeStructure): string;
14
+ generatePropertyConversion(structure: TypeStructure, sourceValue: string, direction: ConversionDirection): string;
15
+ }
16
+ export interface TypeContext {
17
+ genericParams: string[];
18
+ depth: number;
19
+ }
20
+ export declare enum ConversionDirection {
21
+ TO_SENDABLE = "TO_SENDABLE",
22
+ TO_ORIGIN = "TO_ORIGIN"
23
+ }
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConversionDirection = void 0;
4
+ var ConversionDirection;
5
+ (function (ConversionDirection) {
6
+ ConversionDirection["TO_SENDABLE"] = "TO_SENDABLE";
7
+ ConversionDirection["TO_ORIGIN"] = "TO_ORIGIN";
8
+ })(ConversionDirection || (exports.ConversionDirection = ConversionDirection = {}));
@@ -0,0 +1,2 @@
1
+ import { ITypeHandler } from './ITypeHandler';
2
+ export declare function createPrimitiveHandlers(): ITypeHandler[];