@odata2ts/odata2ts 0.30.0 → 0.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +81 -81
  3. package/lib/FactoryFunctionModel.d.ts +1 -1
  4. package/lib/FactoryFunctionModel.js.map +1 -1
  5. package/lib/OptionModel.d.ts +54 -4
  6. package/lib/OptionModel.js.map +1 -1
  7. package/lib/app.js +1 -7
  8. package/lib/app.js.map +1 -1
  9. package/lib/data-model/DataModel.d.ts +48 -37
  10. package/lib/data-model/DataModel.js +130 -61
  11. package/lib/data-model/DataModel.js.map +1 -1
  12. package/lib/data-model/DataModelDigestion.d.ts +2 -3
  13. package/lib/data-model/DataModelDigestion.js +74 -96
  14. package/lib/data-model/DataModelDigestion.js.map +1 -1
  15. package/lib/data-model/DataModelDigestionV2.d.ts +1 -1
  16. package/lib/data-model/DataModelDigestionV2.js +30 -15
  17. package/lib/data-model/DataModelDigestionV2.js.map +1 -1
  18. package/lib/data-model/DataModelDigestionV4.js +65 -43
  19. package/lib/data-model/DataModelDigestionV4.js.map +1 -1
  20. package/lib/data-model/DataTypeModel.d.ts +10 -1
  21. package/lib/data-model/DataTypeModel.js.map +1 -1
  22. package/lib/data-model/NamingHelper.d.ts +6 -6
  23. package/lib/data-model/NamingHelper.js +14 -7
  24. package/lib/data-model/NamingHelper.js.map +1 -1
  25. package/lib/data-model/ServiceConfigHelper.d.ts +12 -3
  26. package/lib/data-model/ServiceConfigHelper.js +73 -11
  27. package/lib/data-model/ServiceConfigHelper.js.map +1 -1
  28. package/lib/defaultConfig.js +1 -0
  29. package/lib/defaultConfig.js.map +1 -1
  30. package/lib/generator/ModelGenerator.js +9 -6
  31. package/lib/generator/ModelGenerator.js.map +1 -1
  32. package/lib/generator/QueryObjectGenerator.js +12 -6
  33. package/lib/generator/QueryObjectGenerator.js.map +1 -1
  34. package/lib/generator/ServiceGenerator.js +17 -10
  35. package/lib/generator/ServiceGenerator.js.map +1 -1
  36. package/package.json +2 -2
@@ -27,19 +27,19 @@ class QueryObjectGenerator {
27
27
  this.sourceFile.addImportDeclarations(importContainer.getImportDeclarations(false));
28
28
  }
