@odata2ts/odata2ts 0.31.0 → 0.32.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/CHANGELOG.md +27 -0
- package/lib/FactoryFunctionModel.d.ts +1 -1
- package/lib/FactoryFunctionModel.js.map +1 -1
- package/lib/OptionModel.d.ts +46 -61
- package/lib/OptionModel.js.map +1 -1
- package/lib/TypeModel.d.ts +10 -0
- package/lib/TypeModel.js +17 -0
- package/lib/TypeModel.js.map +1 -0
- package/lib/app.js +13 -0
- package/lib/app.js.map +1 -1
- package/lib/cli.js +1 -1
- package/lib/cli.js.map +1 -1
- package/lib/data-model/DataModel.d.ts +8 -4
- package/lib/data-model/DataModel.js +14 -8
- package/lib/data-model/DataModel.js.map +1 -1
- package/lib/data-model/DataModelDigestion.d.ts +3 -0
- package/lib/data-model/DataModelDigestion.js +69 -45
- package/lib/data-model/DataModelDigestion.js.map +1 -1
- package/lib/data-model/DataModelDigestionV2.js +10 -9
- package/lib/data-model/DataModelDigestionV2.js.map +1 -1
- package/lib/data-model/DataModelDigestionV4.js +31 -17
- package/lib/data-model/DataModelDigestionV4.js.map +1 -1
- package/lib/data-model/DataTypeModel.d.ts +1 -0
- package/lib/data-model/DataTypeModel.js.map +1 -1
- package/lib/data-model/NamingHelper.d.ts +1 -0
- package/lib/data-model/NamingHelper.js +5 -0
- package/lib/data-model/NamingHelper.js.map +1 -1
- package/lib/data-model/ServiceConfigHelper.d.ts +14 -17
- package/lib/data-model/ServiceConfigHelper.js +58 -72
- package/lib/data-model/ServiceConfigHelper.js.map +1 -1
- package/lib/data-model/validation/NameValidator.d.ts +28 -0
- package/lib/data-model/validation/NameValidator.js +80 -0
- package/lib/data-model/validation/NameValidator.js.map +1 -0
- package/lib/defaultConfig.js +2 -2
- package/lib/defaultConfig.js.map +1 -1
- package/lib/generator/ModelGenerator.js +1 -1
- package/lib/generator/ModelGenerator.js.map +1 -1
- package/lib/generator/QueryObjectGenerator.js.map +1 -1
- package/lib/generator/ServiceGenerator.js +1 -1
- package/lib/generator/ServiceGenerator.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataModel.js","sourceRoot":"","sources":["../../src/data-model/DataModel.ts"],"names":[],"mappings":"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","sourcesContent":["import { MappedConverterChains } from \"@odata2ts/converter-runtime\";\r\nimport { ODataTypesV2, ODataTypesV4 } from \"@odata2ts/odata-core\";\r\n\r\nimport {\r\n ActionImportType,\r\n ComplexType,\r\n DataTypes,\r\n EntityContainerModel,\r\n EntitySetType,\r\n EnumType,\r\n FunctionImportType,\r\n ModelType,\r\n ODataVersion,\r\n OperationType,\r\n PropertyModel,\r\n SingletonType,\r\n} from \"./DataTypeModel\";\r\n\r\nexport interface ProjectFiles {\r\n model: string;\r\n qObject: string;\r\n service: string;\r\n}\r\n\r\n/**\r\n * Each namespace is represented as tuple: 1. the namespace 2. the alias, if any.\r\n */\r\nexport type NamespaceWithAlias = [string, string?];\r\n\r\nexport function withNamespace(ns: string, name: string) {\r\n // this supports the edge case of an empty string as namespace which isn't really valid according to spec (see CSDL)\r\n return ns ? `${ns}.${name}` : name;\r\n}\r\n\r\nexport class DataModel {\r\n private readonly converters: MappedConverterChains;\r\n\r\n private models = new Map<string, ModelType | ComplexType | EnumType>();\r\n /**\r\n * Stores unbound operations by their fully qualified name.\r\n * @private\r\n */\r\n private unboundOperationTypes = new Map<string, OperationType>();\r\n /**\r\n * Stores operations bound to an entity type by the fully qualified name of the binding entity, e.g.\r\n * \"Trippin.Person\".\r\n * @private\r\n */\r\n private entityBoundOperationTypes = new Map<string, Array<OperationType>>();\r\n /**\r\n * Stores operations bound to an entity collection by the fully qualified name of the binding entity, e.g.\r\n * \"Trippin.Person\".\r\n * @private\r\n */\r\n private entityCollectionBoundOperationTypes = new Map<string, Array<OperationType>>();\r\n private readonly namespace2Alias: { [ns: string]: string };\r\n private typeDefinitions = new Map<string, string>();\r\n private aliases: Record<string, string> = {};\r\n private container: EntityContainerModel = { entitySets: {}, singletons: {}, functions: {}, actions: {} };\r\n\r\n constructor(\r\n namespaces: Array<NamespaceWithAlias>,\r\n private version: ODataVersion,\r\n converters: MappedConverterChains = new Map()\r\n ) {\r\n this.converters = converters;\r\n this.namespace2Alias = namespaces.reduce<Record<string, string>>((col, [ns, alias]) => {\r\n if (alias) {\r\n col[ns] = alias;\r\n }\r\n return col;\r\n }, {});\r\n }\r\n\r\n /**\r\n * OData version: 2.0 or 4.0.\r\n * @returns\r\n */\r\n public getODataVersion() {\r\n return this.version;\r\n }\r\n\r\n public isV2() {\r\n return this.version === ODataVersion.V2;\r\n }\r\n\r\n public isV4() {\r\n return this.version === ODataVersion.V4;\r\n }\r\n\r\n private retrieveType<T>(fqName: string, haystack: Map<string, T>): T | undefined {\r\n return haystack.get(fqName) || (this.aliases[fqName] ? haystack.get(this.aliases[fqName]) : undefined);\r\n }\r\n\r\n private addAlias(namespace: string, name: string) {\r\n const alias = this.namespace2Alias[namespace];\r\n if (alias) {\r\n this.aliases[withNamespace(alias, name)] = withNamespace(namespace, name);\r\n }\r\n }\r\n\r\n public addTypeDefinition(namespace: string, name: string, type: string) {\r\n const fqName = withNamespace(namespace, name);\r\n this.typeDefinitions.set(fqName, type);\r\n this.addAlias(namespace, name);\r\n }\r\n\r\n public getPrimitiveType(fqName: string): string | undefined {\r\n return this.retrieveType(fqName, this.typeDefinitions);\r\n }\r\n\r\n public getModel(fqName: string) {\r\n return this.retrieveType(fqName, this.models);\r\n }\r\n\r\n public addEntityType(namespace: string, name: string, model: Omit<ModelType, \"dataType\">) {\r\n const fqName = withNamespace(namespace, name);\r\n this.models.set(fqName, { ...model, dataType: DataTypes.ModelType });\r\n this.addAlias(namespace, name);\r\n }\r\n\r\n /**\r\n * Get a specific model by its fully qualified name.\r\n *\r\n * @param fqName the fully qualified name of the entity\r\n * @returns the model type\r\n */\r\n public getEntityType(fqName: string) {\r\n return this.retrieveType(fqName, this.models) as ModelType;\r\n }\r\n\r\n /**\r\n * Retrieve all known EntityType models from the EDMX model.\r\n *\r\n * @returns list of model types\r\n */\r\n public getEntityTypes() {\r\n const ets = [...this.models.values()].filter((m): m is ModelType => m.dataType === DataTypes.ModelType);\r\n return this.sortModelsByInheritance(ets);\r\n }\r\n\r\n public addComplexType(namespace: string, name: string, model: Omit<ComplexType, \"dataType\">) {\r\n const fqName = withNamespace(namespace, name);\r\n this.models.set(fqName, { ...model, dataType: DataTypes.ComplexType });\r\n this.addAlias(namespace, name);\r\n }\r\n\r\n /**\r\n * Get a specific model by its fully qualified name.\r\n *\r\n * @param fqName the final model name that is generated\r\n * @returns the model type\r\n */\r\n public getComplexType(fqName: string) {\r\n return this.retrieveType(fqName, this.models) as ComplexType;\r\n }\r\n\r\n /**\r\n * Retrieve all known ComplexType models from the EDMX model.\r\n *\r\n * @returns list of model types\r\n */\r\n public getComplexTypes() {\r\n const types = [...this.models.values()].filter((m): m is ComplexType => m.dataType === DataTypes.ComplexType);\r\n return this.sortModelsByInheritance(types);\r\n }\r\n\r\n public addEnum(namespace: string, name: string, type: Omit<EnumType, \"dataType\">) {\r\n const fqName = withNamespace(namespace, name);\r\n this.models.set(fqName, { ...type, dataType: DataTypes.EnumType });\r\n this.addAlias(namespace, name);\r\n }\r\n\r\n /**\r\n * Get list of all known enums, i.e. EnumType nodes from the EDMX model.\r\n * @returns list of enum types\r\n */\r\n public getEnums() {\r\n return [...this.models.values()].filter((m): m is EnumType => m.dataType === DataTypes.EnumType);\r\n }\r\n\r\n public addUnboundOperationType(namespace: string, operationType: OperationType) {\r\n this.unboundOperationTypes.set(operationType.fqName, operationType);\r\n this.addAlias(namespace, operationType.odataName);\r\n }\r\n\r\n public getUnboundOperationTypes(): Array<OperationType> {\r\n return [...this.unboundOperationTypes.values()];\r\n }\r\n\r\n public getUnboundOperationType(fqOpName: string): OperationType | undefined {\r\n return this.retrieveType(fqOpName, this.unboundOperationTypes);\r\n }\r\n\r\n public addBoundOperationType(namespace: string, bindingProp: PropertyModel, operationType: OperationType) {\r\n const fqEntityType = bindingProp.fqType;\r\n\r\n const store = bindingProp.isCollection ? this.entityCollectionBoundOperationTypes : this.entityBoundOperationTypes;\r\n const list = store.get(fqEntityType);\r\n if (list) {\r\n list.push(operationType);\r\n } else {\r\n store.set(fqEntityType, [operationType]);\r\n }\r\n }\r\n\r\n public getEntityTypeOperations(fqEntityName: string): Array<OperationType> {\r\n const operations = this.retrieveType(fqEntityName, this.entityBoundOperationTypes);\r\n return operations || [];\r\n }\r\n\r\n public getEntitySetOperations(fqEntityName: string): Array<OperationType> {\r\n const operations = this.retrieveType(fqEntityName, this.entityCollectionBoundOperationTypes);\r\n return operations || [];\r\n }\r\n\r\n public addAction(name: string, action: ActionImportType) {\r\n this.container.actions[name] = action;\r\n }\r\n\r\n public addFunction(name: string, func: FunctionImportType) {\r\n this.container.functions[name] = func;\r\n }\r\n\r\n public addSingleton(name: string, singleton: SingletonType) {\r\n this.container.singletons[name] = singleton;\r\n }\r\n\r\n public addEntitySet(name: string, entitySet: EntitySetType) {\r\n this.container.entitySets[name] = entitySet;\r\n }\r\n\r\n public getEntityContainer() {\r\n return this.container;\r\n }\r\n\r\n public getConverter(dataType: ODataTypesV2 | ODataTypesV4 | string) {\r\n return this.converters.get(dataType);\r\n }\r\n\r\n private sortModelsByInheritance<Type extends Omit<ComplexType, \"dataType\">>(models: Array<Type>): Array<Type> {\r\n // recursively visit all models and sort them by inheritance such that base classes\r\n // are always before derived classes\r\n const sorted: Array<Type> = [];\r\n const visitedModels = new Set<string>();\r\n const inProgressModels = new Set<string>();\r\n\r\n function visit(model: Type) {\r\n const fqName = model.fqName;\r\n if (inProgressModels.has(fqName)) {\r\n throw new Error(`Cyclic inheritance detected for model \"${fqName}\"!`);\r\n }\r\n\r\n if (!visitedModels.has(fqName)) {\r\n inProgressModels.add(fqName);\r\n\r\n for (const baseClassName of model.baseClasses) {\r\n const baseClass = models.find((e) => e.fqName === baseClassName);\r\n if (baseClass) {\r\n visit(baseClass);\r\n }\r\n }\r\n visitedModels.add(fqName);\r\n inProgressModels.delete(fqName);\r\n sorted.push(model);\r\n }\r\n }\r\n\r\n for (const model of models) {\r\n visit(model);\r\n }\r\n return sorted;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"DataModel.js","sourceRoot":"","sources":["../../src/data-model/DataModel.ts"],"names":[],"mappings":"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","sourcesContent":["import { MappedConverterChains } from \"@odata2ts/converter-runtime\";\r\nimport { ODataTypesV2, ODataTypesV4 } from \"@odata2ts/odata-core\";\r\n\r\nimport {\r\n ActionImportType,\r\n ComplexType,\r\n DataTypes,\r\n EntityContainerModel,\r\n EntitySetType,\r\n EnumType,\r\n FunctionImportType,\r\n ModelType,\r\n ODataVersion,\r\n OperationType,\r\n PropertyModel,\r\n SingletonType,\r\n} from \"./DataTypeModel\";\r\nimport { ValidationError } from \"./validation/NameValidator\";\r\n\r\nexport interface ProjectFiles {\r\n model: string;\r\n qObject: string;\r\n service: string;\r\n}\r\n\r\n/**\r\n * Each namespace is represented as tuple: 1. the namespace 2. the alias, if any.\r\n */\r\nexport type NamespaceWithAlias = [string, string?];\r\n\r\nexport function withNamespace(ns: string, name: string) {\r\n // this supports the edge case of an empty string as namespace which isn't really valid according to spec (see CSDL)\r\n return ns ? `${ns}.${name}` : name;\r\n}\r\n\r\nexport class DataModel {\r\n private readonly converters: MappedConverterChains;\r\n private nameValidation: Map<string, ValidationError[]> | undefined;\r\n\r\n private models = new Map<string, ModelType | ComplexType | EnumType>();\r\n /**\r\n * Stores unbound operations by their fully qualified name.\r\n * @private\r\n */\r\n private unboundOperationTypes = new Map<string, OperationType>();\r\n /**\r\n * Stores operations bound to an entity type by the fully qualified name of the binding entity, e.g.\r\n * \"Trippin.Person\".\r\n * @private\r\n */\r\n private entityBoundOperationTypes = new Map<string, Array<OperationType>>();\r\n /**\r\n * Stores operations bound to an entity collection by the fully qualified name of the binding entity, e.g.\r\n * \"Trippin.Person\".\r\n * @private\r\n */\r\n private entityCollectionBoundOperationTypes = new Map<string, Array<OperationType>>();\r\n private readonly namespace2Alias: { [ns: string]: string };\r\n private typeDefinitions = new Map<string, string>();\r\n private aliases: Record<string, string> = {};\r\n private container: EntityContainerModel = { entitySets: {}, singletons: {}, functions: {}, actions: {} };\r\n\r\n constructor(\r\n namespaces: Array<NamespaceWithAlias>,\r\n private version: ODataVersion,\r\n converters: MappedConverterChains = new Map()\r\n ) {\r\n this.converters = converters;\r\n this.namespace2Alias = namespaces.reduce<Record<string, string>>((col, [ns, alias]) => {\r\n if (alias) {\r\n col[ns] = alias;\r\n }\r\n return col;\r\n }, {});\r\n }\r\n\r\n /**\r\n * OData version: 2.0 or 4.0.\r\n * @returns\r\n */\r\n public getODataVersion() {\r\n return this.version;\r\n }\r\n\r\n public isV2() {\r\n return this.version === ODataVersion.V2;\r\n }\r\n\r\n public isV4() {\r\n return this.version === ODataVersion.V4;\r\n }\r\n\r\n private retrieveType<T>(fqName: string, haystack: Map<string, T>): T | undefined {\r\n return haystack.get(fqName) || (this.aliases[fqName] ? haystack.get(this.aliases[fqName]) : undefined);\r\n }\r\n\r\n private addAlias(namespace: string, name: string) {\r\n const alias = this.namespace2Alias[namespace];\r\n if (alias) {\r\n this.aliases[withNamespace(alias, name)] = withNamespace(namespace, name);\r\n }\r\n }\r\n\r\n public addTypeDefinition(namespace: string, name: string, type: string) {\r\n const fqName = withNamespace(namespace, name);\r\n this.typeDefinitions.set(fqName, type);\r\n this.addAlias(namespace, name);\r\n }\r\n\r\n public getPrimitiveType(fqName: string): string | undefined {\r\n return this.retrieveType(fqName, this.typeDefinitions);\r\n }\r\n\r\n public getModel(fqName: string) {\r\n return this.retrieveType(fqName, this.models);\r\n }\r\n\r\n public addEntityType(namespace: string, name: string, model: Omit<ModelType, \"dataType\">) {\r\n const fqName = withNamespace(namespace, name);\r\n\r\n this.models.set(fqName, { ...model, dataType: DataTypes.ModelType });\r\n this.addAlias(namespace, name);\r\n }\r\n\r\n /**\r\n * Get a specific model by its fully qualified name.\r\n *\r\n * @param fqName the fully qualified name of the entity\r\n * @returns the model type\r\n */\r\n public getEntityType(fqName: string) {\r\n return this.retrieveType(fqName, this.models) as ModelType;\r\n }\r\n\r\n /**\r\n * Retrieve all known EntityType models from the EDMX model.\r\n *\r\n * @returns list of model types\r\n */\r\n public getEntityTypes() {\r\n const ets = [...this.models.values()].filter((m): m is ModelType => m.dataType === DataTypes.ModelType);\r\n return this.sortModelsByInheritance(ets);\r\n }\r\n\r\n public addComplexType(namespace: string, name: string, model: Omit<ComplexType, \"dataType\">) {\r\n const fqName = withNamespace(namespace, name);\r\n\r\n this.models.set(fqName, { ...model, dataType: DataTypes.ComplexType });\r\n this.addAlias(namespace, name);\r\n }\r\n\r\n /**\r\n * Get a specific model by its fully qualified name.\r\n *\r\n * @param fqName the final model name that is generated\r\n * @returns the model type\r\n */\r\n public getComplexType(fqName: string) {\r\n return this.retrieveType(fqName, this.models) as ComplexType;\r\n }\r\n\r\n /**\r\n * Retrieve all known ComplexType models from the EDMX model.\r\n *\r\n * @returns list of model types\r\n */\r\n public getComplexTypes() {\r\n const types = [...this.models.values()].filter((m): m is ComplexType => m.dataType === DataTypes.ComplexType);\r\n return this.sortModelsByInheritance(types);\r\n }\r\n\r\n public addEnum(namespace: string, name: string, type: Omit<EnumType, \"dataType\">) {\r\n const fqName = withNamespace(namespace, name);\r\n\r\n this.models.set(fqName, { ...type, dataType: DataTypes.EnumType });\r\n this.addAlias(namespace, name);\r\n }\r\n\r\n /**\r\n * Get list of all known enums, i.e. EnumType nodes from the EDMX model.\r\n * @returns list of enum types\r\n */\r\n public getEnums() {\r\n return [...this.models.values()].filter((m): m is EnumType => m.dataType === DataTypes.EnumType);\r\n }\r\n\r\n public addUnboundOperationType(namespace: string, operationType: OperationType) {\r\n this.unboundOperationTypes.set(operationType.fqName, operationType);\r\n this.addAlias(namespace, operationType.odataName);\r\n }\r\n\r\n public getUnboundOperationTypes(): Array<OperationType> {\r\n return [...this.unboundOperationTypes.values()];\r\n }\r\n\r\n public getUnboundOperationType(fqOpName: string): OperationType | undefined {\r\n return this.retrieveType(fqOpName, this.unboundOperationTypes);\r\n }\r\n\r\n public addBoundOperationType(namespace: string, bindingProp: PropertyModel, operationType: OperationType) {\r\n const fqEntityType = bindingProp.fqType;\r\n\r\n const store = bindingProp.isCollection ? this.entityCollectionBoundOperationTypes : this.entityBoundOperationTypes;\r\n const list = store.get(fqEntityType);\r\n if (list) {\r\n list.push(operationType);\r\n } else {\r\n store.set(fqEntityType, [operationType]);\r\n }\r\n }\r\n\r\n public getEntityTypeOperations(fqEntityName: string): Array<OperationType> {\r\n const operations = this.retrieveType(fqEntityName, this.entityBoundOperationTypes);\r\n return operations || [];\r\n }\r\n\r\n public getEntitySetOperations(fqEntityName: string): Array<OperationType> {\r\n const operations = this.retrieveType(fqEntityName, this.entityCollectionBoundOperationTypes);\r\n return operations || [];\r\n }\r\n\r\n public addAction(fqName: string, action: ActionImportType) {\r\n this.container.actions[fqName] = action;\r\n }\r\n\r\n public addFunction(fqName: string, func: FunctionImportType) {\r\n this.container.functions[fqName] = func;\r\n }\r\n\r\n public addSingleton(fqName: string, singleton: SingletonType) {\r\n this.container.singletons[fqName] = singleton;\r\n }\r\n\r\n public addEntitySet(fqName: string, entitySet: EntitySetType) {\r\n this.container.entitySets[fqName] = entitySet;\r\n }\r\n\r\n public getEntityContainer() {\r\n return this.container;\r\n }\r\n\r\n public getConverter(dataType: ODataTypesV2 | ODataTypesV4 | string) {\r\n return this.converters.get(dataType);\r\n }\r\n\r\n private sortModelsByInheritance<Type extends Omit<ComplexType, \"dataType\">>(models: Array<Type>): Array<Type> {\r\n // recursively visit all models and sort them by inheritance such that base classes\r\n // are always before derived classes\r\n const sorted: Array<Type> = [];\r\n const visitedModels = new Set<string>();\r\n const inProgressModels = new Set<string>();\r\n\r\n function visit(model: Type) {\r\n const fqName = model.fqName;\r\n if (inProgressModels.has(fqName)) {\r\n throw new Error(`Cyclic inheritance detected for model \"${fqName}\"!`);\r\n }\r\n\r\n if (!visitedModels.has(fqName)) {\r\n inProgressModels.add(fqName);\r\n\r\n for (const baseClassName of model.baseClasses) {\r\n const baseClass = models.find((e) => e.fqName === baseClassName);\r\n if (baseClass) {\r\n visit(baseClass);\r\n }\r\n }\r\n visitedModels.add(fqName);\r\n inProgressModels.delete(fqName);\r\n sorted.push(model);\r\n }\r\n }\r\n\r\n for (const model of models) {\r\n visit(model);\r\n }\r\n return sorted;\r\n }\r\n\r\n public setNameValidation(map: Map<string, ValidationError[]>) {\r\n this.nameValidation = map;\r\n }\r\n\r\n public getNameValidation() {\r\n return this.nameValidation!;\r\n }\r\n}\r\n"]}
|
|
@@ -8,6 +8,7 @@ import { SchemaV3 } from "./edmx/ODataEdmxModelV3";
|
|
|
8
8
|
import { SchemaV4 } from "./edmx/ODataEdmxModelV4";
|
|
9
9
|
import { NamingHelper } from "./NamingHelper";
|
|
10
10
|
import { ServiceConfigHelper } from "./ServiceConfigHelper";
|
|
11
|
+
import { NameValidator } from "./validation/NameValidator";
|
|
11
12
|
export interface TypeModel {
|
|
12
13
|
outputType: string;
|
|
13
14
|
qPath: string;
|
|
@@ -22,6 +23,7 @@ export declare abstract class Digester<S extends Schema<ET, CT>, ET extends Enti
|
|
|
22
23
|
protected static EDM_PREFIX: string;
|
|
23
24
|
protected readonly dataModel: DataModel;
|
|
24
25
|
protected readonly serviceConfigHelper: ServiceConfigHelper;
|
|
26
|
+
protected readonly nameValidator: NameValidator;
|
|
25
27
|
private model2Type;
|
|
26
28
|
protected constructor(version: ODataVersion, schemas: Array<S>, options: DigestionOptions, namingHelper: NamingHelper, converters?: MappedConverterChains);
|
|
27
29
|
private collectModelTypes;
|
|
@@ -40,6 +42,7 @@ export declare abstract class Digester<S extends Schema<ET, CT>, ET extends Enti
|
|
|
40
42
|
private digestEntityTypesAndOperations;
|
|
41
43
|
private getBaseModel;
|
|
42
44
|
private addTypeDefinition;
|
|
45
|
+
private addEnum;
|
|
43
46
|
private addComplexType;
|
|
44
47
|
private addEntityType;
|
|
45
48
|
private postProcessModel;
|
|
@@ -4,6 +4,7 @@ exports.Digester = void 0;
|
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const DataModel_1 = require("./DataModel");
|
|
6
6
|
const ServiceConfigHelper_1 = require("./ServiceConfigHelper");
|
|
7
|
+
const NameValidator_1 = require("./validation/NameValidator");
|
|
7
8
|
class Digester {
|
|
8
9
|
constructor(version, schemas, options, namingHelper, converters) {
|
|
9
10
|
this.version = version;
|
|
@@ -12,6 +13,7 @@ class Digester {
|
|
|
12
13
|
this.namingHelper = namingHelper;
|
|
13
14
|
this.model2Type = new Map();
|
|
14
15
|
this.mapProp = (p, entityPropConfig) => {
|
|
16
|
+
var _a, _b;
|
|
15
17
|
if (!p.$.Type) {
|
|
16
18
|
throw new Error(`No type information given for property [${p.$.Name}]!`);
|
|
17
19
|
}
|
|
@@ -31,14 +33,17 @@ class Digester {
|
|
|
31
33
|
// EntityType, ComplexType, EnumType
|
|
32
34
|
if (this.namingHelper.includesServicePrefix(dataType)) {
|
|
33
35
|
const resultDt = this.model2Type.get(dataType);
|
|
36
|
+
const [dataTypeName, dataTypePrefix] = this.namingHelper.getNameAndServicePrefix(dataType);
|
|
37
|
+
const dataTypeNamespace = [dataTypePrefix];
|
|
34
38
|
if (!resultDt) {
|
|
35
39
|
throw new Error(`Couldn't determine model data type for property "${p.$.Name}"! Given data type: "${dataType}".`);
|
|
36
40
|
}
|
|
37
41
|
// special handling for enums
|
|
38
42
|
if (resultDt === "EnumType" /* DataTypes.EnumType */) {
|
|
43
|
+
const enumConfig = this.serviceConfigHelper.findEnumTypeConfig(dataTypeNamespace, dataTypeName);
|
|
39
44
|
result = {
|
|
40
45
|
dataType: resultDt,
|
|
41
|
-
type: this.namingHelper.getEnumName(dataType),
|
|
46
|
+
type: this.namingHelper.getEnumName((_a = enumConfig === null || enumConfig === void 0 ? void 0 : enumConfig.mappedName) !== null && _a !== void 0 ? _a : dataType),
|
|
42
47
|
qPath: "QEnumPath",
|
|
43
48
|
qObject: isCollection ? "QEnumCollection" : undefined,
|
|
44
49
|
qParam: "QEnumParam",
|
|
@@ -46,11 +51,15 @@ class Digester {
|
|
|
46
51
|
}
|
|
47
52
|
// handling of complex & entity types
|
|
48
53
|
else {
|
|
54
|
+
const entityConfig = resultDt === "ComplexType" /* DataTypes.ComplexType */
|
|
55
|
+
? this.serviceConfigHelper.findComplexTypeConfig(dataTypeNamespace, dataTypeName)
|
|
56
|
+
: this.serviceConfigHelper.findEntityTypeConfig(dataTypeNamespace, dataTypeName);
|
|
57
|
+
const resultDataType = (_b = entityConfig === null || entityConfig === void 0 ? void 0 : entityConfig.mappedName) !== null && _b !== void 0 ? _b : dataType;
|
|
49
58
|
result = {
|
|
50
59
|
dataType: resultDt,
|
|
51
|
-
type: this.namingHelper.getModelName(
|
|
60
|
+
type: this.namingHelper.getModelName(resultDataType),
|
|
52
61
|
qPath: "QEntityPath",
|
|
53
|
-
qObject: this.namingHelper.getQName(
|
|
62
|
+
qObject: this.namingHelper.getQName(resultDataType),
|
|
54
63
|
qParam: "QComplexParam",
|
|
55
64
|
};
|
|
56
65
|
}
|
|
@@ -78,6 +87,7 @@ class Digester {
|
|
|
78
87
|
const namespaces = schemas.map((s) => [s.$.Namespace, s.$.Alias]);
|
|
79
88
|
this.dataModel = new DataModel_1.DataModel(namespaces, version, converters);
|
|
80
89
|
this.serviceConfigHelper = new ServiceConfigHelper_1.ServiceConfigHelper(options);
|
|
90
|
+
this.nameValidator = new NameValidator_1.NameValidator(options);
|
|
81
91
|
this.collectModelTypes(schemas);
|
|
82
92
|
}
|
|
83
93
|
collectModelTypes(schemas) {
|
|
@@ -106,6 +116,7 @@ class Digester {
|
|
|
106
116
|
this.digestEntityTypesAndOperations();
|
|
107
117
|
// delegate to version specific entity container digestion
|
|
108
118
|
this.schemas.forEach((schema) => this.digestEntityContainer(schema));
|
|
119
|
+
this.dataModel.setNameValidation(this.nameValidator.validate());
|
|
109
120
|
return this.dataModel;
|
|
110
121
|
});
|
|
111
122
|
}
|
|
@@ -115,18 +126,7 @@ class Digester {
|
|
|
115
126
|
// type definitions: alias for primitive types
|
|
116
127
|
this.addTypeDefinition(schema.$.Namespace, schema.TypeDefinition);
|
|
117
128
|
// enums
|
|
118
|
-
|
|
119
|
-
for (const et of schema.EnumType) {
|
|
120
|
-
const odataName = et.$.Name;
|
|
121
|
-
const fqName = (0, DataModel_1.withNamespace)(ns[0], odataName);
|
|
122
|
-
this.dataModel.addEnum(ns[0], odataName, {
|
|
123
|
-
fqName,
|
|
124
|
-
odataName,
|
|
125
|
-
name: this.namingHelper.getEnumName(odataName),
|
|
126
|
-
members: et.Member.map((m) => m.$.Name),
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
}
|
|
129
|
+
this.addEnum(ns, schema.EnumType);
|
|
130
130
|
// complex types
|
|
131
131
|
this.addComplexType(ns, schema.ComplexType);
|
|
132
132
|
// entity types
|
|
@@ -136,12 +136,9 @@ class Digester {
|
|
|
136
136
|
});
|
|
137
137
|
this.postProcessModel();
|
|
138
138
|
}
|
|
139
|
-
getBaseModel(
|
|
140
|
-
var _a;
|
|
139
|
+
getBaseModel(entityConfig, model, name, fqName) {
|
|
140
|
+
var _a, _b;
|
|
141
141
|
const odataName = model.$.Name;
|
|
142
|
-
const fqName = (0, DataModel_1.withNamespace)(namespace[0], odataName);
|
|
143
|
-
const entityConfig = this.serviceConfigHelper.findEntityConfigByName(namespace, odataName);
|
|
144
|
-
const entityName = (entityConfig === null || entityConfig === void 0 ? void 0 : entityConfig.mappedName) || model.$.Name;
|
|
145
142
|
// map properties respecting the config
|
|
146
143
|
const props = [...((_a = model.Property) !== null && _a !== void 0 ? _a : []), ...this.getNavigationProps(model)].map((p) => {
|
|
147
144
|
var _a;
|
|
@@ -150,16 +147,22 @@ class Digester {
|
|
|
150
147
|
});
|
|
151
148
|
// support for base types, i.e. extends clause of interfaces
|
|
152
149
|
const baseClasses = [];
|
|
150
|
+
let finalBaseClass = undefined;
|
|
153
151
|
if (model.$.BaseType) {
|
|
154
152
|
baseClasses.push(model.$.BaseType);
|
|
153
|
+
const [baseName, basePrefix] = this.namingHelper.getNameAndServicePrefix(model.$.BaseType);
|
|
154
|
+
const baseConfig = this.serviceConfigHelper.findEntityTypeConfig([basePrefix], baseName) ||
|
|
155
|
+
this.serviceConfigHelper.findComplexTypeConfig([basePrefix], baseName);
|
|
156
|
+
finalBaseClass = (_b = baseConfig === null || baseConfig === void 0 ? void 0 : baseConfig.mappedName) !== null && _b !== void 0 ? _b : baseName;
|
|
155
157
|
}
|
|
156
158
|
return {
|
|
157
159
|
fqName,
|
|
158
160
|
odataName,
|
|
159
|
-
name: this.namingHelper.getModelName(
|
|
160
|
-
qName: this.namingHelper.getQName(
|
|
161
|
-
editableName: this.namingHelper.getEditableModelName(
|
|
161
|
+
name: this.namingHelper.getModelName(name),
|
|
162
|
+
qName: this.namingHelper.getQName(name),
|
|
163
|
+
editableName: this.namingHelper.getEditableModelName(name),
|
|
162
164
|
baseClasses,
|
|
165
|
+
finalBaseClass,
|
|
163
166
|
props,
|
|
164
167
|
baseProps: [], // postprocess required
|
|
165
168
|
};
|
|
@@ -172,12 +175,32 @@ class Digester {
|
|
|
172
175
|
this.dataModel.addTypeDefinition(ns, t.$.Name, t.$.UnderlyingType);
|
|
173
176
|
}
|
|
174
177
|
}
|
|
178
|
+
addEnum(namespace, models) {
|
|
179
|
+
if (!models || !models.length) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
for (const et of models) {
|
|
183
|
+
const odataName = et.$.Name;
|
|
184
|
+
const fqName = (0, DataModel_1.withNamespace)(namespace[0], odataName);
|
|
185
|
+
const config = this.serviceConfigHelper.findEnumTypeConfig(namespace, odataName);
|
|
186
|
+
const enumName = this.nameValidator.addEnumType(fqName, (config === null || config === void 0 ? void 0 : config.mappedName) || odataName);
|
|
187
|
+
this.dataModel.addEnum(namespace[0], odataName, {
|
|
188
|
+
fqName,
|
|
189
|
+
odataName,
|
|
190
|
+
name: this.namingHelper.getEnumName(enumName),
|
|
191
|
+
members: et.Member.map((m) => m.$.Name),
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
}
|
|
175
195
|
addComplexType(namespace, models) {
|
|
176
196
|
if (!models || !models.length) {
|
|
177
197
|
return;
|
|
178
198
|
}
|
|
179
199
|
for (const model of models) {
|
|
180
|
-
const
|
|
200
|
+
const config = this.serviceConfigHelper.findComplexTypeConfig(namespace, model.$.Name);
|
|
201
|
+
const fqName = (0, DataModel_1.withNamespace)(namespace[0], model.$.Name);
|
|
202
|
+
const name = this.nameValidator.addComplexType(fqName, (config === null || config === void 0 ? void 0 : config.mappedName) || model.$.Name);
|
|
203
|
+
const baseModel = this.getBaseModel(config, model, name, fqName);
|
|
181
204
|
this.dataModel.addComplexType(namespace[0], baseModel.odataName, baseModel);
|
|
182
205
|
}
|
|
183
206
|
}
|
|
@@ -187,9 +210,10 @@ class Digester {
|
|
|
187
210
|
return;
|
|
188
211
|
}
|
|
189
212
|
for (const model of models) {
|
|
190
|
-
const
|
|
191
|
-
const
|
|
192
|
-
const
|
|
213
|
+
const entityConfig = this.serviceConfigHelper.findEntityTypeConfig(namespace, model.$.Name);
|
|
214
|
+
const fqName = (0, DataModel_1.withNamespace)(namespace[0], model.$.Name);
|
|
215
|
+
const name = this.nameValidator.addEntityType(fqName, (entityConfig === null || entityConfig === void 0 ? void 0 : entityConfig.mappedName) || model.$.Name);
|
|
216
|
+
const baseModel = this.getBaseModel(entityConfig, model, name, fqName);
|
|
193
217
|
// key support: we add keys from this entity,
|
|
194
218
|
// but not keys stemming from base classes (postprocess required)
|
|
195
219
|
const keyNames = [];
|
|
@@ -203,34 +227,34 @@ class Digester {
|
|
|
203
227
|
keyNames.push(...propNames);
|
|
204
228
|
}
|
|
205
229
|
}
|
|
206
|
-
this.dataModel.addEntityType(namespace[0], baseModel.odataName, Object.assign(Object.assign({}, baseModel), { idModelName: this.namingHelper.getIdModelName(
|
|
230
|
+
this.dataModel.addEntityType(namespace[0], baseModel.odataName, Object.assign(Object.assign({}, baseModel), { idModelName: this.namingHelper.getIdModelName(name), qIdFunctionName: this.namingHelper.getQIdFunctionName(name), generateId: true, keyNames: keyNames, keys: [], getKeyUnion: () => keyNames.join(" | ") }));
|
|
207
231
|
}
|
|
208
232
|
}
|
|
209
233
|
postProcessModel() {
|
|
210
234
|
// complex types
|
|
211
235
|
const complexTypes = this.dataModel.getComplexTypes();
|
|
212
|
-
complexTypes.forEach((
|
|
213
|
-
const [baseProps] = this.collectBaseClassPropsAndKeys(
|
|
214
|
-
|
|
236
|
+
complexTypes.forEach((ct) => {
|
|
237
|
+
const [baseProps] = this.collectBaseClassPropsAndKeys(ct, []);
|
|
238
|
+
ct.baseProps = baseProps;
|
|
215
239
|
});
|
|
216
240
|
// entity types
|
|
217
|
-
const
|
|
218
|
-
|
|
219
|
-
const [baseProps, baseKeys, idName, qIdName] = this.collectBaseClassPropsAndKeys(
|
|
220
|
-
|
|
221
|
-
if (!
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
241
|
+
const entityTypes = this.dataModel.getEntityTypes();
|
|
242
|
+
entityTypes.forEach((et) => {
|
|
243
|
+
const [baseProps, baseKeys, idName, qIdName] = this.collectBaseClassPropsAndKeys(et, []);
|
|
244
|
+
et.baseProps = baseProps;
|
|
245
|
+
if (!et.keyNames.length && idName) {
|
|
246
|
+
et.idModelName = idName;
|
|
247
|
+
et.qIdFunctionName = qIdName;
|
|
248
|
+
et.generateId = false;
|
|
225
249
|
}
|
|
226
|
-
|
|
250
|
+
et.keyNames.unshift(...baseKeys);
|
|
227
251
|
// sanity check: entity types require key specification
|
|
228
|
-
if (!
|
|
229
|
-
throw new Error(`Key property is missing from Entity "${
|
|
252
|
+
if (!et.keyNames.length) {
|
|
253
|
+
throw new Error(`Key property is missing from Entity "${et.name}" (${et.odataName})!`);
|
|
230
254
|
}
|
|
231
|
-
const isSingleKey =
|
|
232
|
-
const props = [...
|
|
233
|
-
|
|
255
|
+
const isSingleKey = et.keyNames.length === 1;
|
|
256
|
+
const props = [...et.baseProps, ...et.props];
|
|
257
|
+
et.keys = et.keyNames.map((keyName) => {
|
|
234
258
|
const prop = props.find((p) => p.odataName === keyName);
|
|
235
259
|
if (!prop) {
|
|
236
260
|
throw new Error(`Key with name [${keyName}] not found in props!`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataModelDigestion.js","sourceRoot":"","sources":["../../src/data-model/DataModelDigestion.ts"],"names":[],"mappings":"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","sourcesContent":["import { MappedConverterChains } from \"@odata2ts/converter-runtime\";\r\n\r\nimport { DigestionOptions } from \"../FactoryFunctionModel\";\r\nimport { PropertyGenerationOptions } from \"../OptionModel\";\r\nimport { DataModel, NamespaceWithAlias, withNamespace } from \"./DataModel\";\r\nimport { ComplexType as ComplexModelType, DataTypes, ModelType, ODataVersion, PropertyModel } from \"./DataTypeModel\";\r\nimport { ComplexType, EntityType, Property, Schema, TypeDefinition } from \"./edmx/ODataEdmxModelBase\";\r\nimport { SchemaV3 } from \"./edmx/ODataEdmxModelV3\";\r\nimport { SchemaV4 } from \"./edmx/ODataEdmxModelV4\";\r\nimport { NamingHelper } from \"./NamingHelper\";\r\nimport { ServiceConfigHelper } from \"./ServiceConfigHelper\";\r\n\r\nexport interface TypeModel {\r\n outputType: string;\r\n qPath: string;\r\n qCollection: string;\r\n qParam: string | undefined;\r\n}\r\n\r\nexport abstract class Digester<S extends Schema<ET, CT>, ET extends EntityType, CT extends ComplexType> {\r\n protected static EDM_PREFIX = \"Edm.\";\r\n\r\n protected readonly dataModel: DataModel;\r\n protected readonly serviceConfigHelper: ServiceConfigHelper;\r\n\r\n private model2Type = new Map<string, DataTypes>();\r\n\r\n protected constructor(\r\n protected version: ODataVersion,\r\n protected schemas: Array<S>,\r\n protected options: DigestionOptions,\r\n protected namingHelper: NamingHelper,\r\n converters?: MappedConverterChains\r\n ) {\r\n const namespaces = schemas.map<NamespaceWithAlias>((s) => [s.$.Namespace, s.$.Alias]);\r\n this.dataModel = new DataModel(namespaces, version, converters);\r\n this.serviceConfigHelper = new ServiceConfigHelper(options);\r\n\r\n this.collectModelTypes(schemas);\r\n }\r\n\r\n private collectModelTypes(schemas: Array<S>) {\r\n schemas.forEach((schema) => {\r\n const { Namespace: ns, Alias: alias } = schema.$;\r\n\r\n schema.EnumType?.forEach((et) => {\r\n this.addModel2Type(ns, alias, et.$.Name, DataTypes.EnumType);\r\n });\r\n schema.ComplexType?.forEach((ct) => {\r\n this.addModel2Type(ns, alias, ct.$.Name, DataTypes.ComplexType);\r\n });\r\n schema.EntityType?.forEach((et) => {\r\n this.addModel2Type(ns, alias, et.$.Name, DataTypes.ModelType);\r\n });\r\n });\r\n }\r\n\r\n private addModel2Type(ns: string, alias: string | undefined, name: string, dt: DataTypes) {\r\n this.model2Type.set(withNamespace(ns, name), dt);\r\n if (alias) {\r\n this.model2Type.set(withNamespace(alias, name), dt);\r\n }\r\n }\r\n\r\n protected abstract getNavigationProps(entityType: ET | ComplexType): Array<Property>;\r\n\r\n protected abstract digestOperations(schema: SchemaV3 | SchemaV4): void;\r\n\r\n protected abstract digestEntityContainer(schema: SchemaV3 | SchemaV4): void;\r\n\r\n /**\r\n * Get essential infos about a given odata type from the version specific service variants.\r\n *\r\n * @param type\r\n * @return tuple of return type, query object, query collection object\r\n */\r\n protected abstract mapODataType(type: string): TypeModel;\r\n\r\n public async digest(): Promise<DataModel> {\r\n this.digestEntityTypesAndOperations();\r\n\r\n // delegate to version specific entity container digestion\r\n this.schemas.forEach((schema) => this.digestEntityContainer(schema));\r\n\r\n return this.dataModel;\r\n }\r\n\r\n private digestEntityTypesAndOperations() {\r\n this.schemas.forEach((schema) => {\r\n const ns: NamespaceWithAlias = [schema.$.Namespace, schema.$.Alias];\r\n\r\n // type definitions: alias for primitive types\r\n this.addTypeDefinition(schema.$.Namespace, schema.TypeDefinition);\r\n\r\n // enums\r\n if (schema.EnumType) {\r\n for (const et of schema.EnumType) {\r\n const odataName = et.$.Name;\r\n const fqName = withNamespace(ns[0], odataName);\r\n this.dataModel.addEnum(ns[0], odataName, {\r\n fqName,\r\n odataName,\r\n name: this.namingHelper.getEnumName(odataName),\r\n members: et.Member.map((m) => m.$.Name),\r\n });\r\n }\r\n }\r\n\r\n // complex types\r\n this.addComplexType(ns, schema.ComplexType);\r\n\r\n // entity types\r\n this.addEntityType(ns, schema.EntityType);\r\n\r\n // V4 only: function & action types\r\n this.digestOperations(schema);\r\n });\r\n\r\n this.postProcessModel();\r\n }\r\n\r\n private getBaseModel(namespace: NamespaceWithAlias, model: ComplexType) {\r\n const odataName = model.$.Name;\r\n const fqName = withNamespace(namespace[0], odataName);\r\n\r\n const entityConfig = this.serviceConfigHelper.findEntityConfigByName(namespace, odataName);\r\n const entityName = entityConfig?.mappedName || model.$.Name;\r\n\r\n // map properties respecting the config\r\n const props = [...(model.Property ?? []), ...this.getNavigationProps(model)].map((p) => {\r\n const epConfig = entityConfig?.properties?.find((ep) => ep.name === p.$.Name);\r\n return this.mapProp(p, epConfig);\r\n });\r\n\r\n // support for base types, i.e. extends clause of interfaces\r\n const baseClasses = [];\r\n if (model.$.BaseType) {\r\n baseClasses.push(model.$.BaseType);\r\n }\r\n\r\n return {\r\n fqName,\r\n odataName,\r\n name: this.namingHelper.getModelName(entityName),\r\n qName: this.namingHelper.getQName(entityName),\r\n editableName: this.namingHelper.getEditableModelName(entityName),\r\n baseClasses,\r\n props,\r\n baseProps: [], // postprocess required\r\n };\r\n }\r\n\r\n private addTypeDefinition(ns: string, types: Array<TypeDefinition> | undefined) {\r\n if (!types || !types.length) {\r\n return;\r\n }\r\n\r\n for (const t of types) {\r\n this.dataModel.addTypeDefinition(ns, t.$.Name, t.$.UnderlyingType);\r\n }\r\n }\r\n\r\n private addComplexType(namespace: NamespaceWithAlias, models: Array<ComplexType> | undefined) {\r\n if (!models || !models.length) {\r\n return;\r\n }\r\n\r\n for (const model of models) {\r\n const baseModel = this.getBaseModel(namespace, model);\r\n this.dataModel.addComplexType(namespace[0], baseModel.odataName, baseModel);\r\n }\r\n }\r\n\r\n private addEntityType(namespace: NamespaceWithAlias, models: Array<ET> | undefined) {\r\n if (!models || !models.length) {\r\n return;\r\n }\r\n\r\n for (const model of models) {\r\n const baseModel = this.getBaseModel(namespace, model);\r\n const entityConfig = this.serviceConfigHelper.findEntityConfigByName(namespace, model.$.Name);\r\n const entityName = entityConfig?.mappedName || model.$.Name;\r\n\r\n // key support: we add keys from this entity,\r\n // but not keys stemming from base classes (postprocess required)\r\n const keyNames: Array<string> = [];\r\n if (entityConfig?.keys?.length) {\r\n keyNames.push(...entityConfig.keys);\r\n } else {\r\n const entity = model as EntityType;\r\n if (entity.Key && entity.Key.length && entity.Key[0].PropertyRef.length) {\r\n const propNames = entity.Key[0].PropertyRef.map((key) => key.$.Name);\r\n keyNames.push(...propNames);\r\n }\r\n }\r\n\r\n this.dataModel.addEntityType(namespace[0], baseModel.odataName, {\r\n ...baseModel,\r\n idModelName: this.namingHelper.getIdModelName(entityName),\r\n qIdFunctionName: this.namingHelper.getQIdFunctionName(entityName),\r\n generateId: true,\r\n keyNames: keyNames, // postprocess required to include key specs from base classes\r\n keys: [], // postprocess required to include props from base classes\r\n getKeyUnion: () => keyNames.join(\" | \"),\r\n });\r\n }\r\n }\r\n\r\n private postProcessModel() {\r\n // complex types\r\n const complexTypes = this.dataModel.getComplexTypes();\r\n complexTypes.forEach((model) => {\r\n const [baseProps] = this.collectBaseClassPropsAndKeys(model, []);\r\n model.baseProps = baseProps;\r\n });\r\n // entity types\r\n const modelTypes = this.dataModel.getEntityTypes();\r\n modelTypes.forEach((model) => {\r\n const [baseProps, baseKeys, idName, qIdName] = this.collectBaseClassPropsAndKeys(model, []);\r\n model.baseProps = baseProps;\r\n\r\n if (!model.keyNames.length && idName) {\r\n model.idModelName = idName;\r\n model.qIdFunctionName = qIdName;\r\n model.generateId = false;\r\n }\r\n model.keyNames.unshift(...baseKeys);\r\n\r\n // sanity check: entity types require key specification\r\n if (!model.keyNames.length) {\r\n throw new Error(`Key property is missing from Entity \"${model.name}\" (${model.odataName})!`);\r\n }\r\n\r\n const isSingleKey = model.keyNames.length === 1;\r\n const props = [...model.baseProps, ...model.props];\r\n model.keys = model.keyNames.map((keyName) => {\r\n const prop = props.find((p) => p.odataName === keyName);\r\n if (!prop) {\r\n throw new Error(`Key with name [${keyName}] not found in props!`);\r\n }\r\n // automatically set key prop to managed, if this is the only key of the given entity\r\n if (prop.managed === undefined) {\r\n prop.managed = !this.options.disableAutoManagedKey && isSingleKey;\r\n }\r\n return prop;\r\n });\r\n });\r\n }\r\n\r\n private collectBaseClassPropsAndKeys(\r\n model: ComplexModelType,\r\n visitedModels: string[]\r\n ): [Array<PropertyModel>, Array<string>, string, string] {\r\n if (visitedModels.includes(model.fqName)) {\r\n throw new Error(`Cyclic inheritance detected for model ${model.fqName}!`);\r\n }\r\n visitedModels.push(model.fqName);\r\n return model.baseClasses.reduce(\r\n ([props, keys, idName, qIdName], bc) => {\r\n const baseModel = this.dataModel.getEntityType(bc) || this.dataModel.getComplexType(bc);\r\n if (!baseModel) {\r\n throw new Error(`BaseModel \"${bc}\" doesn't exist!`);\r\n }\r\n\r\n let idNameResult = idName;\r\n let qIdNameResult = qIdName;\r\n\r\n // recursive\r\n if (baseModel.baseClasses.length) {\r\n const [parentProps, parentKeys, parentIdName, parentQIdName] = this.collectBaseClassPropsAndKeys(\r\n baseModel,\r\n visitedModels\r\n );\r\n props.unshift(...parentProps);\r\n keys.unshift(...parentKeys);\r\n if (parentIdName) {\r\n idNameResult = parentIdName;\r\n qIdNameResult = parentQIdName;\r\n }\r\n }\r\n\r\n props.push(...baseModel.props);\r\n const entityModel = baseModel as ModelType;\r\n if (entityModel.keyNames?.length) {\r\n keys.push(...entityModel.keyNames.filter((kn) => !keys.includes(kn)));\r\n idNameResult = entityModel.idModelName;\r\n qIdNameResult = entityModel.qIdFunctionName;\r\n }\r\n return [props, keys, idNameResult, qIdNameResult];\r\n },\r\n [[], [], \"\", \"\"] as [Array<PropertyModel>, Array<string>, string, string]\r\n );\r\n }\r\n\r\n protected mapProp = (p: Property, entityPropConfig?: PropertyGenerationOptions | undefined): PropertyModel => {\r\n if (!p.$.Type) {\r\n throw new Error(`No type information given for property [${p.$.Name}]!`);\r\n }\r\n\r\n const configProp = this.serviceConfigHelper.findPropConfigByName(p.$.Name);\r\n const name = this.namingHelper.getModelPropName(entityPropConfig?.mappedName || configProp?.mappedName || p.$.Name);\r\n const isCollection = !!p.$.Type.match(/^Collection\\(/);\r\n let dataType = p.$.Type.replace(/^Collection\\(([^\\)]+)\\)/, \"$1\");\r\n\r\n // support for primitive type mapping\r\n if (this.namingHelper.includesServicePrefix(dataType)) {\r\n const dt = this.dataModel.getPrimitiveType(dataType);\r\n if (dt !== undefined) {\r\n dataType = dt;\r\n }\r\n }\r\n\r\n let result: Pick<PropertyModel, \"dataType\" | \"type\" | \"typeModule\" | \"qPath\" | \"qParam\" | \"qObject\" | \"converters\">;\r\n\r\n // domain object known from service:\r\n // EntityType, ComplexType, EnumType\r\n if (this.namingHelper.includesServicePrefix(dataType)) {\r\n const resultDt = this.model2Type.get(dataType)!;\r\n if (!resultDt) {\r\n throw new Error(\r\n `Couldn't determine model data type for property \"${p.$.Name}\"! Given data type: \"${dataType}\".`\r\n );\r\n }\r\n\r\n // special handling for enums\r\n if (resultDt === DataTypes.EnumType) {\r\n result = {\r\n dataType: resultDt,\r\n type: this.namingHelper.getEnumName(dataType),\r\n qPath: \"QEnumPath\",\r\n qObject: isCollection ? \"QEnumCollection\" : undefined,\r\n qParam: \"QEnumParam\",\r\n };\r\n }\r\n // handling of complex & entity types\r\n else {\r\n result = {\r\n dataType: resultDt,\r\n type: this.namingHelper.getModelName(dataType),\r\n qPath: \"QEntityPath\",\r\n qObject: this.namingHelper.getQName(dataType),\r\n qParam: \"QComplexParam\",\r\n };\r\n }\r\n }\r\n // OData built-in data types\r\n else if (dataType.startsWith(Digester.EDM_PREFIX)) {\r\n const { outputType, qPath, qParam, qCollection } = this.mapODataType(dataType);\r\n const { to, toModule: typeModule, converters } = this.dataModel.getConverter(dataType) || {};\r\n\r\n const type = !to ? outputType : to.startsWith(Digester.EDM_PREFIX) ? this.mapODataType(to).outputType : to;\r\n\r\n result = {\r\n dataType: DataTypes.PrimitiveType,\r\n type,\r\n typeModule,\r\n qPath,\r\n qParam,\r\n qObject: isCollection ? qCollection : undefined,\r\n converters,\r\n };\r\n } else {\r\n throw new Error(\r\n `Unknown type [${dataType}]: Not 'Collection(...)', not OData type 'Edm.*', not starting with one of the namespaces!W`\r\n );\r\n }\r\n\r\n return {\r\n odataName: p.$.Name,\r\n name,\r\n odataType: p.$.Type,\r\n fqType: dataType,\r\n required: p.$.Nullable === \"false\",\r\n isCollection: isCollection,\r\n managed: typeof entityPropConfig?.managed !== \"undefined\" ? entityPropConfig.managed : configProp?.managed,\r\n ...result,\r\n };\r\n };\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"DataModelDigestion.js","sourceRoot":"","sources":["../../src/data-model/DataModelDigestion.ts"],"names":[],"mappings":"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","sourcesContent":["import { MappedConverterChains } from \"@odata2ts/converter-runtime\";\n\nimport { DigestionOptions } from \"../FactoryFunctionModel\";\nimport { ComplexTypeGenerationOptions, EntityTypeGenerationOptions, PropertyGenerationOptions } from \"../OptionModel\";\nimport { DataModel, NamespaceWithAlias, withNamespace } from \"./DataModel\";\nimport { ComplexType as ComplexModelType, DataTypes, ModelType, ODataVersion, PropertyModel } from \"./DataTypeModel\";\nimport { ComplexType, EntityType, EnumType, Property, Schema, TypeDefinition } from \"./edmx/ODataEdmxModelBase\";\nimport { SchemaV3 } from \"./edmx/ODataEdmxModelV3\";\nimport { SchemaV4 } from \"./edmx/ODataEdmxModelV4\";\nimport { NamingHelper } from \"./NamingHelper\";\nimport { ServiceConfigHelper, WithoutName } from \"./ServiceConfigHelper\";\nimport { NameValidator } from \"./validation/NameValidator\";\n\nexport interface TypeModel {\n outputType: string;\n qPath: string;\n qCollection: string;\n qParam: string | undefined;\n}\n\nexport abstract class Digester<S extends Schema<ET, CT>, ET extends EntityType, CT extends ComplexType> {\n protected static EDM_PREFIX = \"Edm.\";\n\n protected readonly dataModel: DataModel;\n protected readonly serviceConfigHelper: ServiceConfigHelper;\n protected readonly nameValidator: NameValidator;\n\n private model2Type = new Map<string, DataTypes>();\n\n protected constructor(\n protected version: ODataVersion,\n protected schemas: Array<S>,\n protected options: DigestionOptions,\n protected namingHelper: NamingHelper,\n converters?: MappedConverterChains\n ) {\n const namespaces = schemas.map<NamespaceWithAlias>((s) => [s.$.Namespace, s.$.Alias]);\n this.dataModel = new DataModel(namespaces, version, converters);\n this.serviceConfigHelper = new ServiceConfigHelper(options);\n this.nameValidator = new NameValidator(options);\n\n this.collectModelTypes(schemas);\n }\n\n private collectModelTypes(schemas: Array<S>) {\n schemas.forEach((schema) => {\n const { Namespace: ns, Alias: alias } = schema.$;\n\n schema.EnumType?.forEach((et) => {\n this.addModel2Type(ns, alias, et.$.Name, DataTypes.EnumType);\n });\n schema.ComplexType?.forEach((ct) => {\n this.addModel2Type(ns, alias, ct.$.Name, DataTypes.ComplexType);\n });\n schema.EntityType?.forEach((et) => {\n this.addModel2Type(ns, alias, et.$.Name, DataTypes.ModelType);\n });\n });\n }\n\n private addModel2Type(ns: string, alias: string | undefined, name: string, dt: DataTypes) {\n this.model2Type.set(withNamespace(ns, name), dt);\n if (alias) {\n this.model2Type.set(withNamespace(alias, name), dt);\n }\n }\n\n protected abstract getNavigationProps(entityType: ET | ComplexType): Array<Property>;\n\n protected abstract digestOperations(schema: SchemaV3 | SchemaV4): void;\n\n protected abstract digestEntityContainer(schema: SchemaV3 | SchemaV4): void;\n\n /**\n * Get essential infos about a given odata type from the version specific service variants.\n *\n * @param type\n * @return tuple of return type, query object, query collection object\n */\n protected abstract mapODataType(type: string): TypeModel;\n\n public async digest(): Promise<DataModel> {\n this.digestEntityTypesAndOperations();\n\n // delegate to version specific entity container digestion\n this.schemas.forEach((schema) => this.digestEntityContainer(schema));\n\n this.dataModel.setNameValidation(this.nameValidator.validate());\n return this.dataModel;\n }\n\n private digestEntityTypesAndOperations() {\n this.schemas.forEach((schema) => {\n const ns: NamespaceWithAlias = [schema.$.Namespace, schema.$.Alias];\n\n // type definitions: alias for primitive types\n this.addTypeDefinition(schema.$.Namespace, schema.TypeDefinition);\n\n // enums\n this.addEnum(ns, schema.EnumType);\n\n // complex types\n this.addComplexType(ns, schema.ComplexType);\n\n // entity types\n this.addEntityType(ns, schema.EntityType);\n\n // V4 only: function & action types\n this.digestOperations(schema);\n });\n\n this.postProcessModel();\n }\n\n private getBaseModel(\n entityConfig: WithoutName<EntityTypeGenerationOptions | ComplexTypeGenerationOptions> | undefined,\n model: ComplexType,\n name: string,\n fqName: string\n ) {\n const odataName = model.$.Name;\n\n // map properties respecting the config\n const props = [...(model.Property ?? []), ...this.getNavigationProps(model)].map((p) => {\n const epConfig = entityConfig?.properties?.find((ep) => ep.name === p.$.Name);\n return this.mapProp(p, epConfig);\n });\n\n // support for base types, i.e. extends clause of interfaces\n const baseClasses = [];\n let finalBaseClass: string | undefined = undefined;\n if (model.$.BaseType) {\n baseClasses.push(model.$.BaseType);\n const [baseName, basePrefix] = this.namingHelper.getNameAndServicePrefix(model.$.BaseType);\n const baseConfig =\n this.serviceConfigHelper.findEntityTypeConfig([basePrefix!], baseName) ||\n this.serviceConfigHelper.findComplexTypeConfig([basePrefix!], baseName);\n finalBaseClass = baseConfig?.mappedName ?? baseName;\n }\n\n return {\n fqName,\n odataName,\n name: this.namingHelper.getModelName(name),\n qName: this.namingHelper.getQName(name),\n editableName: this.namingHelper.getEditableModelName(name),\n baseClasses,\n finalBaseClass,\n props,\n baseProps: [], // postprocess required\n };\n }\n\n private addTypeDefinition(ns: string, types: Array<TypeDefinition> | undefined) {\n if (!types || !types.length) {\n return;\n }\n\n for (const t of types) {\n this.dataModel.addTypeDefinition(ns, t.$.Name, t.$.UnderlyingType);\n }\n }\n\n private addEnum(namespace: NamespaceWithAlias, models: Array<EnumType> | undefined) {\n if (!models || !models.length) {\n return;\n }\n\n for (const et of models) {\n const odataName = et.$.Name;\n const fqName = withNamespace(namespace[0], odataName);\n const config = this.serviceConfigHelper.findEnumTypeConfig(namespace, odataName);\n const enumName = this.nameValidator.addEnumType(fqName, config?.mappedName || odataName);\n\n this.dataModel.addEnum(namespace[0], odataName, {\n fqName,\n odataName,\n name: this.namingHelper.getEnumName(enumName),\n members: et.Member.map((m) => m.$.Name),\n });\n }\n }\n\n private addComplexType(namespace: NamespaceWithAlias, models: Array<ComplexType> | undefined) {\n if (!models || !models.length) {\n return;\n }\n\n for (const model of models) {\n const config = this.serviceConfigHelper.findComplexTypeConfig(namespace, model.$.Name);\n const fqName = withNamespace(namespace[0], model.$.Name);\n const name = this.nameValidator.addComplexType(fqName, config?.mappedName || model.$.Name);\n const baseModel = this.getBaseModel(config, model, name, fqName);\n this.dataModel.addComplexType(namespace[0], baseModel.odataName, baseModel);\n }\n }\n\n private addEntityType(namespace: NamespaceWithAlias, models: Array<ET> | undefined) {\n if (!models || !models.length) {\n return;\n }\n\n for (const model of models) {\n const entityConfig = this.serviceConfigHelper.findEntityTypeConfig(namespace, model.$.Name);\n const fqName = withNamespace(namespace[0], model.$.Name);\n const name = this.nameValidator.addEntityType(fqName, entityConfig?.mappedName || model.$.Name);\n const baseModel = this.getBaseModel(entityConfig, model, name, fqName);\n\n // key support: we add keys from this entity,\n // but not keys stemming from base classes (postprocess required)\n const keyNames: Array<string> = [];\n if (entityConfig?.keys?.length) {\n keyNames.push(...entityConfig.keys);\n } else {\n const entity = model as EntityType;\n if (entity.Key && entity.Key.length && entity.Key[0].PropertyRef.length) {\n const propNames = entity.Key[0].PropertyRef.map((key) => key.$.Name);\n keyNames.push(...propNames);\n }\n }\n\n this.dataModel.addEntityType(namespace[0], baseModel.odataName, {\n ...baseModel,\n idModelName: this.namingHelper.getIdModelName(name),\n qIdFunctionName: this.namingHelper.getQIdFunctionName(name),\n generateId: true,\n keyNames: keyNames, // postprocess required to include key specs from base classes\n keys: [], // postprocess required to include props from base classes\n getKeyUnion: () => keyNames.join(\" | \"),\n });\n }\n }\n\n private postProcessModel() {\n // complex types\n const complexTypes = this.dataModel.getComplexTypes();\n complexTypes.forEach((ct) => {\n const [baseProps] = this.collectBaseClassPropsAndKeys(ct, []);\n ct.baseProps = baseProps;\n });\n // entity types\n const entityTypes = this.dataModel.getEntityTypes();\n entityTypes.forEach((et) => {\n const [baseProps, baseKeys, idName, qIdName] = this.collectBaseClassPropsAndKeys(et, []);\n et.baseProps = baseProps;\n\n if (!et.keyNames.length && idName) {\n et.idModelName = idName;\n et.qIdFunctionName = qIdName;\n et.generateId = false;\n }\n et.keyNames.unshift(...baseKeys);\n\n // sanity check: entity types require key specification\n if (!et.keyNames.length) {\n throw new Error(`Key property is missing from Entity \"${et.name}\" (${et.odataName})!`);\n }\n\n const isSingleKey = et.keyNames.length === 1;\n const props = [...et.baseProps, ...et.props];\n et.keys = et.keyNames.map((keyName) => {\n const prop = props.find((p) => p.odataName === keyName);\n if (!prop) {\n throw new Error(`Key with name [${keyName}] not found in props!`);\n }\n // automatically set key prop to managed, if this is the only key of the given entity\n if (prop.managed === undefined) {\n prop.managed = !this.options.disableAutoManagedKey && isSingleKey;\n }\n return prop;\n });\n });\n }\n\n private collectBaseClassPropsAndKeys(\n model: ComplexModelType,\n visitedModels: string[]\n ): [Array<PropertyModel>, Array<string>, string, string] {\n if (visitedModels.includes(model.fqName)) {\n throw new Error(`Cyclic inheritance detected for model ${model.fqName}!`);\n }\n visitedModels.push(model.fqName);\n return model.baseClasses.reduce(\n ([props, keys, idName, qIdName], bc) => {\n const baseModel = this.dataModel.getEntityType(bc) || this.dataModel.getComplexType(bc);\n if (!baseModel) {\n throw new Error(`BaseModel \"${bc}\" doesn't exist!`);\n }\n\n let idNameResult = idName;\n let qIdNameResult = qIdName;\n\n // recursive\n if (baseModel.baseClasses.length) {\n const [parentProps, parentKeys, parentIdName, parentQIdName] = this.collectBaseClassPropsAndKeys(\n baseModel,\n visitedModels\n );\n props.unshift(...parentProps);\n keys.unshift(...parentKeys);\n if (parentIdName) {\n idNameResult = parentIdName;\n qIdNameResult = parentQIdName;\n }\n }\n\n props.push(...baseModel.props);\n const entityModel = baseModel as ModelType;\n if (entityModel.keyNames?.length) {\n keys.push(...entityModel.keyNames.filter((kn) => !keys.includes(kn)));\n idNameResult = entityModel.idModelName;\n qIdNameResult = entityModel.qIdFunctionName;\n }\n return [props, keys, idNameResult, qIdNameResult];\n },\n [[], [], \"\", \"\"] as [Array<PropertyModel>, Array<string>, string, string]\n );\n }\n\n protected mapProp = (p: Property, entityPropConfig?: PropertyGenerationOptions | undefined): PropertyModel => {\n if (!p.$.Type) {\n throw new Error(`No type information given for property [${p.$.Name}]!`);\n }\n\n const configProp = this.serviceConfigHelper.findPropConfigByName(p.$.Name);\n const name = this.namingHelper.getModelPropName(entityPropConfig?.mappedName || configProp?.mappedName || p.$.Name);\n const isCollection = !!p.$.Type.match(/^Collection\\(/);\n let dataType = p.$.Type.replace(/^Collection\\(([^\\)]+)\\)/, \"$1\");\n\n // support for primitive type mapping\n if (this.namingHelper.includesServicePrefix(dataType)) {\n const dt = this.dataModel.getPrimitiveType(dataType);\n if (dt !== undefined) {\n dataType = dt;\n }\n }\n\n let result: Pick<PropertyModel, \"dataType\" | \"type\" | \"typeModule\" | \"qPath\" | \"qParam\" | \"qObject\" | \"converters\">;\n\n // domain object known from service:\n // EntityType, ComplexType, EnumType\n if (this.namingHelper.includesServicePrefix(dataType)) {\n const resultDt = this.model2Type.get(dataType)!;\n const [dataTypeName, dataTypePrefix] = this.namingHelper.getNameAndServicePrefix(dataType);\n const dataTypeNamespace: NamespaceWithAlias = [dataTypePrefix!];\n if (!resultDt) {\n throw new Error(\n `Couldn't determine model data type for property \"${p.$.Name}\"! Given data type: \"${dataType}\".`\n );\n }\n\n // special handling for enums\n if (resultDt === DataTypes.EnumType) {\n const enumConfig = this.serviceConfigHelper.findEnumTypeConfig(dataTypeNamespace, dataTypeName);\n result = {\n dataType: resultDt,\n type: this.namingHelper.getEnumName(enumConfig?.mappedName ?? dataType),\n qPath: \"QEnumPath\",\n qObject: isCollection ? \"QEnumCollection\" : undefined,\n qParam: \"QEnumParam\",\n };\n }\n // handling of complex & entity types\n else {\n const entityConfig =\n resultDt === DataTypes.ComplexType\n ? this.serviceConfigHelper.findComplexTypeConfig(dataTypeNamespace, dataTypeName)\n : this.serviceConfigHelper.findEntityTypeConfig(dataTypeNamespace, dataTypeName);\n const resultDataType = entityConfig?.mappedName ?? dataType;\n result = {\n dataType: resultDt,\n type: this.namingHelper.getModelName(resultDataType),\n qPath: \"QEntityPath\",\n qObject: this.namingHelper.getQName(resultDataType),\n qParam: \"QComplexParam\",\n };\n }\n }\n // OData built-in data types\n else if (dataType.startsWith(Digester.EDM_PREFIX)) {\n const { outputType, qPath, qParam, qCollection } = this.mapODataType(dataType);\n const { to, toModule: typeModule, converters } = this.dataModel.getConverter(dataType) || {};\n\n const type = !to ? outputType : to.startsWith(Digester.EDM_PREFIX) ? this.mapODataType(to).outputType : to;\n\n result = {\n dataType: DataTypes.PrimitiveType,\n type,\n typeModule,\n qPath,\n qParam,\n qObject: isCollection ? qCollection : undefined,\n converters,\n };\n } else {\n throw new Error(\n `Unknown type [${dataType}]: Not 'Collection(...)', not OData type 'Edm.*', not starting with one of the namespaces!W`\n );\n }\n\n return {\n odataName: p.$.Name,\n name,\n odataType: p.$.Type,\n fqType: dataType,\n required: p.$.Nullable === \"false\",\n isCollection: isCollection,\n managed: typeof entityPropConfig?.managed !== \"undefined\" ? entityPropConfig.managed : configProp?.managed,\n ...result,\n };\n };\n}\n"]}
|
|
@@ -61,16 +61,15 @@ class DigesterV3 extends DataModelDigestion_1.Digester {
|
|
|
61
61
|
digestOperations(schema) { }
|
|
62
62
|
digestEntityContainer(schema) {
|
|
63
63
|
var _a, _b;
|
|
64
|
-
const namespace = schema.$.Namespace;
|
|
65
|
-
const alias = schema.$.Alias;
|
|
66
64
|
if (schema.EntityContainer && schema.EntityContainer.length) {
|
|
67
65
|
const container = schema.EntityContainer[0];
|
|
66
|
+
const ecName = container.$.Name;
|
|
68
67
|
(_a = container.FunctionImport) === null || _a === void 0 ? void 0 : _a.forEach((funcImport) => {
|
|
69
68
|
var _a, _b, _c, _d;
|
|
70
69
|
const odataName = funcImport.$.Name;
|
|
71
|
-
const fqName = (0, DataModel_1.withNamespace)(
|
|
72
|
-
const opConfig = this.serviceConfigHelper.
|
|
73
|
-
const opName = (opConfig === null || opConfig === void 0 ? void 0 : opConfig.mappedName) || odataName;
|
|
70
|
+
const fqName = (0, DataModel_1.withNamespace)(ecName, odataName);
|
|
71
|
+
const opConfig = this.serviceConfigHelper.findOperationImportConfig(ecName, odataName);
|
|
72
|
+
const opName = this.nameValidator.addOperationImportType(fqName, (opConfig === null || opConfig === void 0 ? void 0 : opConfig.mappedName) || odataName);
|
|
74
73
|
const name = this.namingHelper.getFunctionName(opName);
|
|
75
74
|
const usePost = ((_a = funcImport.$["m:HttpMethod"]) === null || _a === void 0 ? void 0 : _a.toUpperCase()) === "POST";
|
|
76
75
|
const parameters = (_c = (_b = funcImport.Parameter) === null || _b === void 0 ? void 0 : _b.map((p) => this.mapProp(p))) !== null && _c !== void 0 ? _c : [];
|
|
@@ -83,7 +82,7 @@ class DigesterV3 extends DataModelDigestion_1.Digester {
|
|
|
83
82
|
: undefined;
|
|
84
83
|
// V2 only knows the FunctionImport element
|
|
85
84
|
// we generate the data structure for the function here
|
|
86
|
-
this.dataModel.addUnboundOperationType(
|
|
85
|
+
this.dataModel.addUnboundOperationType(ecName, {
|
|
87
86
|
fqName,
|
|
88
87
|
odataName,
|
|
89
88
|
name,
|
|
@@ -103,15 +102,17 @@ class DigesterV3 extends DataModelDigestion_1.Digester {
|
|
|
103
102
|
});
|
|
104
103
|
});
|
|
105
104
|
(_b = container.EntitySet) === null || _b === void 0 ? void 0 : _b.forEach((entitySet) => {
|
|
106
|
-
const
|
|
107
|
-
const fqName = (0, DataModel_1.withNamespace)(
|
|
105
|
+
const odataName = entitySet.$.Name;
|
|
106
|
+
const fqName = (0, DataModel_1.withNamespace)(ecName, odataName);
|
|
107
|
+
const config = this.serviceConfigHelper.findEntitySetConfig(ecName, odataName);
|
|
108
|
+
const name = this.nameValidator.addEntitySet(fqName, (config === null || config === void 0 ? void 0 : config.mappedName) || odataName);
|
|
108
109
|
const entityType = this.dataModel.getEntityType(entitySet.$.EntityType);
|
|
109
110
|
if (!entityType) {
|
|
110
111
|
throw new Error(`Entity type "${entitySet.$.EntityType}" not found!`);
|
|
111
112
|
}
|
|
112
113
|
this.dataModel.addEntitySet(fqName, {
|
|
113
114
|
fqName,
|
|
114
|
-
odataName
|
|
115
|
+
odataName,
|
|
115
116
|
name,
|
|
116
117
|
entityType,
|
|
117
118
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataModelDigestionV2.js","sourceRoot":"","sources":["../../src/data-model/DataModelDigestionV2.ts"],"names":[],"mappings":"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","sourcesContent":["import { MappedConverterChains, loadConverters } from \"@odata2ts/converter-runtime\";\nimport { ODataTypesV2, ODataVersions } from \"@odata2ts/odata-core\";\n\nimport { DigesterFunction, DigestionOptions } from \"../FactoryFunctionModel\";\nimport { withNamespace } from \"./DataModel\";\nimport { Digester, TypeModel } from \"./DataModelDigestion\";\nimport { ODataVersion, OperationTypes, PropertyModel } from \"./DataTypeModel\";\nimport { ComplexType, Property } from \"./edmx/ODataEdmxModelBase\";\nimport { AssociationEnd, ComplexTypeV3, EntityTypeV3, NavigationProperty, SchemaV3 } from \"./edmx/ODataEdmxModelV3\";\nimport { NamingHelper } from \"./NamingHelper\";\n\n/**\n * Digests an EDMX schema to produce a DataModel.\n *\n * @param schemas\n * @param options\n * @param namingHelper\n */\nexport const digest: DigesterFunction<SchemaV3> = async (schemas, options, namingHelper) => {\n const converters = await loadConverters(ODataVersions.V2, options.converters);\n\n const digester = new DigesterV3(schemas, options, namingHelper, converters);\n return digester.digest();\n};\n\nclass DigesterV3 extends Digester<SchemaV3, EntityTypeV3, ComplexTypeV3> {\n constructor(\n schemas: Array<SchemaV3>,\n options: DigestionOptions,\n namingHelper: NamingHelper,\n converters: MappedConverterChains | undefined\n ) {\n super(ODataVersion.V2, schemas, options, namingHelper, converters);\n }\n\n private findAssociationEnd(np: NavigationProperty): AssociationEnd {\n for (let schema of this.schemas) {\n if (schema.Association) {\n const relationship = this.namingHelper.stripServicePrefix(np.$.Relationship);\n const association = schema.Association?.find((a) => a.$.Name === relationship);\n const result = association?.End.find((e) => e.$.Role === np.$.ToRole);\n if (result) {\n return result;\n }\n }\n }\n throw new Error(`Association end couldn't be determined for NavigationProperty [${np.$.Name}]`);\n }\n\n protected getNavigationProps(entityType: ComplexType | EntityTypeV3): Array<Property> {\n // return (entityType as EntityTypeV3).NavigationProperty || [];\n const et = entityType as EntityTypeV3;\n if (et.NavigationProperty) {\n return et.NavigationProperty.map((np) => {\n const end = this.findAssociationEnd(np);\n const isRequired = end.$.Multiplicity !== \"*\" && !end.$.Multiplicity.startsWith(\"0..\");\n const isCollection = end.$.Multiplicity !== \"1\" && !end.$.Multiplicity.endsWith(\"..1\");\n\n return {\n $: {\n Name: np.$.Name,\n Type: isCollection ? `Collection(${end.$.Type})` : end.$.Type,\n Nullable: isRequired ? \"false\" : \"true\",\n },\n };\n });\n }\n\n return [];\n }\n\n // in V2 all we have & need is the FunctionImport: Function & Action elements are only known in V4.\n protected digestOperations(schema: SchemaV3) {}\n\n protected digestEntityContainer(schema: SchemaV3) {\n const namespace = schema.$.Namespace;\n const alias = schema.$.Alias;\n if (schema.EntityContainer && schema.EntityContainer.length) {\n const container = schema.EntityContainer[0];\n\n container.FunctionImport?.forEach((funcImport) => {\n const odataName = funcImport.$.Name;\n const fqName = withNamespace(namespace, odataName);\n const opConfig = this.serviceConfigHelper.findOperationConfigByName([namespace, alias], odataName);\n const opName = opConfig?.mappedName || odataName;\n const name = this.namingHelper.getFunctionName(opName);\n const usePost = funcImport.$[\"m:HttpMethod\"]?.toUpperCase() === \"POST\";\n const parameters = funcImport.Parameter?.map((p) => this.mapProp(p)) ?? [];\n\n // TODO: the spec allows for multiple ReturnType elements\n // https://docs.microsoft.com/en-us/openspecs/windows_protocols/mc-csdl/f510f36a-36bf-47f4-ac41-4a0ff921fbfa\n // totally unclear how the response object would look like\n const returnTypeDef =\n funcImport.$.ReturnType || (funcImport.ReturnType?.length ? funcImport.ReturnType[0].$.Type : undefined);\n const returnType: PropertyModel | undefined = returnTypeDef\n ? this.mapProp({ $: { Name: \"NO_NAME_BECAUSE_RETURN_TYPE\", Type: returnTypeDef } })\n : undefined;\n\n // V2 only knows the FunctionImport element\n // we generate the data structure for the function here\n this.dataModel.addUnboundOperationType(namespace, {\n fqName,\n odataName,\n name,\n paramsModelName: this.namingHelper.getOperationParamsModelName(opName),\n qName: this.namingHelper.getQFunctionName(opName),\n type: OperationTypes.Function,\n parameters,\n returnType,\n usePost,\n });\n\n this.dataModel.addFunction(fqName, {\n fqName,\n odataName,\n name,\n entitySet: funcImport.$.EntitySet!,\n operation: fqName,\n });\n });\n\n container.EntitySet?.forEach((entitySet) => {\n const name = entitySet.$.Name;\n const fqName = withNamespace(namespace, name);\n const entityType = this.dataModel.getEntityType(entitySet.$.EntityType);\n if (!entityType) {\n throw new Error(`Entity type \"${entitySet.$.EntityType}\" not found!`);\n }\n\n this.dataModel.addEntitySet(fqName, {\n fqName,\n odataName: name,\n name,\n entityType,\n });\n });\n }\n }\n\n protected mapODataType(type: string): TypeModel {\n switch (type) {\n case ODataTypesV2.Boolean:\n return {\n outputType: \"boolean\",\n qPath: \"QBooleanPath\",\n qCollection: \"QBooleanCollection\",\n qParam: \"QBooleanParam\",\n };\n case ODataTypesV2.Int16:\n case ODataTypesV2.Int32:\n return {\n outputType: \"number\",\n qPath: \"QNumberV2Path\",\n qCollection: \"QNumberV2Collection\",\n qParam: \"QNumberParam\",\n };\n case ODataTypesV2.Byte:\n case ODataTypesV2.SByte:\n return {\n outputType: \"string\",\n qPath: \"QStringNumberV2Path\",\n qCollection: \"QStringNumberV2Collection\",\n qParam: \"QStringNumberV2Param\",\n };\n case ODataTypesV2.Int64:\n return {\n outputType: \"string\",\n qPath: \"QStringNumberV2Path\",\n qCollection: \"QStringNumberV2Collection\",\n qParam: \"QInt64V2Param\",\n };\n case ODataTypesV2.Single:\n return {\n outputType: \"string\",\n qPath: \"QStringNumberV2Path\",\n qCollection: \"QStringNumberV2Collection\",\n qParam: \"QSingleV2Param\",\n };\n case ODataTypesV2.Double:\n return {\n outputType: \"string\",\n qPath: \"QStringNumberV2Path\",\n qCollection: \"QStringNumberV2Collection\",\n qParam: \"QDoubleV2Param\",\n };\n case ODataTypesV2.Decimal:\n return {\n outputType: \"string\",\n qPath: \"QStringNumberV2Path\",\n qCollection: \"QStringNumberV2Collection\",\n qParam: \"QDecimalV2Param\",\n };\n case ODataTypesV2.String:\n return {\n outputType: \"string\",\n qPath: \"QStringV2Path\",\n qCollection: \"QStringV2Collection\",\n qParam: \"QStringParam\",\n };\n case ODataTypesV2.DateTime:\n return {\n outputType: \"string\",\n qPath: \"QDateTimeV2Path\",\n qCollection: \"QDateTimeV2Collection\",\n qParam: \"QDateTimeV2Param\",\n };\n case ODataTypesV2.Time:\n return {\n outputType: \"string\",\n qPath: \"QTimeV2Path\",\n qCollection: \"QTimeV2Collection\",\n qParam: \"QTimeV2Param\",\n };\n case ODataTypesV2.DateTimeOffset:\n return {\n outputType: \"string\",\n qPath: \"QDateTimeOffsetV2Path\",\n qCollection: \"QDateTimeOffsetV2Collection\",\n qParam: \"QDateTimeOffsetV2Param\",\n };\n case ODataTypesV2.Binary:\n return {\n outputType: \"string\",\n qPath: \"QBinaryPath\",\n qCollection: \"QBinaryCollection\",\n qParam: undefined,\n };\n case ODataTypesV2.Guid:\n return {\n outputType: \"string\",\n qPath: \"QGuidV2Path\",\n qCollection: \"QGuidV2Collection\",\n qParam: \"QGuidV2Param\",\n };\n default:\n return {\n outputType: \"string\",\n qPath: \"QStringV2Path\",\n qCollection: \"QStringV2Collection\",\n qParam: undefined,\n };\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"DataModelDigestionV2.js","sourceRoot":"","sources":["../../src/data-model/DataModelDigestionV2.ts"],"names":[],"mappings":";;;;AAAA,mEAAoF;AACpF,qDAAmE;AAGnE,2CAA4C;AAC5C,6DAA2D;AAC3D,mDAA8E;AAK9E;;;;;;GAMG;AACI,MAAM,MAAM,GAA+B,CAAO,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE;IACzF,MAAM,UAAU,GAAG,MAAM,IAAA,kCAAc,EAAC,0BAAa,CAAC,EAAE,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAE9E,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;IAC5E,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAC;AAC3B,CAAC,CAAA,CAAC;AALW,QAAA,MAAM,UAKjB;AAEF,MAAM,UAAW,SAAQ,6BAA+C;IACtE,YACE,OAAwB,EACxB,OAAyB,EACzB,YAA0B,EAC1B,UAA6C;QAE7C,KAAK,CAAC,4BAAY,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;IACrE,CAAC;IAEO,kBAAkB,CAAC,EAAsB;;QAC/C,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE;YAC/B,IAAI,MAAM,CAAC,WAAW,EAAE;gBACtB,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;gBAC7E,MAAM,WAAW,GAAG,MAAA,MAAM,CAAC,WAAW,0CAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;gBAC/E,MAAM,MAAM,GAAG,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBACtE,IAAI,MAAM,EAAE;oBACV,OAAO,MAAM,CAAC;iBACf;aACF;SACF;QACD,MAAM,IAAI,KAAK,CAAC,kEAAkE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IAClG,CAAC;IAES,kBAAkB,CAAC,UAAsC;QACjE,gEAAgE;QAChE,MAAM,EAAE,GAAG,UAA0B,CAAC;QACtC,IAAI,EAAE,CAAC,kBAAkB,EAAE;YACzB,OAAO,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;gBACtC,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;gBACxC,MAAM,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,YAAY,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACvF,MAAM,YAAY,GAAG,GAAG,CAAC,CAAC,CAAC,YAAY,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAEvF,OAAO;oBACL,CAAC,EAAE;wBACD,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI;wBACf,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;wBAC7D,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;qBACxC;iBACF,CAAC;YACJ,CAAC,CAAC,CAAC;SACJ;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,mGAAmG;IACzF,gBAAgB,CAAC,MAAgB,IAAG,CAAC;IAErC,qBAAqB,CAAC,MAAgB;;QAC9C,IAAI,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE;YAC3D,MAAM,SAAS,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;YAEhC,MAAA,SAAS,CAAC,cAAc,0CAAE,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE;;gBAC/C,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;gBACpC,MAAM,MAAM,GAAG,IAAA,yBAAa,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,yBAAyB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBACvF,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAAC,MAAM,EAAE,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,UAAU,KAAI,SAAS,CAAC,CAAC;gBACpG,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;gBACvD,MAAM,OAAO,GAAG,CAAA,MAAA,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,0CAAE,WAAW,EAAE,MAAK,MAAM,CAAC;gBACvE,MAAM,UAAU,GAAG,MAAA,MAAA,UAAU,CAAC,SAAS,0CAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,mCAAI,EAAE,CAAC;gBAE3E,yDAAyD;gBACzD,4GAA4G;gBAC5G,0DAA0D;gBAC1D,MAAM,aAAa,GACjB,UAAU,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAA,MAAA,UAAU,CAAC,UAAU,0CAAE,MAAM,EAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBAC3G,MAAM,UAAU,GAA8B,aAAa;oBACzD,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,6BAA6B,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC;oBACnF,CAAC,CAAC,SAAS,CAAC;gBAEd,2CAA2C;gBAC3C,uDAAuD;gBACvD,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,MAAM,EAAE;oBAC7C,MAAM;oBACN,SAAS;oBACT,IAAI;oBACJ,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC,2BAA2B,CAAC,MAAM,CAAC;oBACtE,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,MAAM,CAAC;oBACjD,IAAI,0CAAyB;oBAC7B,UAAU;oBACV,UAAU;oBACV,OAAO;iBACR,CAAC,CAAC;gBAEH,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE;oBACjC,MAAM;oBACN,SAAS;oBACT,IAAI;oBACJ,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,SAAU;oBAClC,SAAS,EAAE,MAAM;iBAClB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAA,SAAS,CAAC,SAAS,0CAAE,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;gBACzC,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;gBACnC,MAAM,MAAM,GAAG,IAAA,yBAAa,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBAChD,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBAC/E,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,MAAM,EAAE,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,UAAU,KAAI,SAAS,CAAC,CAAC;gBACtF,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;gBACxE,IAAI,CAAC,UAAU,EAAE;oBACf,MAAM,IAAI,KAAK,CAAC,gBAAgB,SAAS,CAAC,CAAC,CAAC,UAAU,cAAc,CAAC,CAAC;iBACvE;gBAED,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE;oBAClC,MAAM;oBACN,SAAS;oBACT,IAAI;oBACJ,UAAU;iBACX,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;SACJ;IACH,CAAC;IAES,YAAY,CAAC,IAAY;QACjC,QAAQ,IAAI,EAAE;YACZ,KAAK,yBAAY,CAAC,OAAO;gBACvB,OAAO;oBACL,UAAU,EAAE,SAAS;oBACrB,KAAK,EAAE,cAAc;oBACrB,WAAW,EAAE,oBAAoB;oBACjC,MAAM,EAAE,eAAe;iBACxB,CAAC;YACJ,KAAK,yBAAY,CAAC,KAAK,CAAC;YACxB,KAAK,yBAAY,CAAC,KAAK;gBACrB,OAAO;oBACL,UAAU,EAAE,QAAQ;oBACpB,KAAK,EAAE,eAAe;oBACtB,WAAW,EAAE,qBAAqB;oBAClC,MAAM,EAAE,cAAc;iBACvB,CAAC;YACJ,KAAK,yBAAY,CAAC,IAAI,CAAC;YACvB,KAAK,yBAAY,CAAC,KAAK;gBACrB,OAAO;oBACL,UAAU,EAAE,QAAQ;oBACpB,KAAK,EAAE,qBAAqB;oBAC5B,WAAW,EAAE,2BAA2B;oBACxC,MAAM,EAAE,sBAAsB;iBAC/B,CAAC;YACJ,KAAK,yBAAY,CAAC,KAAK;gBACrB,OAAO;oBACL,UAAU,EAAE,QAAQ;oBACpB,KAAK,EAAE,qBAAqB;oBAC5B,WAAW,EAAE,2BAA2B;oBACxC,MAAM,EAAE,eAAe;iBACxB,CAAC;YACJ,KAAK,yBAAY,CAAC,MAAM;gBACtB,OAAO;oBACL,UAAU,EAAE,QAAQ;oBACpB,KAAK,EAAE,qBAAqB;oBAC5B,WAAW,EAAE,2BAA2B;oBACxC,MAAM,EAAE,gBAAgB;iBACzB,CAAC;YACJ,KAAK,yBAAY,CAAC,MAAM;gBACtB,OAAO;oBACL,UAAU,EAAE,QAAQ;oBACpB,KAAK,EAAE,qBAAqB;oBAC5B,WAAW,EAAE,2BAA2B;oBACxC,MAAM,EAAE,gBAAgB;iBACzB,CAAC;YACJ,KAAK,yBAAY,CAAC,OAAO;gBACvB,OAAO;oBACL,UAAU,EAAE,QAAQ;oBACpB,KAAK,EAAE,qBAAqB;oBAC5B,WAAW,EAAE,2BAA2B;oBACxC,MAAM,EAAE,iBAAiB;iBAC1B,CAAC;YACJ,KAAK,yBAAY,CAAC,MAAM;gBACtB,OAAO;oBACL,UAAU,EAAE,QAAQ;oBACpB,KAAK,EAAE,eAAe;oBACtB,WAAW,EAAE,qBAAqB;oBAClC,MAAM,EAAE,cAAc;iBACvB,CAAC;YACJ,KAAK,yBAAY,CAAC,QAAQ;gBACxB,OAAO;oBACL,UAAU,EAAE,QAAQ;oBACpB,KAAK,EAAE,iBAAiB;oBACxB,WAAW,EAAE,uBAAuB;oBACpC,MAAM,EAAE,kBAAkB;iBAC3B,CAAC;YACJ,KAAK,yBAAY,CAAC,IAAI;gBACpB,OAAO;oBACL,UAAU,EAAE,QAAQ;oBACpB,KAAK,EAAE,aAAa;oBACpB,WAAW,EAAE,mBAAmB;oBAChC,MAAM,EAAE,cAAc;iBACvB,CAAC;YACJ,KAAK,yBAAY,CAAC,cAAc;gBAC9B,OAAO;oBACL,UAAU,EAAE,QAAQ;oBACpB,KAAK,EAAE,uBAAuB;oBAC9B,WAAW,EAAE,6BAA6B;oBAC1C,MAAM,EAAE,wBAAwB;iBACjC,CAAC;YACJ,KAAK,yBAAY,CAAC,MAAM;gBACtB,OAAO;oBACL,UAAU,EAAE,QAAQ;oBACpB,KAAK,EAAE,aAAa;oBACpB,WAAW,EAAE,mBAAmB;oBAChC,MAAM,EAAE,SAAS;iBAClB,CAAC;YACJ,KAAK,yBAAY,CAAC,IAAI;gBACpB,OAAO;oBACL,UAAU,EAAE,QAAQ;oBACpB,KAAK,EAAE,aAAa;oBACpB,WAAW,EAAE,mBAAmB;oBAChC,MAAM,EAAE,cAAc;iBACvB,CAAC;YACJ;gBACE,OAAO;oBACL,UAAU,EAAE,QAAQ;oBACpB,KAAK,EAAE,eAAe;oBACtB,WAAW,EAAE,qBAAqB;oBAClC,MAAM,EAAE,SAAS;iBAClB,CAAC;SACL;IACH,CAAC;CACF","sourcesContent":["import { MappedConverterChains, loadConverters } from \"@odata2ts/converter-runtime\";\nimport { ODataTypesV2, ODataVersions } from \"@odata2ts/odata-core\";\n\nimport { DigesterFunction, DigestionOptions } from \"../FactoryFunctionModel\";\nimport { withNamespace } from \"./DataModel\";\nimport { Digester, TypeModel } from \"./DataModelDigestion\";\nimport { ODataVersion, OperationTypes, PropertyModel } from \"./DataTypeModel\";\nimport { ComplexType, Property } from \"./edmx/ODataEdmxModelBase\";\nimport { AssociationEnd, ComplexTypeV3, EntityTypeV3, NavigationProperty, SchemaV3 } from \"./edmx/ODataEdmxModelV3\";\nimport { NamingHelper } from \"./NamingHelper\";\n\n/**\n * Digests an EDMX schema to produce a DataModel.\n *\n * @param schemas\n * @param options\n * @param namingHelper\n */\nexport const digest: DigesterFunction<SchemaV3> = async (schemas, options, namingHelper) => {\n const converters = await loadConverters(ODataVersions.V2, options.converters);\n\n const digester = new DigesterV3(schemas, options, namingHelper, converters);\n return digester.digest();\n};\n\nclass DigesterV3 extends Digester<SchemaV3, EntityTypeV3, ComplexTypeV3> {\n constructor(\n schemas: Array<SchemaV3>,\n options: DigestionOptions,\n namingHelper: NamingHelper,\n converters: MappedConverterChains | undefined\n ) {\n super(ODataVersion.V2, schemas, options, namingHelper, converters);\n }\n\n private findAssociationEnd(np: NavigationProperty): AssociationEnd {\n for (let schema of this.schemas) {\n if (schema.Association) {\n const relationship = this.namingHelper.stripServicePrefix(np.$.Relationship);\n const association = schema.Association?.find((a) => a.$.Name === relationship);\n const result = association?.End.find((e) => e.$.Role === np.$.ToRole);\n if (result) {\n return result;\n }\n }\n }\n throw new Error(`Association end couldn't be determined for NavigationProperty [${np.$.Name}]`);\n }\n\n protected getNavigationProps(entityType: ComplexType | EntityTypeV3): Array<Property> {\n // return (entityType as EntityTypeV3).NavigationProperty || [];\n const et = entityType as EntityTypeV3;\n if (et.NavigationProperty) {\n return et.NavigationProperty.map((np) => {\n const end = this.findAssociationEnd(np);\n const isRequired = end.$.Multiplicity !== \"*\" && !end.$.Multiplicity.startsWith(\"0..\");\n const isCollection = end.$.Multiplicity !== \"1\" && !end.$.Multiplicity.endsWith(\"..1\");\n\n return {\n $: {\n Name: np.$.Name,\n Type: isCollection ? `Collection(${end.$.Type})` : end.$.Type,\n Nullable: isRequired ? \"false\" : \"true\",\n },\n };\n });\n }\n\n return [];\n }\n\n // in V2 all we have & need is the FunctionImport: Function & Action elements are only known in V4.\n protected digestOperations(schema: SchemaV3) {}\n\n protected digestEntityContainer(schema: SchemaV3) {\n if (schema.EntityContainer && schema.EntityContainer.length) {\n const container = schema.EntityContainer[0];\n const ecName = container.$.Name;\n\n container.FunctionImport?.forEach((funcImport) => {\n const odataName = funcImport.$.Name;\n const fqName = withNamespace(ecName, odataName);\n const opConfig = this.serviceConfigHelper.findOperationImportConfig(ecName, odataName);\n const opName = this.nameValidator.addOperationImportType(fqName, opConfig?.mappedName || odataName);\n const name = this.namingHelper.getFunctionName(opName);\n const usePost = funcImport.$[\"m:HttpMethod\"]?.toUpperCase() === \"POST\";\n const parameters = funcImport.Parameter?.map((p) => this.mapProp(p)) ?? [];\n\n // TODO: the spec allows for multiple ReturnType elements\n // https://docs.microsoft.com/en-us/openspecs/windows_protocols/mc-csdl/f510f36a-36bf-47f4-ac41-4a0ff921fbfa\n // totally unclear how the response object would look like\n const returnTypeDef =\n funcImport.$.ReturnType || (funcImport.ReturnType?.length ? funcImport.ReturnType[0].$.Type : undefined);\n const returnType: PropertyModel | undefined = returnTypeDef\n ? this.mapProp({ $: { Name: \"NO_NAME_BECAUSE_RETURN_TYPE\", Type: returnTypeDef } })\n : undefined;\n\n // V2 only knows the FunctionImport element\n // we generate the data structure for the function here\n this.dataModel.addUnboundOperationType(ecName, {\n fqName,\n odataName,\n name,\n paramsModelName: this.namingHelper.getOperationParamsModelName(opName),\n qName: this.namingHelper.getQFunctionName(opName),\n type: OperationTypes.Function,\n parameters,\n returnType,\n usePost,\n });\n\n this.dataModel.addFunction(fqName, {\n fqName,\n odataName,\n name,\n entitySet: funcImport.$.EntitySet!,\n operation: fqName,\n });\n });\n\n container.EntitySet?.forEach((entitySet) => {\n const odataName = entitySet.$.Name;\n const fqName = withNamespace(ecName, odataName);\n const config = this.serviceConfigHelper.findEntitySetConfig(ecName, odataName);\n const name = this.nameValidator.addEntitySet(fqName, config?.mappedName || odataName);\n const entityType = this.dataModel.getEntityType(entitySet.$.EntityType);\n if (!entityType) {\n throw new Error(`Entity type \"${entitySet.$.EntityType}\" not found!`);\n }\n\n this.dataModel.addEntitySet(fqName, {\n fqName,\n odataName,\n name,\n entityType,\n });\n });\n }\n }\n\n protected mapODataType(type: string): TypeModel {\n switch (type) {\n case ODataTypesV2.Boolean:\n return {\n outputType: \"boolean\",\n qPath: \"QBooleanPath\",\n qCollection: \"QBooleanCollection\",\n qParam: \"QBooleanParam\",\n };\n case ODataTypesV2.Int16:\n case ODataTypesV2.Int32:\n return {\n outputType: \"number\",\n qPath: \"QNumberV2Path\",\n qCollection: \"QNumberV2Collection\",\n qParam: \"QNumberParam\",\n };\n case ODataTypesV2.Byte:\n case ODataTypesV2.SByte:\n return {\n outputType: \"string\",\n qPath: \"QStringNumberV2Path\",\n qCollection: \"QStringNumberV2Collection\",\n qParam: \"QStringNumberV2Param\",\n };\n case ODataTypesV2.Int64:\n return {\n outputType: \"string\",\n qPath: \"QStringNumberV2Path\",\n qCollection: \"QStringNumberV2Collection\",\n qParam: \"QInt64V2Param\",\n };\n case ODataTypesV2.Single:\n return {\n outputType: \"string\",\n qPath: \"QStringNumberV2Path\",\n qCollection: \"QStringNumberV2Collection\",\n qParam: \"QSingleV2Param\",\n };\n case ODataTypesV2.Double:\n return {\n outputType: \"string\",\n qPath: \"QStringNumberV2Path\",\n qCollection: \"QStringNumberV2Collection\",\n qParam: \"QDoubleV2Param\",\n };\n case ODataTypesV2.Decimal:\n return {\n outputType: \"string\",\n qPath: \"QStringNumberV2Path\",\n qCollection: \"QStringNumberV2Collection\",\n qParam: \"QDecimalV2Param\",\n };\n case ODataTypesV2.String:\n return {\n outputType: \"string\",\n qPath: \"QStringV2Path\",\n qCollection: \"QStringV2Collection\",\n qParam: \"QStringParam\",\n };\n case ODataTypesV2.DateTime:\n return {\n outputType: \"string\",\n qPath: \"QDateTimeV2Path\",\n qCollection: \"QDateTimeV2Collection\",\n qParam: \"QDateTimeV2Param\",\n };\n case ODataTypesV2.Time:\n return {\n outputType: \"string\",\n qPath: \"QTimeV2Path\",\n qCollection: \"QTimeV2Collection\",\n qParam: \"QTimeV2Param\",\n };\n case ODataTypesV2.DateTimeOffset:\n return {\n outputType: \"string\",\n qPath: \"QDateTimeOffsetV2Path\",\n qCollection: \"QDateTimeOffsetV2Collection\",\n qParam: \"QDateTimeOffsetV2Param\",\n };\n case ODataTypesV2.Binary:\n return {\n outputType: \"string\",\n qPath: \"QBinaryPath\",\n qCollection: \"QBinaryCollection\",\n qParam: undefined,\n };\n case ODataTypesV2.Guid:\n return {\n outputType: \"string\",\n qPath: \"QGuidV2Path\",\n qCollection: \"QGuidV2Collection\",\n qParam: \"QGuidV2Param\",\n };\n default:\n return {\n outputType: \"string\",\n qPath: \"QStringV2Path\",\n qCollection: \"QStringV2Collection\",\n qParam: undefined,\n };\n }\n }\n}\n"]}
|