@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.
- package/LICENSE +177 -0
- package/README.md +253 -0
- package/dist/core/Types.d.ts +196 -0
- package/dist/core/Types.js +47 -0
- package/dist/core/analyzers/ClassAnalyzer.d.ts +23 -0
- package/dist/core/analyzers/ClassAnalyzer.js +480 -0
- package/dist/core/analyzers/CustomTypeAnalyzer.d.ts +21 -0
- package/dist/core/analyzers/CustomTypeAnalyzer.js +243 -0
- package/dist/core/analyzers/SendableMergeChecker.d.ts +9 -0
- package/dist/core/analyzers/SendableMergeChecker.js +100 -0
- package/dist/core/analyzers/SendableMergeabilityRegistry.d.ts +7 -0
- package/dist/core/analyzers/SendableMergeabilityRegistry.js +23 -0
- package/dist/core/constants/DecoratorConstants.d.ts +7 -0
- package/dist/core/constants/DecoratorConstants.js +13 -0
- package/dist/core/constants/PathConstants.d.ts +6 -0
- package/dist/core/constants/PathConstants.js +10 -0
- package/dist/core/constants/StringConstants.d.ts +83 -0
- package/dist/core/constants/StringConstants.js +87 -0
- package/dist/core/constants/index.d.ts +3 -0
- package/dist/core/constants/index.js +19 -0
- package/dist/core/handlers/BaseTypeHandler.d.ts +23 -0
- package/dist/core/handlers/BaseTypeHandler.js +57 -0
- package/dist/core/handlers/CustomClassHandler.d.ts +21 -0
- package/dist/core/handlers/CustomClassHandler.js +191 -0
- package/dist/core/handlers/DateHandler.d.ts +2 -0
- package/dist/core/handlers/DateHandler.js +60 -0
- package/dist/core/handlers/DecimalHandler.d.ts +2 -0
- package/dist/core/handlers/DecimalHandler.js +60 -0
- package/dist/core/handlers/EnumHandler.d.ts +2 -0
- package/dist/core/handlers/EnumHandler.js +89 -0
- package/dist/core/handlers/GenericContainerHandler.d.ts +2 -0
- package/dist/core/handlers/GenericContainerHandler.js +440 -0
- package/dist/core/handlers/GenericHandler.d.ts +18 -0
- package/dist/core/handlers/GenericHandler.js +92 -0
- package/dist/core/handlers/HandlerBootstrap.d.ts +2 -0
- package/dist/core/handlers/HandlerBootstrap.js +28 -0
- package/dist/core/handlers/ITypeHandler.d.ts +23 -0
- package/dist/core/handlers/ITypeHandler.js +8 -0
- package/dist/core/handlers/PrimitiveHandler.d.ts +2 -0
- package/dist/core/handlers/PrimitiveHandler.js +127 -0
- package/dist/core/handlers/TupleHandler.d.ts +2 -0
- package/dist/core/handlers/TupleHandler.js +98 -0
- package/dist/core/handlers/TypeHandlerRegistry.d.ts +20 -0
- package/dist/core/handlers/TypeHandlerRegistry.js +113 -0
- package/dist/core/handlers/UnionTypeHandler.d.ts +2 -0
- package/dist/core/handlers/UnionTypeHandler.js +263 -0
- package/dist/core/handlers/index.d.ts +2 -0
- package/dist/core/handlers/index.js +5 -0
- package/dist/core/import-rewrite/services/BuildProfileUpdater.d.ts +8 -0
- package/dist/core/import-rewrite/services/BuildProfileUpdater.js +92 -0
- package/dist/core/import-rewrite/services/ImportRewriteService.d.ts +9 -0
- package/dist/core/import-rewrite/services/ImportRewriteService.js +61 -0
- package/dist/core/import-rewrite/services/ImportTransformService.d.ts +15 -0
- package/dist/core/import-rewrite/services/ImportTransformService.js +109 -0
- package/dist/core/import-rewrite/strategies/ImportScanStrategy.d.ts +17 -0
- package/dist/core/import-rewrite/strategies/ImportScanStrategy.js +137 -0
- package/dist/core/import-rewrite/types/ImportRewriteTypes.d.ts +17 -0
- package/dist/core/import-rewrite/types/ImportRewriteTypes.js +2 -0
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.js +27 -0
- package/dist/core/interfaces/ITask.d.ts +7 -0
- package/dist/core/interfaces/ITask.js +2 -0
- package/dist/core/interfaces/ITaskContext.d.ts +11 -0
- package/dist/core/interfaces/ITaskContext.js +2 -0
- package/dist/core/interfaces/index.d.ts +2 -0
- package/dist/core/interfaces/index.js +2 -0
- package/dist/core/logger/Logger.d.ts +13 -0
- package/dist/core/logger/Logger.js +78 -0
- package/dist/core/services/CodeAnalysisService.d.ts +7 -0
- package/dist/core/services/CodeAnalysisService.js +43 -0
- package/dist/core/services/CodeGenerationEngine.d.ts +12 -0
- package/dist/core/services/CodeGenerationEngine.js +102 -0
- package/dist/core/services/CodeGenerationService/CodeGenerationService.d.ts +13 -0
- package/dist/core/services/CodeGenerationService/CodeGenerationService.js +110 -0
- package/dist/core/services/CodeGenerationService/generators/MergedSendableClassGenerator.d.ts +13 -0
- package/dist/core/services/CodeGenerationService/generators/MergedSendableClassGenerator.js +119 -0
- package/dist/core/services/CodeGenerationService/generators/OriginalClassGenerator.d.ts +21 -0
- package/dist/core/services/CodeGenerationService/generators/OriginalClassGenerator.js +224 -0
- package/dist/core/services/CodeGenerationService/generators/SendableClassGenerator.d.ts +24 -0
- package/dist/core/services/CodeGenerationService/generators/SendableClassGenerator.js +307 -0
- package/dist/core/services/CodeGenerationService/generators/SerializerGenerator.d.ts +28 -0
- package/dist/core/services/CodeGenerationService/generators/SerializerGenerator.js +259 -0
- package/dist/core/services/CodeGenerationService/generators/TempSerializerGenerator.d.ts +19 -0
- package/dist/core/services/CodeGenerationService/generators/TempSerializerGenerator.js +178 -0
- package/dist/core/services/CodeGenerationService/index.d.ts +1 -0
- package/dist/core/services/CodeGenerationService/index.js +5 -0
- package/dist/core/services/CodeGenerationService/shared/ImportManager.d.ts +27 -0
- package/dist/core/services/CodeGenerationService/shared/ImportManager.js +127 -0
- package/dist/core/template/HandlebarsTemplateEngine.d.ts +26 -0
- package/dist/core/template/HandlebarsTemplateEngine.js +226 -0
- package/dist/core/utils/ConfigManager.d.ts +10 -0
- package/dist/core/utils/ConfigManager.js +32 -0
- package/dist/core/utils/CustomError.d.ts +30 -0
- package/dist/core/utils/CustomError.js +37 -0
- package/dist/core/utils/DeepCopyUtil.d.ts +15 -0
- package/dist/core/utils/DeepCopyUtil.js +138 -0
- package/dist/core/utils/GenericTypeSubstitutionUtil.d.ts +9 -0
- package/dist/core/utils/GenericTypeSubstitutionUtil.js +68 -0
- package/dist/core/utils/SerializationPathUtil.d.ts +18 -0
- package/dist/core/utils/SerializationPathUtil.js +107 -0
- package/dist/core/utils/TsMorphUtil.d.ts +8 -0
- package/dist/core/utils/TsMorphUtil.js +34 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +57 -0
- package/dist/json-plugin/JSONExecuteController.d.ts +13 -0
- package/dist/json-plugin/JSONExecuteController.js +103 -0
- package/dist/json-plugin/constants/TaskConstants.d.ts +7 -0
- package/dist/json-plugin/constants/TaskConstants.js +11 -0
- package/dist/json-plugin/interfaces/IModuleContext.d.ts +10 -0
- package/dist/json-plugin/interfaces/IModuleContext.js +2 -0
- package/dist/json-plugin/interfaces/ITargetContext.d.ts +8 -0
- package/dist/json-plugin/interfaces/ITargetContext.js +2 -0
- package/dist/json-plugin/interfaces/impl/ModuleContext.d.ts +12 -0
- package/dist/json-plugin/interfaces/impl/ModuleContext.js +24 -0
- package/dist/json-plugin/interfaces/impl/TargetContext.d.ts +23 -0
- package/dist/json-plugin/interfaces/impl/TargetContext.js +113 -0
- package/dist/json-plugin/tasks/BaseTask.d.ts +14 -0
- package/dist/json-plugin/tasks/BaseTask.js +53 -0
- package/dist/json-plugin/tasks/CleanTask.d.ts +8 -0
- package/dist/json-plugin/tasks/CleanTask.js +25 -0
- package/dist/json-plugin/tasks/CodeProcessingTask.d.ts +8 -0
- package/dist/json-plugin/tasks/CodeProcessingTask.js +26 -0
- package/dist/json-plugin/tasks/SyncTask.d.ts +8 -0
- package/dist/json-plugin/tasks/SyncTask.js +21 -0
- package/dist/json-plugin/tasks/WatchTask.d.ts +11 -0
- package/dist/json-plugin/tasks/WatchTask.js +102 -0
- package/package.json +46 -0
- package/src/core/Types.ts +356 -0
- package/src/core/analyzers/ClassAnalyzer.ts +824 -0
- package/src/core/analyzers/CustomTypeAnalyzer.ts +337 -0
- package/src/core/analyzers/SendableMergeChecker.ts +195 -0
- package/src/core/analyzers/SendableMergeabilityRegistry.ts +72 -0
- package/src/core/constants/DecoratorConstants.ts +27 -0
- package/src/core/constants/PathConstants.ts +31 -0
- package/src/core/constants/StringConstants.ts +152 -0
- package/src/core/constants/index.ts +21 -0
- package/src/core/handlers/BaseTypeHandler.ts +121 -0
- package/src/core/handlers/CustomClassHandler.ts +278 -0
- package/src/core/handlers/DateHandler.ts +75 -0
- package/src/core/handlers/DecimalHandler.ts +75 -0
- package/src/core/handlers/EnumHandler.ts +142 -0
- package/src/core/handlers/GenericContainerHandler.ts +621 -0
- package/src/core/handlers/GenericHandler.ts +130 -0
- package/src/core/handlers/HandlerBootstrap.ts +64 -0
- package/src/core/handlers/ITypeHandler.ts +133 -0
- package/src/core/handlers/PrimitiveHandler.ts +159 -0
- package/src/core/handlers/TupleHandler.ts +145 -0
- package/src/core/handlers/TypeHandlerRegistry.ts +236 -0
- package/src/core/handlers/UnionTypeHandler.ts +400 -0
- package/src/core/handlers/index.ts +18 -0
- package/src/core/import-rewrite/services/BuildProfileUpdater.ts +145 -0
- package/src/core/import-rewrite/services/ImportRewriteService.ts +129 -0
- package/src/core/import-rewrite/services/ImportTransformService.ts +200 -0
- package/src/core/import-rewrite/strategies/ImportScanStrategy.ts +303 -0
- package/src/core/import-rewrite/types/ImportRewriteTypes.ts +100 -0
- package/src/core/index.ts +31 -0
- package/src/core/interfaces/ITask.ts +23 -0
- package/src/core/interfaces/ITaskContext.ts +94 -0
- package/src/core/interfaces/index.ts +17 -0
- package/src/core/logger/Logger.ts +149 -0
- package/src/core/services/CodeAnalysisService.ts +67 -0
- package/src/core/services/CodeGenerationEngine.ts +181 -0
- package/src/core/services/CodeGenerationService/CodeGenerationService.ts +159 -0
- package/src/core/services/CodeGenerationService/generators/MergedSendableClassGenerator.ts +189 -0
- package/src/core/services/CodeGenerationService/generators/OriginalClassGenerator.ts +314 -0
- package/src/core/services/CodeGenerationService/generators/SendableClassGenerator.ts +421 -0
- package/src/core/services/CodeGenerationService/generators/SerializerGenerator.ts +392 -0
- package/src/core/services/CodeGenerationService/generators/TempSerializerGenerator.ts +277 -0
- package/src/core/services/CodeGenerationService/index.ts +16 -0
- package/src/core/services/CodeGenerationService/shared/ImportManager.ts +191 -0
- package/src/core/template/HandlebarsTemplateEngine.ts +282 -0
- package/src/core/utils/ConfigManager.ts +49 -0
- package/src/core/utils/CustomError.ts +51 -0
- package/src/core/utils/DeepCopyUtil.ts +185 -0
- package/src/core/utils/GenericTypeSubstitutionUtil.ts +136 -0
- package/src/core/utils/SerializationPathUtil.ts +142 -0
- package/src/core/utils/TsMorphUtil.ts +50 -0
- package/src/index.ts +81 -0
- package/src/json-plugin/JSONExecuteController.ts +134 -0
- package/src/json-plugin/constants/TaskConstants.ts +22 -0
- package/src/json-plugin/interfaces/IModuleContext.ts +27 -0
- package/src/json-plugin/interfaces/ITargetContext.ts +25 -0
- package/src/json-plugin/interfaces/impl/ModuleContext.ts +45 -0
- package/src/json-plugin/interfaces/impl/TargetContext.ts +196 -0
- package/src/json-plugin/tasks/BaseTask.ts +94 -0
- package/src/json-plugin/tasks/CleanTask.ts +36 -0
- package/src/json-plugin/tasks/CodeProcessingTask.ts +41 -0
- package/src/json-plugin/tasks/SyncTask.ts +33 -0
- package/src/json-plugin/tasks/WatchTask.ts +99 -0
- package/template/SerializerPerformanceTemplate.hbs +35 -0
- package/template/SerializerRegisterTemplate.hbs +10 -0
- package/template/SerializerStrictTemplate.hbs +89 -0
- package/template/SerializerTemplate.hbs +176 -0
- package/tsconfig.json +17 -0
- 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,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,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,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
|
+
}
|