29
29
  generateModels(importContainer) {
30
- this.dataModel.getModels().forEach((model) => {
30
+ this.dataModel.getEntityTypes().forEach((model) => {
31
31
  this.generateModel(model, importContainer);
32
32
  if (!this.options.skipIdModels) {
33
33
  this.generateIdFunction(model, importContainer);
34
34
  }
35
35
  if (!this.options.skipOperations) {
36
- this.generateBoundOperations(model.name, importContainer);
36
+ this.generateBoundOperations(model.fqName, importContainer);
37
37
  }
38
38
  });
39
39
  this.dataModel.getComplexTypes().forEach((model) => {
40
40
  this.generateModel(model, importContainer);
41
41
  });
42
- if (this.dataModel.getModels().length || this.dataModel.getComplexTypes().length) {
42
+ if (this.dataModel.getEntityTypes().length || this.dataModel.getComplexTypes().length) {
43
43
  importContainer.addFromQObject("QueryObject");
44
44
  }
45
45
  }
@@ -47,7 +47,10 @@ class QueryObjectGenerator {
47
47
  let extendsClause = "QueryObject";
48
48
  if (model.baseClasses.length) {
49
49
  const baseClass = model.baseClasses[0];
50
- const baseModel = this.dataModel.getModel(baseClass) || this.dataModel.getComplexType(baseClass);
50
+ const baseModel = this.dataModel.getEntityType(baseClass) || this.dataModel.getComplexType(baseClass);
51
+ if (!baseModel) {
52
+ throw new Error(`Entity or complex type "${baseClass}" from baseClass attribute not found!`);
53
+ }
51
54
  extendsClause = baseModel.qName;
52
55
  }
53
56
  this.sourceFile.addClass({
@@ -171,8 +174,11 @@ class QueryObjectGenerator {
171
174
  this.generateOperation(operation, importContainer);
172
175
  });
173
176
  }
174
- generateBoundOperations(bindingName, importContainer) {
175
- this.dataModel.getOperationTypeByEntityOrCollectionBinding(bindingName).forEach((operation) => {
177
+ generateBoundOperations(fqEntityName, importContainer) {
178
+ [
179
+ ...this.dataModel.getEntityTypeOperations(fqEntityName),
180
+ ...this.dataModel.getEntitySetOperations(fqEntityName),
181
+ ].forEach((operation) => {
176
182
  this.generateOperation(operation, importContainer);
177
183
  });
178
184
  }
@@ -1 +1 @@
1
- {"version":3,"file":"QueryObjectGenerator.js","sourceRoot":"","sources":["../../src/generator/QueryObjectGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["import { ValueConverterImport } from \"@odata2ts/converter-runtime\";\r\nimport { ODataVersions } from \"@odata2ts/odata-core\";\r\nimport { OptionalKind, PropertyDeclarationStructure, Scope, SourceFile, VariableDeclarationKind } from \"ts-morph\";\r\nimport { firstCharLowerCase } from \"xml2js/lib/processors\";\r\n\r\nimport { DataModel } from \"../data-model/DataModel\";\r\nimport {\r\n ComplexType,\r\n DataTypes,\r\n ModelType,\r\n OperationType,\r\n OperationTypes,\r\n PropertyModel,\r\n} from \"../data-model/DataTypeModel\";\r\nimport { NamingHelper } from \"../data-model/NamingHelper\";\r\nimport { EntityBasedGeneratorFunction, GeneratorFunctionOptions } from \"../FactoryFunctionModel\";\r\nimport { ImportContainer } from \"./ImportContainer\";\r\n\r\nexport const generateQueryObjects: EntityBasedGeneratorFunction = (\r\n dataModel,\r\n sourceFile,\r\n version,\r\n options,\r\n namingHelper\r\n) => {\r\n const generator = new QueryObjectGenerator(dataModel, sourceFile, version, options, namingHelper);\r\n return generator.generate();\r\n};\r\n\r\nclass QueryObjectGenerator {\r\n constructor(\r\n private dataModel: DataModel,\r\n private sourceFile: SourceFile,\r\n private version: ODataVersions,\r\n private options: GeneratorFunctionOptions,\r\n private namingHelper: NamingHelper\r\n ) {}\r\n\r\n public generate(): void {\r\n const importContainer = new ImportContainer(this.namingHelper.getFileNames());\r\n\r\n this.generateModels(importContainer);\r\n if (!this.options.skipOperations) {\r\n this.generateUnboundOperations(importContainer);\r\n }\r\n\r\n this.sourceFile.addImportDeclarations(importContainer.getImportDeclarations(false));\r\n }\r\n\r\n private generateModels(importContainer: ImportContainer) {\r\n this.dataModel.getModels().forEach((model) => {\r\n this.generateModel(model, importContainer);\r\n if (!this.options.skipIdModels) {\r\n this.generateIdFunction(model, importContainer);\r\n }\r\n if (!this.options.skipOperations) {\r\n this.generateBoundOperations(model.name, importContainer);\r\n }\r\n });\r\n this.dataModel.getComplexTypes().forEach((model) => {\r\n this.generateModel(model, importContainer);\r\n });\r\n\r\n if (this.dataModel.getModels().length || this.dataModel.getComplexTypes().length) {\r\n importContainer.addFromQObject(\"QueryObject\");\r\n }\r\n }\r\n\r\n private generateModel(model: ComplexType, importContainer: ImportContainer) {\r\n let extendsClause = \"QueryObject\";\r\n if (model.baseClasses.length) {\r\n const baseClass = model.baseClasses[0];\r\n const baseModel = this.dataModel.getModel(baseClass) || this.dataModel.getComplexType(baseClass);\r\n extendsClause = baseModel.qName;\r\n }\r\n\r\n this.sourceFile.addClass({\r\n name: model.qName,\r\n isExported: true,\r\n extends: extendsClause,\r\n properties: this.generateQueryObjectProps(model.props, importContainer),\r\n });\r\n\r\n this.sourceFile.addVariableStatement({\r\n declarationKind: VariableDeclarationKind.Const,\r\n isExported: true,\r\n declarations: [\r\n {\r\n name: firstCharLowerCase(model.qName),\r\n initializer: `new ${model.qName}()`,\r\n },\r\n ],\r\n });\r\n }\r\n\r\n private generateQueryObjectProps(\r\n props: Array<PropertyModel>,\r\n importContainer: ImportContainer\r\n ): Array<OptionalKind<PropertyDeclarationStructure>> {\r\n return props.map((prop) => {\r\n const { odataName } = prop;\r\n const name = this.namingHelper.getQPropName(prop.name);\r\n const isModelType = prop.dataType === DataTypes.ModelType || prop.dataType === DataTypes.ComplexType;\r\n let qPathInit: string;\r\n\r\n // factor in collections\r\n if (prop.isCollection) {\r\n const cType = `Q${isModelType ? \"Entity\" : \"\"}CollectionPath`;\r\n const qObject = prop.qObject;\r\n\r\n if (!qObject) {\r\n throw new Error(\"QObject for collection is missing!\");\r\n }\r\n\r\n qPathInit = `new ${cType}(this.withPrefix(\"${odataName}\"), () => ${qObject})`;\r\n\r\n importContainer.addFromQObject(cType);\r\n if (!isModelType) {\r\n importContainer.addFromQObject(qObject);\r\n }\r\n } else {\r\n if (isModelType) {\r\n qPathInit = `new ${prop.qPath}(this.withPrefix(\"${odataName}\"), () => ${prop.qObject!})`;\r\n } else {\r\n let converterStmt = this.generateConverterStmt(prop.converters, importContainer);\r\n qPathInit = `new ${prop.qPath}(this.withPrefix(\"${odataName}\")${converterStmt ? `, ${converterStmt}` : \"\"})`;\r\n }\r\n // add import for data type\r\n importContainer.addFromQObject(prop.qPath);\r\n }\r\n\r\n return {\r\n name,\r\n scope: Scope.Public,\r\n isReadonly: true,\r\n initializer: qPathInit,\r\n } as OptionalKind<PropertyDeclarationStructure>;\r\n });\r\n }\r\n\r\n private generateConverterStmt(converters: Array<ValueConverterImport> | undefined, importContainer: ImportContainer) {\r\n if (!converters?.length) {\r\n return;\r\n }\r\n converters.forEach((converter) => {\r\n importContainer.addCustomType(converter.package, converter.converterId);\r\n });\r\n\r\n if (converters.length === 1) {\r\n return converters[0].converterId;\r\n } else {\r\n importContainer.addCustomType(\"@odata2ts/converter-runtime\", \"createChain\");\r\n\r\n const [first, second, ...moreConverters] = converters;\r\n return moreConverters.reduce(\r\n (stmt, conv) => `${stmt}.chain(${conv.converterId})`,\r\n `createChain(${first.converterId}, ${second.converterId})`\r\n );\r\n }\r\n }\r\n\r\n private generateIdFunction(model: ModelType, importContainer: ImportContainer) {\r\n if (!model.generateId) {\r\n return;\r\n }\r\n\r\n const qFunc = \"QId\";\r\n importContainer.addFromQObject(qFunc);\r\n importContainer.addGeneratedModel(model.idModelName);\r\n\r\n this.sourceFile.addClass({\r\n name: model.qIdFunctionName,\r\n isExported: true,\r\n extends: `${qFunc}<${model.idModelName}>`,\r\n properties: [\r\n {\r\n name: \"params\",\r\n scope: Scope.Private,\r\n isReadonly: true,\r\n initializer: this.getParamInitString(model.keys, importContainer),\r\n },\r\n ],\r\n methods: [\r\n {\r\n name: \"getParams\",\r\n statements: [\"return this.params\"],\r\n },\r\n ],\r\n });\r\n }\r\n\r\n private getParamInitString(props: Array<PropertyModel>, importContainer: ImportContainer) {\r\n return `[${props\r\n .map((prop) => {\r\n const isComplexParam = prop.dataType === DataTypes.ModelType || prop.dataType === DataTypes.ComplexType;\r\n if (prop.qParam) {\r\n importContainer.addFromQObject(prop.qParam);\r\n }\r\n const isMappedNameNecessary = prop.odataName !== prop.name;\r\n const mappedName = isMappedNameNecessary ? `\"${prop.name}\"` : prop.converters?.length ? \"undefined\" : undefined;\r\n const converterStmt = this.generateConverterStmt(prop.converters, importContainer);\r\n const mappedNameParam = mappedName ? `, ${mappedName}` : \"\";\r\n const complexQParam = isComplexParam ? `, new ${prop.qObject}()` : \"\";\r\n const converterParam = converterStmt ? `, ${converterStmt}` : \"\";\r\n return `new ${prop.qParam}(\"${prop.odataName}\"${complexQParam}${mappedNameParam}${converterParam})`;\r\n })\r\n .join(\",\")}]`;\r\n }\r\n\r\n private generateUnboundOperations(importContainer: ImportContainer) {\r\n this.dataModel.getUnboundOperationTypes().forEach((operation) => {\r\n this.generateOperation(operation, importContainer);\r\n });\r\n }\r\n\r\n private generateBoundOperations(bindingName: string, importContainer: ImportContainer) {\r\n this.dataModel.getOperationTypeByEntityOrCollectionBinding(bindingName).forEach((operation) => {\r\n this.generateOperation(operation, importContainer);\r\n });\r\n }\r\n\r\n private generateOperation(operation: OperationType, importContainer: ImportContainer) {\r\n const isV2 = this.version === ODataVersions.V2;\r\n const qOperation = operation.type === OperationTypes.Action ? \"QAction\" : \"QFunction\";\r\n const returnType = operation.returnType;\r\n let returnTypeOpStmt: string = \"\";\r\n const hasParams = operation.parameters.length > 0;\r\n importContainer.addFromQObject(qOperation);\r\n if (hasParams) {\r\n importContainer.addGeneratedModel(operation.paramsModelName);\r\n }\r\n if (returnType) {\r\n if (returnType.dataType === DataTypes.ComplexType || returnType.dataType === DataTypes.ModelType) {\r\n if (returnType.qObject) {\r\n importContainer.addFromQObject(\"OperationReturnType\", \"ReturnTypes\", \"QComplexParam\");\r\n returnTypeOpStmt = `new OperationReturnType(ReturnTypes.COMPLEX${\r\n returnType.isCollection ? \"_COLLECTION\" : \"\"\r\n }, new QComplexParam(\"NONE\", new ${returnType.qObject}))`;\r\n }\r\n }\r\n // currently, it only makes sense to add the OperationReturnType if a converter is present\r\n else if (returnType.converters && returnType.qParam) {\r\n importContainer.addFromQObject(\"OperationReturnType\", \"ReturnTypes\", returnType.qParam);\r\n const rtKind = \"ReturnTypes.VALUE\" + (returnType.isCollection ? \"_COLLECTION\" : \"\");\r\n const converterParam = returnType.converters\r\n ? \", \" + this.generateConverterStmt(returnType.converters, importContainer)\r\n : \"\";\r\n returnTypeOpStmt = `new OperationReturnType(${rtKind}, new ${returnType.qParam}(\"NONE\", undefined${converterParam}))`;\r\n }\r\n }\r\n\r\n this.sourceFile.addClass({\r\n name: operation.qName,\r\n isExported: true,\r\n extends: qOperation + (hasParams ? `<${operation.paramsModelName}>` : \"\"),\r\n properties: [\r\n {\r\n name: \"params\",\r\n scope: Scope.Private,\r\n isReadonly: true,\r\n type: operation.parameters?.length ? undefined : \"[]\",\r\n initializer: this.getParamInitString(operation.parameters, importContainer),\r\n },\r\n ],\r\n ctors: [\r\n {\r\n statements: [\r\n `super(\"${operation.odataName}\"${returnTypeOpStmt ? \", \" + returnTypeOpStmt : isV2 ? \", undefined\" : \"\"}${\r\n isV2 ? \", { v2Mode: true }\" : \"\"\r\n })`,\r\n ],\r\n },\r\n ],\r\n methods: [\r\n {\r\n name: \"getParams\",\r\n statements: [\"return this.params\"],\r\n },\r\n // functions without params: add an overriding buildUrl() to not force users to have to pass undefined as param\r\n ...(operation.type === OperationTypes.Function && !hasParams\r\n ? [\r\n {\r\n name: \"buildUrl\",\r\n statements: [\"return super.buildUrl(undefined)\"],\r\n },\r\n ]\r\n : []),\r\n ],\r\n });\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"QueryObjectGenerator.js","sourceRoot":"","sources":["../../src/generator/QueryObjectGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["import { ValueConverterImport } from \"@odata2ts/converter-runtime\";\nimport { ODataVersions } from \"@odata2ts/odata-core\";\nimport { OptionalKind, PropertyDeclarationStructure, Scope, SourceFile, VariableDeclarationKind } from \"ts-morph\";\nimport { firstCharLowerCase } from \"xml2js/lib/processors\";\n\nimport { DataModel } from \"../data-model/DataModel\";\nimport {\n ComplexType,\n DataTypes,\n ModelType,\n OperationType,\n OperationTypes,\n PropertyModel,\n} from \"../data-model/DataTypeModel\";\nimport { NamingHelper } from \"../data-model/NamingHelper\";\nimport { EntityBasedGeneratorFunction, GeneratorFunctionOptions } from \"../FactoryFunctionModel\";\nimport { ImportContainer } from \"./ImportContainer\";\n\nexport const generateQueryObjects: EntityBasedGeneratorFunction = (\n dataModel,\n sourceFile,\n version,\n options,\n namingHelper\n) => {\n const generator = new QueryObjectGenerator(dataModel, sourceFile, version, options, namingHelper);\n return generator.generate();\n};\n\nclass QueryObjectGenerator {\n constructor(\n private dataModel: DataModel,\n private sourceFile: SourceFile,\n private version: ODataVersions,\n private options: GeneratorFunctionOptions,\n private namingHelper: NamingHelper\n ) {}\n\n public generate(): void {\n const importContainer = new ImportContainer(this.namingHelper.getFileNames());\n\n this.generateModels(importContainer);\n if (!this.options.skipOperations) {\n this.generateUnboundOperations(importContainer);\n }\n\n this.sourceFile.addImportDeclarations(importContainer.getImportDeclarations(false));\n }\n\n private generateModels(importContainer: ImportContainer) {\n this.dataModel.getEntityTypes().forEach((model) => {\n this.generateModel(model, importContainer);\n if (!this.options.skipIdModels) {\n this.generateIdFunction(model, importContainer);\n }\n if (!this.options.skipOperations) {\n this.generateBoundOperations(model.fqName, importContainer);\n }\n });\n this.dataModel.getComplexTypes().forEach((model) => {\n this.generateModel(model, importContainer);\n });\n\n if (this.dataModel.getEntityTypes().length || this.dataModel.getComplexTypes().length) {\n importContainer.addFromQObject(\"QueryObject\");\n }\n }\n\n private generateModel(model: ComplexType, importContainer: ImportContainer) {\n let extendsClause = \"QueryObject\";\n if (model.baseClasses.length) {\n const baseClass = model.baseClasses[0];\n const baseModel = this.dataModel.getEntityType(baseClass) || this.dataModel.getComplexType(baseClass);\n if (!baseModel) {\n throw new Error(`Entity or complex type \"${baseClass}\" from baseClass attribute not found!`);\n }\n\n extendsClause = baseModel.qName;\n }\n\n this.sourceFile.addClass({\n name: model.qName,\n isExported: true,\n extends: extendsClause,\n properties: this.generateQueryObjectProps(model.props, importContainer),\n });\n\n this.sourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n isExported: true,\n declarations: [\n {\n name: firstCharLowerCase(model.qName),\n initializer: `new ${model.qName}()`,\n },\n ],\n });\n }\n\n private generateQueryObjectProps(\n props: Array<PropertyModel>,\n importContainer: ImportContainer\n ): Array<OptionalKind<PropertyDeclarationStructure>> {\n return props.map((prop) => {\n const { odataName } = prop;\n const name = this.namingHelper.getQPropName(prop.name);\n const isModelType = prop.dataType === DataTypes.ModelType || prop.dataType === DataTypes.ComplexType;\n let qPathInit: string;\n\n // factor in collections\n if (prop.isCollection) {\n const cType = `Q${isModelType ? \"Entity\" : \"\"}CollectionPath`;\n const qObject = prop.qObject;\n\n if (!qObject) {\n throw new Error(\"QObject for collection is missing!\");\n }\n\n qPathInit = `new ${cType}(this.withPrefix(\"${odataName}\"), () => ${qObject})`;\n\n importContainer.addFromQObject(cType);\n if (!isModelType) {\n importContainer.addFromQObject(qObject);\n }\n } else {\n if (isModelType) {\n qPathInit = `new ${prop.qPath}(this.withPrefix(\"${odataName}\"), () => ${prop.qObject!})`;\n } else {\n let converterStmt = this.generateConverterStmt(prop.converters, importContainer);\n qPathInit = `new ${prop.qPath}(this.withPrefix(\"${odataName}\")${converterStmt ? `, ${converterStmt}` : \"\"})`;\n }\n // add import for data type\n importContainer.addFromQObject(prop.qPath);\n }\n\n return {\n name,\n scope: Scope.Public,\n isReadonly: true,\n initializer: qPathInit,\n } as OptionalKind<PropertyDeclarationStructure>;\n });\n }\n\n private generateConverterStmt(converters: Array<ValueConverterImport> | undefined, importContainer: ImportContainer) {\n if (!converters?.length) {\n return;\n }\n converters.forEach((converter) => {\n importContainer.addCustomType(converter.package, converter.converterId);\n });\n\n if (converters.length === 1) {\n return converters[0].converterId;\n } else {\n importContainer.addCustomType(\"@odata2ts/converter-runtime\", \"createChain\");\n\n const [first, second, ...moreConverters] = converters;\n return moreConverters.reduce(\n (stmt, conv) => `${stmt}.chain(${conv.converterId})`,\n `createChain(${first.converterId}, ${second.converterId})`\n );\n }\n }\n\n private generateIdFunction(model: ModelType, importContainer: ImportContainer) {\n if (!model.generateId) {\n return;\n }\n\n const qFunc = \"QId\";\n importContainer.addFromQObject(qFunc);\n importContainer.addGeneratedModel(model.idModelName);\n\n this.sourceFile.addClass({\n name: model.qIdFunctionName,\n isExported: true,\n extends: `${qFunc}<${model.idModelName}>`,\n properties: [\n {\n name: \"params\",\n scope: Scope.Private,\n isReadonly: true,\n initializer: this.getParamInitString(model.keys, importContainer),\n },\n ],\n methods: [\n {\n name: \"getParams\",\n statements: [\"return this.params\"],\n },\n ],\n });\n }\n\n private getParamInitString(props: Array<PropertyModel>, importContainer: ImportContainer) {\n return `[${props\n .map((prop) => {\n const isComplexParam = prop.dataType === DataTypes.ModelType || prop.dataType === DataTypes.ComplexType;\n if (prop.qParam) {\n importContainer.addFromQObject(prop.qParam);\n }\n const isMappedNameNecessary = prop.odataName !== prop.name;\n const mappedName = isMappedNameNecessary ? `\"${prop.name}\"` : prop.converters?.length ? \"undefined\" : undefined;\n const converterStmt = this.generateConverterStmt(prop.converters, importContainer);\n const mappedNameParam = mappedName ? `, ${mappedName}` : \"\";\n const complexQParam = isComplexParam ? `, new ${prop.qObject}()` : \"\";\n const converterParam = converterStmt ? `, ${converterStmt}` : \"\";\n return `new ${prop.qParam}(\"${prop.odataName}\"${complexQParam}${mappedNameParam}${converterParam})`;\n })\n .join(\",\")}]`;\n }\n\n private generateUnboundOperations(importContainer: ImportContainer) {\n this.dataModel.getUnboundOperationTypes().forEach((operation) => {\n this.generateOperation(operation, importContainer);\n });\n }\n\n private generateBoundOperations(fqEntityName: string, importContainer: ImportContainer) {\n [\n ...this.dataModel.getEntityTypeOperations(fqEntityName),\n ...this.dataModel.getEntitySetOperations(fqEntityName),\n ].forEach((operation) => {\n this.generateOperation(operation, importContainer);\n });\n }\n\n private generateOperation(operation: OperationType, importContainer: ImportContainer) {\n const isV2 = this.version === ODataVersions.V2;\n const qOperation = operation.type === OperationTypes.Action ? \"QAction\" : \"QFunction\";\n const returnType = operation.returnType;\n let returnTypeOpStmt: string = \"\";\n const hasParams = operation.parameters.length > 0;\n importContainer.addFromQObject(qOperation);\n if (hasParams) {\n importContainer.addGeneratedModel(operation.paramsModelName);\n }\n if (returnType) {\n if (returnType.dataType === DataTypes.ComplexType || returnType.dataType === DataTypes.ModelType) {\n if (returnType.qObject) {\n importContainer.addFromQObject(\"OperationReturnType\", \"ReturnTypes\", \"QComplexParam\");\n returnTypeOpStmt = `new OperationReturnType(ReturnTypes.COMPLEX${\n returnType.isCollection ? \"_COLLECTION\" : \"\"\n }, new QComplexParam(\"NONE\", new ${returnType.qObject}))`;\n }\n }\n // currently, it only makes sense to add the OperationReturnType if a converter is present\n else if (returnType.converters && returnType.qParam) {\n importContainer.addFromQObject(\"OperationReturnType\", \"ReturnTypes\", returnType.qParam);\n const rtKind = \"ReturnTypes.VALUE\" + (returnType.isCollection ? \"_COLLECTION\" : \"\");\n const converterParam = returnType.converters\n ? \", \" + this.generateConverterStmt(returnType.converters, importContainer)\n : \"\";\n returnTypeOpStmt = `new OperationReturnType(${rtKind}, new ${returnType.qParam}(\"NONE\", undefined${converterParam}))`;\n }\n }\n\n this.sourceFile.addClass({\n name: operation.qName,\n isExported: true,\n extends: qOperation + (hasParams ? `<${operation.paramsModelName}>` : \"\"),\n properties: [\n {\n name: \"params\",\n scope: Scope.Private,\n isReadonly: true,\n type: operation.parameters?.length ? undefined : \"[]\",\n initializer: this.getParamInitString(operation.parameters, importContainer),\n },\n ],\n ctors: [\n {\n statements: [\n `super(\"${operation.odataName}\"${returnTypeOpStmt ? \", \" + returnTypeOpStmt : isV2 ? \", undefined\" : \"\"}${\n isV2 ? \", { v2Mode: true }\" : \"\"\n })`,\n ],\n },\n ],\n methods: [\n {\n name: \"getParams\",\n statements: [\"return this.params\"],\n },\n // functions without params: add an overriding buildUrl() to not force users to have to pass undefined as param\n ...(operation.type === OperationTypes.Function && !hasParams\n ? [\n {\n name: \"buildUrl\",\n statements: [\"return super.buildUrl(undefined)\"],\n },\n ]\n : []),\n ],\n });\n }\n}\n"]}
@@ -87,12 +87,16 @@ class ServiceGenerator {
87
87
  generateMainServiceOperations(ops, importContainer) {
88
88
  const result = { properties: [], methods: [] };
89
89
  ops.forEach(({ operation, name }) => {
90
- result.properties.push(this.generateQOperationProp(operation));
91
- result.methods.push(this.generateMethod(name, operation, importContainer));
90
+ const op = this.dataModel.getUnboundOperationType(operation);
91
+ if (!op) {
92
+ throw new Error(`Operation "${operation}" not found!`);
93
+ }
94
+ result.properties.push(this.generateQOperationProp(op));
95
+ result.methods.push(this.generateMethod(name, op, importContainer));
92
96
  });
93
97
  return result;
94
98
  }
95
- generateRelatedServiceGetter(propName, odataPropName, entityType, importContainer, currentServiceName) {
99
+ generateRelatedServiceGetter(propName, odataPropName, entityType, importContainer) {
96
100
  const idName = entityType.idModelName;
97
101
  const idFunctionName = entityType.qIdFunctionName;
98
102
  const serviceName = this.namingHelper.getServiceName(entityType.name);
@@ -169,7 +173,7 @@ class ServiceGenerator {
169
173
  const entityServiceType = "EntityTypeService" + this.getVersionSuffix();
170
174
  const editableModelName = model.editableName;
171
175
  const qObjectName = (0, processors_1.firstCharLowerCase)(model.qName);
172
- const operations = this.dataModel.getOperationTypeByBinding(model.name);
176
+ const operations = this.dataModel.getEntityTypeOperations(model.fqName);
173
177
  const props = [...model.baseProps, ...model.props];
174
178
  importContainer.addFromService(entityServiceType);
175
179
  importContainer.addFromClientApi("ODataHttpClient");
@@ -211,8 +215,11 @@ class ServiceGenerator {
211
215
  else if (prop.isCollection) {
212
216
  // collection of entity types
213
217
  if (prop.dataType === "ModelType" /* DataTypes.ModelType */) {
214
- const entityType = this.dataModel.getModel(prop.type);
215
- result.methods.push(this.generateRelatedServiceGetter(prop.name, prop.odataName, entityType, importContainer, serviceName));
218
+ const entityType = this.dataModel.getEntityType(prop.fqType);
219
+ if (!entityType) {
220
+ throw new Error(`Entity type "${prop.fqType}" specified by property not found!`);
221
+ }
222
+ result.methods.push(this.generateRelatedServiceGetter(prop.name, prop.odataName, entityType, importContainer));
216
223
  }
217
224
  // collection of primitive or complex types
218
225
  else {
@@ -236,7 +243,7 @@ class ServiceGenerator {
236
243
  return result;
237
244
  }
238
245
  generateModelProp(prop, collectionServiceType, serviceName, importContainer) {
239
- const complexType = this.dataModel.getComplexType(prop.type);
246
+ const complexType = this.dataModel.getComplexType(prop.fqType);
240
247
  const key = this.namingHelper.getServiceName(prop.type);
241
248
  let propModelType = prop.isCollection ? this.namingHelper.getCollectionServiceName(prop.type) : key;
242
249
  if (prop.isCollection && complexType) {
@@ -294,7 +301,7 @@ class ServiceGenerator {
294
301
  };
295
302
  }
296
303
  generateModelPropGetter(prop, collectionServiceType) {
297
- const complexType = this.dataModel.getComplexType(prop.type);
304
+ const complexType = this.dataModel.getComplexType(prop.fqType);
298
305
  const isComplexCollection = prop.isCollection && complexType;
299
306
  const type = isComplexCollection
300
307
  ? collectionServiceType
@@ -362,7 +369,7 @@ class ServiceGenerator {
362
369
  importContainer.addFromService(entitySetServiceType);
363
370
  importContainer.addGeneratedModel(model.idModelName);
364
371
  importContainer.addGeneratedQObject(model.qIdFunctionName);
365
- const collectionOperations = this.dataModel.getOperationTypeByBinding(`Collection(${model.name})`);
372
+ const collectionOperations = this.dataModel.getEntityTypeOperations(`Collection(${model.fqName})`);
366
373
  const { properties, methods } = this.generateServiceOperations(collectionOperations, importContainer);
367
374
  serviceFile.addClass({
368
375
  isExported: true,
@@ -390,7 +397,7 @@ class ServiceGenerator {
390
397
  generateModelServices(serviceFile, importContainer) {
391
398
  return tslib_1.__awaiter(this, void 0, void 0, function* () {
392
399
  // build service file for each entity, consisting of EntityTypeService & EntityCollectionService
393
- for (const model of this.dataModel.getModels()) {
400
+ for (const model of this.dataModel.getEntityTypes()) {
394
401
  const serviceName = this.namingHelper.getServiceName(model.name);
395
402
  // entity type service
396
403
  yield this.generateEntityTypeService(model, serviceName, serviceFile, importContainer);
@@ -1 +1 @@
1
- {"version":3,"file":"ServiceGenerator.js","sourceRoot":"","sources":["../../src/generator/ServiceGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["import { ODataVersions } from \"@odata2ts/odata-core\";\r\nimport deepmerge from \"deepmerge\";\r\nimport {\r\n ClassDeclarationStructure,\r\n MethodDeclarationStructure,\r\n OptionalKind,\r\n PropertyDeclarationStructure,\r\n Scope,\r\n SourceFile,\r\n} from \"ts-morph\";\r\nimport { upperCaseFirst } from \"upper-case-first\";\r\nimport { firstCharLowerCase } from \"xml2js/lib/processors\";\r\n\r\nimport { DataModel } from \"../data-model/DataModel\";\r\nimport {\r\n ActionImportType,\r\n ComplexType,\r\n DataTypes,\r\n EntityContainerModel,\r\n FunctionImportType,\r\n ModelType,\r\n OperationType,\r\n OperationTypes,\r\n PropertyModel,\r\n SingletonType,\r\n} from \"../data-model/DataTypeModel\";\r\nimport { NamingHelper } from \"../data-model/NamingHelper\";\r\nimport { ConfigFileOptions } from \"../OptionModel\";\r\nimport { ProjectManager } from \"../project/ProjectManager\";\r\nimport { ImportContainer } from \"./ImportContainer\";\r\n\r\nconst ROOT_SERVICE = \"ODataService\";\r\n\r\nconst RESPONSE_TYPES = {\r\n collection: \"ODataCollectionResponse\",\r\n model: \"ODataModelResponse\",\r\n value: \"ODataValueResponse\",\r\n};\r\n\r\nexport interface PropsAndOps extends Required<Pick<ClassDeclarationStructure, \"properties\" | \"methods\">> {}\r\n\r\nexport interface ServiceGeneratorOptions\r\n extends Pick<ConfigFileOptions, \"enablePrimitivePropertyServices\" | \"v4BigNumberAsString\"> {}\r\n\r\nexport async function generateServices(\r\n dataModel: DataModel,\r\n project: ProjectManager,\r\n version: ODataVersions,\r\n namingHelper: NamingHelper,\r\n options?: ServiceGeneratorOptions\r\n) {\r\n const generator = new ServiceGenerator(dataModel, project, version, namingHelper, options);\r\n return generator.generate();\r\n}\r\n\r\nclass ServiceGenerator {\r\n constructor(\r\n private dataModel: DataModel,\r\n private project: ProjectManager,\r\n private version: ODataVersions,\r\n private namingHelper: NamingHelper,\r\n private options: ServiceGeneratorOptions = {}\r\n ) {}\r\n\r\n private isV4BigNumber() {\r\n return this.options.v4BigNumberAsString && this.version === ODataVersions.V4;\r\n }\r\n\r\n public async generate(): Promise<void> {\r\n const sourceFile = await this.project.createMainServiceFile();\r\n const serviceName = this.namingHelper.getMainServiceName();\r\n const container = this.dataModel.getEntityContainer();\r\n const unboundOperations = [...Object.values(container.functions), ...Object.values(container.actions)];\r\n\r\n const importContainer = new ImportContainer(this.namingHelper.getFileNames());\r\n importContainer.addFromClientApi(\"ODataHttpClient\");\r\n importContainer.addFromService(ROOT_SERVICE);\r\n\r\n const { properties, methods }: PropsAndOps = deepmerge(\r\n this.generateMainServiceProperties(container, importContainer),\r\n this.generateMainServiceOperations(unboundOperations, importContainer)\r\n );\r\n\r\n sourceFile.addClass({\r\n isExported: true,\r\n name: serviceName,\r\n typeParameters: [\"ClientType extends ODataHttpClient\"],\r\n extends: `${ROOT_SERVICE}<ClientType>`,\r\n ctors: this.isV4BigNumber()\r\n ? [\r\n {\r\n parameters: [\r\n { name: \"client\", type: \"ClientType\" },\r\n { name: \"basePath\", type: \"string\" },\r\n ],\r\n statements: [`super(client, basePath, true);`],\r\n },\r\n ]\r\n : [],\r\n properties,\r\n methods,\r\n });\r\n\r\n await this.generateModelServices(sourceFile, importContainer);\r\n\r\n sourceFile.addImportDeclarations(importContainer.getImportDeclarations(false));\r\n }\r\n\r\n private generateMainServiceProperties(\r\n container: EntityContainerModel,\r\n importContainer: ImportContainer\r\n ): PropsAndOps {\r\n const result: PropsAndOps = { properties: [], methods: [] };\r\n\r\n Object.values(container.entitySets).forEach(({ name, odataName, entityType }) => {\r\n result.methods.push(this.generateRelatedServiceGetter(name, odataName, entityType, importContainer));\r\n });\r\n\r\n Object.values(container.singletons).forEach((singleton) => {\r\n result.properties.push(this.generateSingletonProp(singleton, importContainer));\r\n result.methods.push(this.generateSingletonGetter(singleton));\r\n });\r\n\r\n return result;\r\n }\r\n\r\n private generateMainServiceOperations(\r\n ops: Array<FunctionImportType | ActionImportType>,\r\n importContainer: ImportContainer\r\n ): PropsAndOps {\r\n const result: PropsAndOps = { properties: [], methods: [] };\r\n\r\n ops.forEach(({ operation, name }) => {\r\n result.properties.push(this.generateQOperationProp(operation));\r\n result.methods.push(this.generateMethod(name, operation, importContainer));\r\n });\r\n\r\n return result;\r\n }\r\n\r\n private generateRelatedServiceGetter(\r\n propName: string,\r\n odataPropName: string,\r\n entityType: ModelType,\r\n importContainer: ImportContainer,\r\n currentServiceName?: string\r\n ): OptionalKind<MethodDeclarationStructure> {\r\n const idName = entityType.idModelName;\r\n const idFunctionName = entityType.qIdFunctionName;\r\n const serviceName = this.namingHelper.getServiceName(entityType.name);\r\n const collectionName = this.namingHelper.getCollectionServiceName(entityType.name);\r\n\r\n importContainer.addFromClientApi(\"ODataHttpClient\");\r\n importContainer.addGeneratedModel(idName);\r\n importContainer.addGeneratedQObject(idFunctionName);\r\n\r\n return {\r\n scope: Scope.Public,\r\n name: this.namingHelper.getRelatedServiceGetter(propName),\r\n parameters: [\r\n {\r\n name: \"id\",\r\n type: `${idName} | undefined`,\r\n hasQuestionToken: true,\r\n },\r\n ],\r\n overloads: [\r\n {\r\n parameters: [],\r\n returnType: `${collectionName}<ClientType>`,\r\n },\r\n {\r\n parameters: [\r\n {\r\n name: \"id\",\r\n type: idName,\r\n },\r\n ],\r\n returnType: `${serviceName}<ClientType>`,\r\n },\r\n ],\r\n statements: [\r\n `const fieldName = \"${odataPropName}\";`,\r\n `const { client, path } = this.__base;`,\r\n 'return typeof id === \"undefined\" || id === null',\r\n `? new ${collectionName}(client, path, fieldName)`,\r\n `: new ${serviceName}(client, path, new ${idFunctionName}(fieldName).buildUrl(id));`,\r\n ],\r\n };\r\n }\r\n\r\n private generateSingletonProp(\r\n singleton: SingletonType,\r\n importContainer: ImportContainer\r\n ): OptionalKind<PropertyDeclarationStructure> {\r\n const { name, entityType } = singleton;\r\n const type = this.namingHelper.getServiceName(entityType.name);\r\n\r\n return {\r\n scope: Scope.Private,\r\n name: this.namingHelper.getPrivatePropName(name),\r\n type: `${type}<ClientType>`,\r\n hasQuestionToken: true,\r\n };\r\n }\r\n\r\n private generateQOperationProp = (operation: OperationType) => {\r\n return {\r\n scope: Scope.Private,\r\n name: this.namingHelper.getPrivatePropName(operation.qName),\r\n type: operation.qName,\r\n hasQuestionToken: true,\r\n };\r\n };\r\n\r\n private generateSingletonGetter(singleton: SingletonType): OptionalKind<MethodDeclarationStructure> {\r\n const { name, odataName, entityType } = singleton;\r\n const propName = \"this.\" + this.namingHelper.getPrivatePropName(name);\r\n const serviceType = this.namingHelper.getServiceName(entityType.name);\r\n\r\n return {\r\n scope: Scope.Public,\r\n name: this.namingHelper.getRelatedServiceGetter(name),\r\n statements: [\r\n `if(!${propName}) {`,\r\n ` const { client, path } = this.__base;`,\r\n // prettier-ignore\r\n ` ${propName} = new ${serviceType}(client, path, \"${odataName}\")`,\r\n \"}\",\r\n `return ${propName}`,\r\n ],\r\n };\r\n }\r\n\r\n private getVersionSuffix() {\r\n return this.version === ODataVersions.V2 ? \"V2\" : \"V4\";\r\n }\r\n\r\n private async generateEntityTypeService(\r\n model: ComplexType,\r\n serviceName: string,\r\n serviceFile: SourceFile,\r\n importContainer: ImportContainer\r\n ) {\r\n const entityServiceType = \"EntityTypeService\" + this.getVersionSuffix();\r\n\r\n const editableModelName = model.editableName;\r\n const qObjectName = firstCharLowerCase(model.qName);\r\n const operations = this.dataModel.getOperationTypeByBinding(model.name);\r\n const props = [...model.baseProps, ...model.props];\r\n\r\n importContainer.addFromService(entityServiceType);\r\n importContainer.addFromClientApi(\"ODataHttpClient\");\r\n importContainer.addGeneratedModel(model.name, editableModelName);\r\n importContainer.addGeneratedQObject(model.qName, qObjectName);\r\n\r\n const { properties, methods }: PropsAndOps = deepmerge(\r\n this.generateServiceProperties(serviceName, props, importContainer),\r\n this.generateServiceOperations(operations, importContainer)\r\n );\r\n\r\n // generate EntityTypeService\r\n serviceFile.addClass({\r\n isExported: true,\r\n name: serviceName,\r\n typeParameters: [\"ClientType extends ODataHttpClient\"],\r\n extends: entityServiceType + `<ClientType, ${model.name}, ${editableModelName}, ${model.qName}>`,\r\n ctors: [\r\n {\r\n parameters: [\r\n { name: \"client\", type: \"ClientType\" },\r\n { name: \"basePath\", type: \"string\" },\r\n { name: \"name\", type: \"string\" },\r\n ],\r\n statements: [`super(client, basePath, name, ${qObjectName}${this.isV4BigNumber() ? \", true\" : \"\"});`],\r\n },\r\n ],\r\n properties,\r\n methods,\r\n });\r\n }\r\n\r\n private getPrimitiveServiceType() {\r\n return \"PrimitiveTypeService\" + this.getVersionSuffix();\r\n }\r\n\r\n private generateServiceProperties(\r\n serviceName: string,\r\n props: Array<PropertyModel>,\r\n importContainer: ImportContainer\r\n ): PropsAndOps {\r\n const collectionServiceType = \"CollectionService\" + this.getVersionSuffix();\r\n const result: PropsAndOps = { properties: [], methods: [] };\r\n\r\n props.forEach((prop) => {\r\n if ((prop.dataType === DataTypes.ModelType && !prop.isCollection) || prop.dataType === DataTypes.ComplexType) {\r\n result.properties.push(this.generateModelProp(prop, collectionServiceType, serviceName, importContainer));\r\n result.methods.push(this.generateModelPropGetter(prop, collectionServiceType));\r\n } else if (prop.isCollection) {\r\n // collection of entity types\r\n if (prop.dataType === DataTypes.ModelType) {\r\n const entityType = this.dataModel.getModel(prop.type);\r\n result.methods.push(\r\n this.generateRelatedServiceGetter(prop.name, prop.odataName, entityType, importContainer, serviceName)\r\n );\r\n }\r\n // collection of primitive or complex types\r\n else {\r\n result.properties.push(this.generatePrimitiveCollectionProp(prop, collectionServiceType, importContainer));\r\n result.methods.push(this.generatePrimitiveCollectionGetter(prop, collectionServiceType));\r\n }\r\n } else if (this.options.enablePrimitivePropertyServices && prop.dataType === DataTypes.PrimitiveType) {\r\n result.properties.push(this.generatePrimitiveTypeProp(prop, importContainer));\r\n result.methods.push(this.generatePrimitiveTypeGetter(prop));\r\n }\r\n });\r\n\r\n return result;\r\n }\r\n\r\n private generateServiceOperations(operations: Array<OperationType>, importContainer: ImportContainer): PropsAndOps {\r\n const result: PropsAndOps = { properties: [], methods: [] };\r\n\r\n operations.forEach((operation) => {\r\n result.properties.push(this.generateQOperationProp(operation));\r\n result.methods.push(this.generateMethod(operation.name, operation, importContainer));\r\n });\r\n\r\n return result;\r\n }\r\n\r\n private generateModelProp(\r\n prop: PropertyModel,\r\n collectionServiceType: string,\r\n serviceName: string,\r\n importContainer: ImportContainer\r\n ): PropertyDeclarationStructure {\r\n const complexType = this.dataModel.getComplexType(prop.type);\r\n const key = this.namingHelper.getServiceName(prop.type);\r\n let propModelType = prop.isCollection ? this.namingHelper.getCollectionServiceName(prop.type) : key;\r\n\r\n if (prop.isCollection && complexType) {\r\n const editableName = complexType.editableName;\r\n importContainer.addFromService(collectionServiceType);\r\n importContainer.addGeneratedModel(complexType.name, editableName);\r\n importContainer.addGeneratedQObject(complexType.qName, firstCharLowerCase(complexType.qName));\r\n propModelType = `${collectionServiceType}<ClientType, ${complexType.name}, ${complexType.qName}, ${editableName}>`;\r\n } else {\r\n propModelType = `${propModelType}<ClientType>`;\r\n }\r\n\r\n return {\r\n scope: Scope.Private,\r\n name: this.namingHelper.getPrivatePropName(prop.name),\r\n type: propModelType,\r\n hasQuestionToken: true,\r\n } as PropertyDeclarationStructure;\r\n }\r\n\r\n private generatePrimitiveCollectionProp(\r\n prop: PropertyModel,\r\n collectionServiceType: string,\r\n importContainer: ImportContainer\r\n ): OptionalKind<PropertyDeclarationStructure> {\r\n const isEnum = prop.dataType === DataTypes.EnumType;\r\n const type = isEnum ? `EnumCollection<${prop.type}>` : `${upperCaseFirst(prop.type)}Collection`;\r\n const qType = isEnum ? \"QEnumCollection\" : prop.qObject;\r\n const collectionType = `${collectionServiceType}<ClientType, ${type}, ${qType}>`;\r\n\r\n if (!prop.qObject) {\r\n throw new Error(\"Illegal State: [qObject] must be provided for Collection types!\");\r\n }\r\n\r\n importContainer.addFromService(collectionServiceType);\r\n importContainer.addFromQObject(prop.qObject, firstCharLowerCase(prop.qObject));\r\n if (isEnum) {\r\n importContainer.addGeneratedModel(prop.type);\r\n importContainer.addFromQObject(\"EnumCollection\");\r\n } else {\r\n importContainer.addFromQObject(type);\r\n }\r\n\r\n return {\r\n scope: Scope.Private,\r\n name: this.namingHelper.getPrivatePropName(prop.name),\r\n type: `${collectionType}`,\r\n hasQuestionToken: true,\r\n };\r\n }\r\n\r\n private generatePrimitiveTypeProp(\r\n prop: PropertyModel,\r\n importContainer: ImportContainer\r\n ): OptionalKind<PropertyDeclarationStructure> {\r\n const serviceType = this.getPrimitiveServiceType();\r\n importContainer.addFromService(serviceType);\r\n if (prop.typeModule) {\r\n importContainer.addCustomType(prop.typeModule, prop.type);\r\n }\r\n\r\n return {\r\n scope: Scope.Private,\r\n name: this.namingHelper.getPrivatePropName(prop.name),\r\n type: `${serviceType}<ClientType, ${prop.type}>`,\r\n hasQuestionToken: true,\r\n };\r\n }\r\n\r\n private generateModelPropGetter(\r\n prop: PropertyModel,\r\n collectionServiceType: string\r\n ): OptionalKind<MethodDeclarationStructure> {\r\n const complexType = this.dataModel.getComplexType(prop.type);\r\n const isComplexCollection = prop.isCollection && complexType;\r\n const type = isComplexCollection\r\n ? collectionServiceType\r\n : prop.isCollection\r\n ? this.namingHelper.getCollectionServiceName(prop.type)\r\n : this.namingHelper.getServiceName(prop.type);\r\n const typeWithGenerics = isComplexCollection\r\n ? `${collectionServiceType}<ClientType, ${complexType.name}, ${complexType.qName}, ${complexType.editableName}>`\r\n : `${type}<ClientType>`;\r\n\r\n const privateSrvProp = \"this.\" + this.namingHelper.getPrivatePropName(prop.name);\r\n\r\n return {\r\n scope: Scope.Public,\r\n name: this.namingHelper.getRelatedServiceGetter(prop.name),\r\n returnType: typeWithGenerics,\r\n statements: [\r\n `if(!${privateSrvProp}) {`,\r\n ` const { client, path } = this.__base;`,\r\n // prettier-ignore\r\n ` ${privateSrvProp} = new ${type}(client, path, \"${prop.odataName}\"${isComplexCollection ? `, ${firstCharLowerCase(complexType.qName)}`: \"\"})`,\r\n \"}\",\r\n `return ${privateSrvProp}`,\r\n ],\r\n };\r\n }\r\n\r\n private generatePrimitiveCollectionGetter(\r\n prop: PropertyModel,\r\n collectionServiceType: string\r\n ): OptionalKind<MethodDeclarationStructure> {\r\n const propName = \"this.\" + this.namingHelper.getPrivatePropName(prop.name);\r\n return {\r\n scope: Scope.Public,\r\n name: this.namingHelper.getRelatedServiceGetter(prop.name),\r\n statements: [\r\n `if(!${propName}) {`,\r\n ` const { client, path } = this.__base;`,\r\n // prettier-ignore\r\n ` ${propName} = new ${collectionServiceType}(client, path, \"${prop.odataName}\", ${firstCharLowerCase(prop.qObject!)}${this.isV4BigNumber() ? \", true\": \"\"})`,\r\n \"}\",\r\n `return ${propName}`,\r\n ],\r\n };\r\n }\r\n\r\n private generatePrimitiveTypeGetter(prop: PropertyModel): OptionalKind<MethodDeclarationStructure> {\r\n const serviceType = this.getPrimitiveServiceType();\r\n const propName = \"this.\" + this.namingHelper.getPrivatePropName(prop.name);\r\n // for V2: mapped name must be specified\r\n const useMappedName = this.version === ODataVersions.V2 && prop.name !== prop.odataName;\r\n // for V4: big number support\r\n const useBigNumber = this.isV4BigNumber();\r\n const addParamString = useMappedName ? `, \"${prop.name}\"` : useBigNumber ? \", true\" : \"\";\r\n\r\n return {\r\n scope: Scope.Public,\r\n name: this.namingHelper.getRelatedServiceGetter(prop.name),\r\n statements: [\r\n `if(!${propName}) {`,\r\n ` const { client, path, qModel } = this.__base;`,\r\n ` ${propName} = new ${serviceType}(client, path, \"${prop.odataName}\", qModel.${prop.name}.converter${addParamString})`,\r\n \"}\",\r\n `return ${propName}`,\r\n ],\r\n };\r\n }\r\n\r\n private async generateEntityCollectionService(\r\n model: ModelType,\r\n serviceFile: SourceFile,\r\n importContainer: ImportContainer\r\n ) {\r\n const entitySetServiceType = \"EntitySetService\" + this.getVersionSuffix();\r\n const editableModelName = model.editableName;\r\n const qObjectName = firstCharLowerCase(model.qName);\r\n\r\n importContainer.addFromService(entitySetServiceType);\r\n importContainer.addGeneratedModel(model.idModelName);\r\n importContainer.addGeneratedQObject(model.qIdFunctionName);\r\n\r\n const collectionOperations = this.dataModel.getOperationTypeByBinding(`Collection(${model.name})`);\r\n\r\n const { properties, methods } = this.generateServiceOperations(collectionOperations, importContainer);\r\n\r\n serviceFile.addClass({\r\n isExported: true,\r\n name: this.namingHelper.getCollectionServiceName(model.name),\r\n typeParameters: [\"ClientType extends ODataHttpClient\"],\r\n extends:\r\n entitySetServiceType +\r\n `<ClientType, ${model.name}, ${editableModelName}, ${model.qName}, ${model.idModelName}>`,\r\n ctors: [\r\n {\r\n parameters: [\r\n { name: \"client\", type: \"ClientType\" },\r\n { name: \"basePath\", type: \"string\" },\r\n { name: \"name\", type: \"string\" },\r\n ],\r\n statements: [\r\n `super(client, basePath, name, ${qObjectName}, new ${model.qIdFunctionName}(name)${\r\n this.isV4BigNumber() ? \", true\" : \"\"\r\n });`,\r\n ],\r\n },\r\n ],\r\n properties,\r\n methods,\r\n });\r\n }\r\n\r\n private async generateModelServices(serviceFile: SourceFile, importContainer: ImportContainer) {\r\n // build service file for each entity, consisting of EntityTypeService & EntityCollectionService\r\n for (const model of this.dataModel.getModels()) {\r\n const serviceName = this.namingHelper.getServiceName(model.name);\r\n\r\n // entity type service\r\n await this.generateEntityTypeService(model, serviceName, serviceFile, importContainer);\r\n\r\n // entity collection service\r\n await this.generateEntityCollectionService(model, serviceFile, importContainer);\r\n }\r\n\r\n // build service file for complex types\r\n for (const model of this.dataModel.getComplexTypes()) {\r\n const serviceName = this.namingHelper.getServiceName(model.name);\r\n\r\n // entity type service\r\n await this.generateEntityTypeService(model, serviceName, serviceFile, importContainer);\r\n }\r\n }\r\n\r\n private generateMethod(\r\n name: string,\r\n operation: OperationType,\r\n importContainer: ImportContainer\r\n ): OptionalKind<MethodDeclarationStructure> {\r\n const isFunc = operation.type === OperationTypes.Function;\r\n const odataType = operation.returnType?.isCollection\r\n ? RESPONSE_TYPES.collection + this.getVersionSuffix()\r\n : operation.returnType?.dataType === DataTypes.PrimitiveType\r\n ? RESPONSE_TYPES.value + this.getVersionSuffix()\r\n : RESPONSE_TYPES.model + this.getVersionSuffix();\r\n const returnType = operation.returnType;\r\n const requestConfigParam = {\r\n name: \"requestConfig\",\r\n hasQuestionToken: true,\r\n type: \"ODataHttpClientConfig<ClientType>\",\r\n };\r\n const hasParams = operation.parameters.length > 0;\r\n\r\n // importing dependencies\r\n importContainer.addFromClientApi(\"ODataHttpClientConfig\", \"ODataResponse\");\r\n importContainer.addFromCore(odataType);\r\n if (returnType?.type) {\r\n if ([DataTypes.EnumType, DataTypes.ModelType, DataTypes.ComplexType].includes(returnType.dataType)) {\r\n importContainer.addGeneratedModel(returnType.type);\r\n }\r\n }\r\n importContainer.addGeneratedQObject(operation.qName);\r\n if (hasParams) {\r\n importContainer.addGeneratedModel(operation.paramsModelName);\r\n }\r\n\r\n const qOpProp = \"this.\" + this.namingHelper.getPrivatePropName(operation.qName);\r\n\r\n return {\r\n scope: Scope.Public,\r\n isAsync: true,\r\n name,\r\n parameters: hasParams\r\n ? [{ name: \"params\", type: operation.paramsModelName }, requestConfigParam]\r\n : [requestConfigParam],\r\n returnType: `ODataResponse<${odataType}<${returnType?.type || \"void\"}>>`,\r\n statements: [\r\n `if(!${qOpProp}) {`,\r\n ` ${qOpProp} = new ${operation.qName}()`,\r\n \"}\",\r\n\r\n `const { addFullPath, client, getDefaultHeaders } = this.__base;`,\r\n `const url = addFullPath(${qOpProp}.buildUrl(${isFunc && hasParams ? \"params\" : \"\"}));`,\r\n `${returnType ? \"const response = await \" : \"return\"} client.${\r\n !isFunc\r\n ? // actions: since V4\r\n `post(url, ${hasParams ? `${qOpProp}.convertUserParams(params)` : \"{}\"}, ${\r\n requestConfigParam.name\r\n }, getDefaultHeaders())`\r\n : operation.usePost\r\n ? // V2 POST => BUT values are still query params, they are not part of the request body\r\n `post(url, undefined, ${requestConfigParam.name}, getDefaultHeaders())`\r\n : // functions: since V2\r\n `get(url, ${requestConfigParam.name}, getDefaultHeaders())`\r\n };`,\r\n returnType ? `return ${qOpProp}.convertResponse(response);` : \"\",\r\n ],\r\n };\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ServiceGenerator.js","sourceRoot":"","sources":["../../src/generator/ServiceGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["import { ODataVersions } from \"@odata2ts/odata-core\";\r\nimport deepmerge from \"deepmerge\";\r\nimport {\r\n ClassDeclarationStructure,\r\n MethodDeclarationStructure,\r\n OptionalKind,\r\n PropertyDeclarationStructure,\r\n Scope,\r\n SourceFile,\r\n} from \"ts-morph\";\r\nimport { upperCaseFirst } from \"upper-case-first\";\r\nimport { firstCharLowerCase } from \"xml2js/lib/processors\";\r\n\r\nimport { DataModel } from \"../data-model/DataModel\";\r\nimport {\r\n ActionImportType,\r\n ComplexType,\r\n DataTypes,\r\n EntityContainerModel,\r\n FunctionImportType,\r\n ModelType,\r\n OperationType,\r\n OperationTypes,\r\n PropertyModel,\r\n SingletonType,\r\n} from \"../data-model/DataTypeModel\";\r\nimport { NamingHelper } from \"../data-model/NamingHelper\";\r\nimport { ConfigFileOptions } from \"../OptionModel\";\r\nimport { ProjectManager } from \"../project/ProjectManager\";\r\nimport { ImportContainer } from \"./ImportContainer\";\r\n\r\nconst ROOT_SERVICE = \"ODataService\";\r\n\r\nconst RESPONSE_TYPES = {\r\n collection: \"ODataCollectionResponse\",\r\n model: \"ODataModelResponse\",\r\n value: \"ODataValueResponse\",\r\n};\r\n\r\nexport interface PropsAndOps extends Required<Pick<ClassDeclarationStructure, \"properties\" | \"methods\">> {}\r\n\r\nexport interface ServiceGeneratorOptions\r\n extends Pick<ConfigFileOptions, \"enablePrimitivePropertyServices\" | \"v4BigNumberAsString\"> {}\r\n\r\nexport async function generateServices(\r\n dataModel: DataModel,\r\n project: ProjectManager,\r\n version: ODataVersions,\r\n namingHelper: NamingHelper,\r\n options?: ServiceGeneratorOptions\r\n) {\r\n const generator = new ServiceGenerator(dataModel, project, version, namingHelper, options);\r\n return generator.generate();\r\n}\r\n\r\nclass ServiceGenerator {\r\n constructor(\r\n private dataModel: DataModel,\r\n private project: ProjectManager,\r\n private version: ODataVersions,\r\n private namingHelper: NamingHelper,\r\n private options: ServiceGeneratorOptions = {}\r\n ) {}\r\n\r\n private isV4BigNumber() {\r\n return this.options.v4BigNumberAsString && this.version === ODataVersions.V4;\r\n }\r\n\r\n public async generate(): Promise<void> {\r\n const sourceFile = await this.project.createMainServiceFile();\r\n const serviceName = this.namingHelper.getMainServiceName();\r\n const container = this.dataModel.getEntityContainer();\r\n const unboundOperations = [...Object.values(container.functions), ...Object.values(container.actions)];\r\n\r\n const importContainer = new ImportContainer(this.namingHelper.getFileNames());\r\n importContainer.addFromClientApi(\"ODataHttpClient\");\r\n importContainer.addFromService(ROOT_SERVICE);\r\n\r\n const { properties, methods }: PropsAndOps = deepmerge(\r\n this.generateMainServiceProperties(container, importContainer),\r\n this.generateMainServiceOperations(unboundOperations, importContainer)\r\n );\r\n\r\n sourceFile.addClass({\r\n isExported: true,\r\n name: serviceName,\r\n typeParameters: [\"ClientType extends ODataHttpClient\"],\r\n extends: `${ROOT_SERVICE}<ClientType>`,\r\n ctors: this.isV4BigNumber()\r\n ? [\r\n {\r\n parameters: [\r\n { name: \"client\", type: \"ClientType\" },\r\n { name: \"basePath\", type: \"string\" },\r\n ],\r\n statements: [`super(client, basePath, true);`],\r\n },\r\n ]\r\n : [],\r\n properties,\r\n methods,\r\n });\r\n\r\n await this.generateModelServices(sourceFile, importContainer);\r\n\r\n sourceFile.addImportDeclarations(importContainer.getImportDeclarations(false));\r\n }\r\n\r\n private generateMainServiceProperties(\r\n container: EntityContainerModel,\r\n importContainer: ImportContainer\r\n ): PropsAndOps {\r\n const result: PropsAndOps = { properties: [], methods: [] };\r\n\r\n Object.values(container.entitySets).forEach(({ name, odataName, entityType }) => {\r\n result.methods.push(this.generateRelatedServiceGetter(name, odataName, entityType, importContainer));\r\n });\r\n\r\n Object.values(container.singletons).forEach((singleton) => {\r\n result.properties.push(this.generateSingletonProp(singleton, importContainer));\r\n result.methods.push(this.generateSingletonGetter(singleton));\r\n });\r\n\r\n return result;\r\n }\r\n\r\n private generateMainServiceOperations(\r\n ops: Array<FunctionImportType | ActionImportType>,\r\n importContainer: ImportContainer\r\n ): PropsAndOps {\r\n const result: PropsAndOps = { properties: [], methods: [] };\r\n\r\n ops.forEach(({ operation, name }) => {\r\n const op = this.dataModel.getUnboundOperationType(operation);\r\n if (!op) {\r\n throw new Error(`Operation \"${operation}\" not found!`);\r\n }\r\n\r\n result.properties.push(this.generateQOperationProp(op));\r\n result.methods.push(this.generateMethod(name, op, importContainer));\r\n });\r\n\r\n return result;\r\n }\r\n\r\n private generateRelatedServiceGetter(\r\n propName: string,\r\n odataPropName: string,\r\n entityType: ModelType,\r\n importContainer: ImportContainer\r\n ): OptionalKind<MethodDeclarationStructure> {\r\n const idName = entityType.idModelName;\r\n const idFunctionName = entityType.qIdFunctionName;\r\n const serviceName = this.namingHelper.getServiceName(entityType.name);\r\n const collectionName = this.namingHelper.getCollectionServiceName(entityType.name);\r\n\r\n importContainer.addFromClientApi(\"ODataHttpClient\");\r\n importContainer.addGeneratedModel(idName);\r\n importContainer.addGeneratedQObject(idFunctionName);\r\n\r\n return {\r\n scope: Scope.Public,\r\n name: this.namingHelper.getRelatedServiceGetter(propName),\r\n parameters: [\r\n {\r\n name: \"id\",\r\n type: `${idName} | undefined`,\r\n hasQuestionToken: true,\r\n },\r\n ],\r\n overloads: [\r\n {\r\n parameters: [],\r\n returnType: `${collectionName}<ClientType>`,\r\n },\r\n {\r\n parameters: [\r\n {\r\n name: \"id\",\r\n type: idName,\r\n },\r\n ],\r\n returnType: `${serviceName}<ClientType>`,\r\n },\r\n ],\r\n statements: [\r\n `const fieldName = \"${odataPropName}\";`,\r\n `const { client, path } = this.__base;`,\r\n 'return typeof id === \"undefined\" || id === null',\r\n `? new ${collectionName}(client, path, fieldName)`,\r\n `: new ${serviceName}(client, path, new ${idFunctionName}(fieldName).buildUrl(id));`,\r\n ],\r\n };\r\n }\r\n\r\n private generateSingletonProp(\r\n singleton: SingletonType,\r\n importContainer: ImportContainer\r\n ): OptionalKind<PropertyDeclarationStructure> {\r\n const { name, entityType } = singleton;\r\n const type = this.namingHelper.getServiceName(entityType.name);\r\n\r\n return {\r\n scope: Scope.Private,\r\n name: this.namingHelper.getPrivatePropName(name),\r\n type: `${type}<ClientType>`,\r\n hasQuestionToken: true,\r\n };\r\n }\r\n\r\n private generateQOperationProp = (operation: OperationType) => {\r\n return {\r\n scope: Scope.Private,\r\n name: this.namingHelper.getPrivatePropName(operation.qName),\r\n type: operation.qName,\r\n hasQuestionToken: true,\r\n };\r\n };\r\n\r\n private generateSingletonGetter(singleton: SingletonType): OptionalKind<MethodDeclarationStructure> {\r\n const { name, odataName, entityType } = singleton;\r\n const propName = \"this.\" + this.namingHelper.getPrivatePropName(name);\r\n const serviceType = this.namingHelper.getServiceName(entityType.name);\r\n\r\n return {\r\n scope: Scope.Public,\r\n name: this.namingHelper.getRelatedServiceGetter(name),\r\n statements: [\r\n `if(!${propName}) {`,\r\n ` const { client, path } = this.__base;`,\r\n // prettier-ignore\r\n ` ${propName} = new ${serviceType}(client, path, \"${odataName}\")`,\r\n \"}\",\r\n `return ${propName}`,\r\n ],\r\n };\r\n }\r\n\r\n private getVersionSuffix() {\r\n return this.version === ODataVersions.V2 ? \"V2\" : \"V4\";\r\n }\r\n\r\n private async generateEntityTypeService(\r\n model: ComplexType,\r\n serviceName: string,\r\n serviceFile: SourceFile,\r\n importContainer: ImportContainer\r\n ) {\r\n const entityServiceType = \"EntityTypeService\" + this.getVersionSuffix();\r\n\r\n const editableModelName = model.editableName;\r\n const qObjectName = firstCharLowerCase(model.qName);\r\n const operations = this.dataModel.getEntityTypeOperations(model.fqName);\r\n const props = [...model.baseProps, ...model.props];\r\n\r\n importContainer.addFromService(entityServiceType);\r\n importContainer.addFromClientApi(\"ODataHttpClient\");\r\n importContainer.addGeneratedModel(model.name, editableModelName);\r\n importContainer.addGeneratedQObject(model.qName, qObjectName);\r\n\r\n const { properties, methods }: PropsAndOps = deepmerge(\r\n this.generateServiceProperties(serviceName, props, importContainer),\r\n this.generateServiceOperations(operations, importContainer)\r\n );\r\n\r\n // generate EntityTypeService\r\n serviceFile.addClass({\r\n isExported: true,\r\n name: serviceName,\r\n typeParameters: [\"ClientType extends ODataHttpClient\"],\r\n extends: entityServiceType + `<ClientType, ${model.name}, ${editableModelName}, ${model.qName}>`,\r\n ctors: [\r\n {\r\n parameters: [\r\n { name: \"client\", type: \"ClientType\" },\r\n { name: \"basePath\", type: \"string\" },\r\n { name: \"name\", type: \"string\" },\r\n ],\r\n statements: [`super(client, basePath, name, ${qObjectName}${this.isV4BigNumber() ? \", true\" : \"\"});`],\r\n },\r\n ],\r\n properties,\r\n methods,\r\n });\r\n }\r\n\r\n private getPrimitiveServiceType() {\r\n return \"PrimitiveTypeService\" + this.getVersionSuffix();\r\n }\r\n\r\n private generateServiceProperties(\r\n serviceName: string,\r\n props: Array<PropertyModel>,\r\n importContainer: ImportContainer\r\n ): PropsAndOps {\r\n const collectionServiceType = \"CollectionService\" + this.getVersionSuffix();\r\n const result: PropsAndOps = { properties: [], methods: [] };\r\n\r\n props.forEach((prop) => {\r\n if ((prop.dataType === DataTypes.ModelType && !prop.isCollection) || prop.dataType === DataTypes.ComplexType) {\r\n result.properties.push(this.generateModelProp(prop, collectionServiceType, serviceName, importContainer));\r\n result.methods.push(this.generateModelPropGetter(prop, collectionServiceType));\r\n } else if (prop.isCollection) {\r\n // collection of entity types\r\n if (prop.dataType === DataTypes.ModelType) {\r\n const entityType = this.dataModel.getEntityType(prop.fqType);\r\n if (!entityType) {\r\n throw new Error(`Entity type \"${prop.fqType}\" specified by property not found!`);\r\n }\r\n\r\n result.methods.push(\r\n this.generateRelatedServiceGetter(prop.name, prop.odataName, entityType, importContainer)\r\n );\r\n }\r\n // collection of primitive or complex types\r\n else {\r\n result.properties.push(this.generatePrimitiveCollectionProp(prop, collectionServiceType, importContainer));\r\n result.methods.push(this.generatePrimitiveCollectionGetter(prop, collectionServiceType));\r\n }\r\n } else if (this.options.enablePrimitivePropertyServices && prop.dataType === DataTypes.PrimitiveType) {\r\n result.properties.push(this.generatePrimitiveTypeProp(prop, importContainer));\r\n result.methods.push(this.generatePrimitiveTypeGetter(prop));\r\n }\r\n });\r\n\r\n return result;\r\n }\r\n\r\n private generateServiceOperations(operations: Array<OperationType>, importContainer: ImportContainer): PropsAndOps {\r\n const result: PropsAndOps = { properties: [], methods: [] };\r\n\r\n operations.forEach((operation) => {\r\n result.properties.push(this.generateQOperationProp(operation));\r\n result.methods.push(this.generateMethod(operation.name, operation, importContainer));\r\n });\r\n\r\n return result;\r\n }\r\n\r\n private generateModelProp(\r\n prop: PropertyModel,\r\n collectionServiceType: string,\r\n serviceName: string,\r\n importContainer: ImportContainer\r\n ): PropertyDeclarationStructure {\r\n const complexType = this.dataModel.getComplexType(prop.fqType);\r\n const key = this.namingHelper.getServiceName(prop.type);\r\n let propModelType = prop.isCollection ? this.namingHelper.getCollectionServiceName(prop.type) : key;\r\n\r\n if (prop.isCollection && complexType) {\r\n const editableName = complexType.editableName;\r\n importContainer.addFromService(collectionServiceType);\r\n importContainer.addGeneratedModel(complexType.name, editableName);\r\n importContainer.addGeneratedQObject(complexType.qName, firstCharLowerCase(complexType.qName));\r\n propModelType = `${collectionServiceType}<ClientType, ${complexType.name}, ${complexType.qName}, ${editableName}>`;\r\n } else {\r\n propModelType = `${propModelType}<ClientType>`;\r\n }\r\n\r\n return {\r\n scope: Scope.Private,\r\n name: this.namingHelper.getPrivatePropName(prop.name),\r\n type: propModelType,\r\n hasQuestionToken: true,\r\n } as PropertyDeclarationStructure;\r\n }\r\n\r\n private generatePrimitiveCollectionProp(\r\n prop: PropertyModel,\r\n collectionServiceType: string,\r\n importContainer: ImportContainer\r\n ): OptionalKind<PropertyDeclarationStructure> {\r\n const isEnum = prop.dataType === DataTypes.EnumType;\r\n const type = isEnum ? `EnumCollection<${prop.type}>` : `${upperCaseFirst(prop.type)}Collection`;\r\n const qType = isEnum ? \"QEnumCollection\" : prop.qObject;\r\n const collectionType = `${collectionServiceType}<ClientType, ${type}, ${qType}>`;\r\n\r\n if (!prop.qObject) {\r\n throw new Error(\"Illegal State: [qObject] must be provided for Collection types!\");\r\n }\r\n\r\n importContainer.addFromService(collectionServiceType);\r\n importContainer.addFromQObject(prop.qObject, firstCharLowerCase(prop.qObject));\r\n if (isEnum) {\r\n importContainer.addGeneratedModel(prop.type);\r\n importContainer.addFromQObject(\"EnumCollection\");\r\n } else {\r\n importContainer.addFromQObject(type);\r\n }\r\n\r\n return {\r\n scope: Scope.Private,\r\n name: this.namingHelper.getPrivatePropName(prop.name),\r\n type: `${collectionType}`,\r\n hasQuestionToken: true,\r\n };\r\n }\r\n\r\n private generatePrimitiveTypeProp(\r\n prop: PropertyModel,\r\n importContainer: ImportContainer\r\n ): OptionalKind<PropertyDeclarationStructure> {\r\n const serviceType = this.getPrimitiveServiceType();\r\n importContainer.addFromService(serviceType);\r\n if (prop.typeModule) {\r\n importContainer.addCustomType(prop.typeModule, prop.type);\r\n }\r\n\r\n return {\r\n scope: Scope.Private,\r\n name: this.namingHelper.getPrivatePropName(prop.name),\r\n type: `${serviceType}<ClientType, ${prop.type}>`,\r\n hasQuestionToken: true,\r\n };\r\n }\r\n\r\n private generateModelPropGetter(\r\n prop: PropertyModel,\r\n collectionServiceType: string\r\n ): OptionalKind<MethodDeclarationStructure> {\r\n const complexType = this.dataModel.getComplexType(prop.fqType);\r\n const isComplexCollection = prop.isCollection && complexType;\r\n const type = isComplexCollection\r\n ? collectionServiceType\r\n : prop.isCollection\r\n ? this.namingHelper.getCollectionServiceName(prop.type)\r\n : this.namingHelper.getServiceName(prop.type);\r\n const typeWithGenerics = isComplexCollection\r\n ? `${collectionServiceType}<ClientType, ${complexType.name}, ${complexType.qName}, ${complexType.editableName}>`\r\n : `${type}<ClientType>`;\r\n\r\n const privateSrvProp = \"this.\" + this.namingHelper.getPrivatePropName(prop.name);\r\n\r\n return {\r\n scope: Scope.Public,\r\n name: this.namingHelper.getRelatedServiceGetter(prop.name),\r\n returnType: typeWithGenerics,\r\n statements: [\r\n `if(!${privateSrvProp}) {`,\r\n ` const { client, path } = this.__base;`,\r\n // prettier-ignore\r\n ` ${privateSrvProp} = new ${type}(client, path, \"${prop.odataName}\"${isComplexCollection ? `, ${firstCharLowerCase(complexType.qName)}`: \"\"})`,\r\n \"}\",\r\n `return ${privateSrvProp}`,\r\n ],\r\n };\r\n }\r\n\r\n private generatePrimitiveCollectionGetter(\r\n prop: PropertyModel,\r\n collectionServiceType: string\r\n ): OptionalKind<MethodDeclarationStructure> {\r\n const propName = \"this.\" + this.namingHelper.getPrivatePropName(prop.name);\r\n return {\r\n scope: Scope.Public,\r\n name: this.namingHelper.getRelatedServiceGetter(prop.name),\r\n statements: [\r\n `if(!${propName}) {`,\r\n ` const { client, path } = this.__base;`,\r\n // prettier-ignore\r\n ` ${propName} = new ${collectionServiceType}(client, path, \"${prop.odataName}\", ${firstCharLowerCase(prop.qObject!)}${this.isV4BigNumber() ? \", true\": \"\"})`,\r\n \"}\",\r\n `return ${propName}`,\r\n ],\r\n };\r\n }\r\n\r\n private generatePrimitiveTypeGetter(prop: PropertyModel): OptionalKind<MethodDeclarationStructure> {\r\n const serviceType = this.getPrimitiveServiceType();\r\n const propName = \"this.\" + this.namingHelper.getPrivatePropName(prop.name);\r\n // for V2: mapped name must be specified\r\n const useMappedName = this.version === ODataVersions.V2 && prop.name !== prop.odataName;\r\n // for V4: big number support\r\n const useBigNumber = this.isV4BigNumber();\r\n const addParamString = useMappedName ? `, \"${prop.name}\"` : useBigNumber ? \", true\" : \"\";\r\n\r\n return {\r\n scope: Scope.Public,\r\n name: this.namingHelper.getRelatedServiceGetter(prop.name),\r\n statements: [\r\n `if(!${propName}) {`,\r\n ` const { client, path, qModel } = this.__base;`,\r\n ` ${propName} = new ${serviceType}(client, path, \"${prop.odataName}\", qModel.${prop.name}.converter${addParamString})`,\r\n \"}\",\r\n `return ${propName}`,\r\n ],\r\n };\r\n }\r\n\r\n private async generateEntityCollectionService(\r\n model: ModelType,\r\n serviceFile: SourceFile,\r\n importContainer: ImportContainer\r\n ) {\r\n const entitySetServiceType = \"EntitySetService\" + this.getVersionSuffix();\r\n const editableModelName = model.editableName;\r\n const qObjectName = firstCharLowerCase(model.qName);\r\n\r\n importContainer.addFromService(entitySetServiceType);\r\n importContainer.addGeneratedModel(model.idModelName);\r\n importContainer.addGeneratedQObject(model.qIdFunctionName);\r\n\r\n const collectionOperations = this.dataModel.getEntityTypeOperations(`Collection(${model.fqName})`);\r\n\r\n const { properties, methods } = this.generateServiceOperations(collectionOperations, importContainer);\r\n\r\n serviceFile.addClass({\r\n isExported: true,\r\n name: this.namingHelper.getCollectionServiceName(model.name),\r\n typeParameters: [\"ClientType extends ODataHttpClient\"],\r\n extends:\r\n entitySetServiceType +\r\n `<ClientType, ${model.name}, ${editableModelName}, ${model.qName}, ${model.idModelName}>`,\r\n ctors: [\r\n {\r\n parameters: [\r\n { name: \"client\", type: \"ClientType\" },\r\n { name: \"basePath\", type: \"string\" },\r\n { name: \"name\", type: \"string\" },\r\n ],\r\n statements: [\r\n `super(client, basePath, name, ${qObjectName}, new ${model.qIdFunctionName}(name)${\r\n this.isV4BigNumber() ? \", true\" : \"\"\r\n });`,\r\n ],\r\n },\r\n ],\r\n properties,\r\n methods,\r\n });\r\n }\r\n\r\n private async generateModelServices(serviceFile: SourceFile, importContainer: ImportContainer) {\r\n // build service file for each entity, consisting of EntityTypeService & EntityCollectionService\r\n for (const model of this.dataModel.getEntityTypes()) {\r\n const serviceName = this.namingHelper.getServiceName(model.name);\r\n\r\n // entity type service\r\n await this.generateEntityTypeService(model, serviceName, serviceFile, importContainer);\r\n\r\n // entity collection service\r\n await this.generateEntityCollectionService(model, serviceFile, importContainer);\r\n }\r\n\r\n // build service file for complex types\r\n for (const model of this.dataModel.getComplexTypes()) {\r\n const serviceName = this.namingHelper.getServiceName(model.name);\r\n\r\n // entity type service\r\n await this.generateEntityTypeService(model, serviceName, serviceFile, importContainer);\r\n }\r\n }\r\n\r\n private generateMethod(\r\n name: string,\r\n operation: OperationType,\r\n importContainer: ImportContainer\r\n ): OptionalKind<MethodDeclarationStructure> {\r\n const isFunc = operation.type === OperationTypes.Function;\r\n const odataType = operation.returnType?.isCollection\r\n ? RESPONSE_TYPES.collection + this.getVersionSuffix()\r\n : operation.returnType?.dataType === DataTypes.PrimitiveType\r\n ? RESPONSE_TYPES.value + this.getVersionSuffix()\r\n : RESPONSE_TYPES.model + this.getVersionSuffix();\r\n const returnType = operation.returnType;\r\n const requestConfigParam = {\r\n name: \"requestConfig\",\r\n hasQuestionToken: true,\r\n type: \"ODataHttpClientConfig<ClientType>\",\r\n };\r\n const hasParams = operation.parameters.length > 0;\r\n\r\n // importing dependencies\r\n importContainer.addFromClientApi(\"ODataHttpClientConfig\", \"ODataResponse\");\r\n importContainer.addFromCore(odataType);\r\n if (returnType?.type) {\r\n if ([DataTypes.EnumType, DataTypes.ModelType, DataTypes.ComplexType].includes(returnType.dataType)) {\r\n importContainer.addGeneratedModel(returnType.type);\r\n }\r\n }\r\n importContainer.addGeneratedQObject(operation.qName);\r\n if (hasParams) {\r\n importContainer.addGeneratedModel(operation.paramsModelName);\r\n }\r\n\r\n const qOpProp = \"this.\" + this.namingHelper.getPrivatePropName(operation.qName);\r\n\r\n return {\r\n scope: Scope.Public,\r\n isAsync: true,\r\n name,\r\n parameters: hasParams\r\n ? [{ name: \"params\", type: operation.paramsModelName }, requestConfigParam]\r\n : [requestConfigParam],\r\n returnType: `ODataResponse<${odataType}<${returnType?.type || \"void\"}>>`,\r\n statements: [\r\n `if(!${qOpProp}) {`,\r\n ` ${qOpProp} = new ${operation.qName}()`,\r\n \"}\",\r\n\r\n `const { addFullPath, client, getDefaultHeaders } = this.__base;`,\r\n `const url = addFullPath(${qOpProp}.buildUrl(${isFunc && hasParams ? \"params\" : \"\"}));`,\r\n `${returnType ? \"const response = await \" : \"return\"} client.${\r\n !isFunc\r\n ? // actions: since V4\r\n `post(url, ${hasParams ? `${qOpProp}.convertUserParams(params)` : \"{}\"}, ${\r\n requestConfigParam.name\r\n }, getDefaultHeaders())`\r\n : operation.usePost\r\n ? // V2 POST => BUT values are still query params, they are not part of the request body\r\n `post(url, undefined, ${requestConfigParam.name}, getDefaultHeaders())`\r\n : // functions: since V2\r\n `get(url, ${requestConfigParam.name}, getDefaultHeaders())`\r\n };`,\r\n returnType ? `return ${qOpProp}.convertResponse(response);` : \"\",\r\n ],\r\n };\r\n }\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@odata2ts/odata2ts",
3
- "version": "0.30.0",
3
+ "version": "0.31.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -87,6 +87,6 @@
87
87
  "typescript": "^5.1.3"
88
88
  },
89
89
  "types": "./lib/index.d.ts",
90
- "gitHead": "548d7d30c7559c9be67259282f372407273ea714",
90
+ "gitHead": "cecca6ee336bcad3c9380c6c88d4c32225032981",
91
91
  "readme": "README.md"
92
92
  }