@odata2ts/odata2ts 0.36.3 → 0.38.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 (133) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/lib/FactoryFunctionModel.d.ts +7 -7
  3. package/lib/FactoryFunctionModel.js +1 -2
  4. package/lib/FactoryFunctionModel.js.map +1 -1
  5. package/lib/NamingModel.js +2 -5
  6. package/lib/NamingModel.js.map +1 -1
  7. package/lib/OptionModel.d.ts +7 -2
  8. package/lib/OptionModel.js +4 -7
  9. package/lib/OptionModel.js.map +1 -1
  10. package/lib/TypeModel.js +2 -5
  11. package/lib/TypeModel.js.map +1 -1
  12. package/lib/app.d.ts +2 -2
  13. package/lib/app.js +23 -27
  14. package/lib/app.js.map +1 -1
  15. package/lib/cli/cli.d.ts +1 -0
  16. package/lib/cli/cli.js +27 -0
  17. package/lib/cli/cli.js.map +1 -0
  18. package/lib/cli/index.d.ts +4 -0
  19. package/lib/cli/index.js +5 -0
  20. package/lib/cli/index.js.map +1 -0
  21. package/lib/cli/processCliArgs.d.ts +2 -0
  22. package/lib/cli/processCliArgs.js +57 -0
  23. package/lib/cli/processCliArgs.js.map +1 -0
  24. package/lib/cli/processConfigFile.d.ts +2 -0
  25. package/lib/cli/processConfigFile.js +24 -0
  26. package/lib/cli/processConfigFile.js.map +1 -0
  27. package/lib/cli/serviceGenerationRun.d.ts +2 -0
  28. package/lib/cli/serviceGenerationRun.js +77 -0
  29. package/lib/cli/serviceGenerationRun.js.map +1 -0
  30. package/lib/data-model/DataModel.d.ts +2 -2
  31. package/lib/data-model/DataModel.js +5 -10
  32. package/lib/data-model/DataModel.js.map +1 -1
  33. package/lib/data-model/DataModelDigestion.d.ts +10 -10
  34. package/lib/data-model/DataModelDigestion.js +27 -27
  35. package/lib/data-model/DataModelDigestion.js.map +1 -1
  36. package/lib/data-model/DataModelDigestionV2.d.ts +2 -2
  37. package/lib/data-model/DataModelDigestionV2.js +27 -31
  38. package/lib/data-model/DataModelDigestionV2.js.map +1 -1
  39. package/lib/data-model/DataModelDigestionV4.d.ts +2 -2
  40. package/lib/data-model/DataModelDigestionV4.js +33 -37
  41. package/lib/data-model/DataModelDigestionV4.js.map +1 -1
  42. package/lib/data-model/DataTypeModel.d.ts +5 -2
  43. package/lib/data-model/DataTypeModel.js +2 -5
  44. package/lib/data-model/DataTypeModel.js.map +1 -1
  45. package/lib/data-model/NamingHelper.d.ts +2 -2
  46. package/lib/data-model/NamingHelper.js +12 -19
  47. package/lib/data-model/NamingHelper.js.map +1 -1
  48. package/lib/data-model/ServiceConfigHelper.d.ts +3 -3
  49. package/lib/data-model/ServiceConfigHelper.js +18 -22
  50. package/lib/data-model/ServiceConfigHelper.js.map +1 -1
  51. package/lib/data-model/edmx/ODataEdmxModelBase.js +1 -2
  52. package/lib/data-model/edmx/ODataEdmxModelV3.d.ts +1 -1
  53. package/lib/data-model/edmx/ODataEdmxModelV3.js +1 -2
  54. package/lib/data-model/edmx/ODataEdmxModelV3.js.map +1 -1
  55. package/lib/data-model/edmx/ODataEdmxModelV4.d.ts +1 -1
  56. package/lib/data-model/edmx/ODataEdmxModelV4.js +1 -2
  57. package/lib/data-model/edmx/ODataEdmxModelV4.js.map +1 -1
  58. package/lib/data-model/validation/NameClashValidator.d.ts +5 -4
  59. package/lib/data-model/validation/NameClashValidator.js +16 -18
  60. package/lib/data-model/validation/NameClashValidator.js.map +1 -1
  61. package/lib/data-model/validation/NameValidator.d.ts +3 -2
  62. package/lib/data-model/validation/NameValidator.js +1 -2
  63. package/lib/data-model/validation/NameValidator.js.map +1 -1
  64. package/lib/data-model/validation/NoopValidator.d.ts +4 -3
  65. package/lib/data-model/validation/NoopValidator.js +5 -9
  66. package/lib/data-model/validation/NoopValidator.js.map +1 -1
  67. package/lib/defaultConfig.d.ts +1 -1
  68. package/lib/defaultConfig.js +22 -26
  69. package/lib/defaultConfig.js.map +1 -1
  70. package/lib/download/downloadMetadata.d.ts +1 -1
  71. package/lib/download/downloadMetadata.js +6 -10
  72. package/lib/download/downloadMetadata.js.map +1 -1
  73. package/lib/download/index.d.ts +2 -2
  74. package/lib/download/index.js +2 -7
  75. package/lib/download/index.js.map +1 -1
  76. package/lib/download/storeMetadata.js +15 -17
  77. package/lib/download/storeMetadata.js.map +1 -1
  78. package/lib/evaluateConfig.d.ts +1 -1
  79. package/lib/evaluateConfig.js +14 -18
  80. package/lib/evaluateConfig.js.map +1 -1
  81. package/lib/generator/ImportContainer.d.ts +3 -3
  82. package/lib/generator/ImportContainer.js +40 -27
  83. package/lib/generator/ImportContainer.js.map +1 -1
  84. package/lib/generator/ImportedNameValidator.js +1 -5
  85. package/lib/generator/ImportedNameValidator.js.map +1 -1
  86. package/lib/generator/ModelGenerator.d.ts +1 -1
  87. package/lib/generator/ModelGenerator.js +13 -13
  88. package/lib/generator/ModelGenerator.js.map +1 -1
  89. package/lib/generator/QueryObjectGenerator.d.ts +1 -1
  90. package/lib/generator/QueryObjectGenerator.js +41 -31
  91. package/lib/generator/QueryObjectGenerator.js.map +1 -1
  92. package/lib/generator/ServiceGenerator.d.ts +5 -5
  93. package/lib/generator/ServiceGenerator.js +62 -65
  94. package/lib/generator/ServiceGenerator.js.map +1 -1
  95. package/lib/generator/import/ImportObjects.d.ts +3 -1
  96. package/lib/generator/import/ImportObjects.js +14 -15
  97. package/lib/generator/import/ImportObjects.js.map +1 -1
  98. package/lib/generator/index.d.ts +3 -3
  99. package/lib/generator/index.js +3 -9
  100. package/lib/generator/index.js.map +1 -1
  101. package/lib/index.d.ts +4 -4
  102. package/lib/index.js +4 -7
  103. package/lib/index.js.map +1 -1
  104. package/lib/project/FileHandler.d.ts +3 -3
  105. package/lib/project/FileHandler.js +12 -16
  106. package/lib/project/FileHandler.js.map +1 -1
  107. package/lib/project/ProjectManager.d.ts +5 -5
  108. package/lib/project/ProjectManager.js +25 -32
  109. package/lib/project/ProjectManager.js.map +1 -1
  110. package/lib/project/TsMorphHelper.d.ts +1 -1
  111. package/lib/project/TsMorphHelper.js +21 -22
  112. package/lib/project/TsMorphHelper.js.map +1 -1
  113. package/lib/project/formatter/BaseFormatter.d.ts +1 -1
  114. package/lib/project/formatter/BaseFormatter.js +1 -5
  115. package/lib/project/formatter/BaseFormatter.js.map +1 -1
  116. package/lib/project/formatter/FileFormatter.js +1 -2
  117. package/lib/project/formatter/NoopFormatter.d.ts +1 -1
  118. package/lib/project/formatter/NoopFormatter.js +5 -9
  119. package/lib/project/formatter/NoopFormatter.js.map +1 -1
  120. package/lib/project/formatter/PrettierFormatter.d.ts +1 -1
  121. package/lib/project/formatter/PrettierFormatter.js +20 -25
  122. package/lib/project/formatter/PrettierFormatter.js.map +1 -1
  123. package/lib/project/formatter/index.d.ts +1 -1
  124. package/lib/project/formatter/index.js +6 -10
  125. package/lib/project/formatter/index.js.map +1 -1
  126. package/lib/project/logger/logFilePath.js +4 -9
  127. package/lib/project/logger/logFilePath.js.map +1 -1
  128. package/lib/run-cli.js +2 -4
  129. package/lib/run-cli.js.map +1 -1
  130. package/package.json +55 -64
  131. package/lib/cli.d.ts +0 -3
  132. package/lib/cli.js +0 -176
  133. package/lib/cli.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ImportContainer.js","sourceRoot":"","sources":["../../src/generator/ImportContainer.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"path\";\r\n\r\nimport { ODataVersions } from \"@odata2ts/odata-core\";\r\nimport { ImportDeclarationStructure, OptionalKind } from \"ts-morph\";\r\n\r\nimport { DataModel } from \"../data-model/DataModel\";\r\nimport { ComplexType } from \"../data-model/DataTypeModel\";\r\nimport {\r\n ClientApiImports,\r\n CoreImports,\r\n LIB_MODULES,\r\n QueryObjectImports,\r\n ServiceImports,\r\n VERSIONED_CORE_IMPORTS,\r\n VERSIONED_SERVICE_IMPORTS,\r\n} from \"./import/ImportObjects\";\r\nimport { ImportedNameValidator } from \"./ImportedNameValidator\";\r\n\r\ntype ImportContainerType = Record<\r\n keyof typeof LIB_MODULES,\r\n { regular: Map<string, string>; typeOnly: Map<string, string> }\r\n>;\r\n\r\n/**\r\n * Handles all the import statements for a given file.\r\n *\r\n * Features a renaming mechanism, so that when the import name conflicts with an existing import a new\r\n * name is generated and returned.\r\n *\r\n * Map<string,string>\r\n */\r\nexport class ImportContainer {\r\n private readonly importedNameValidator: ImportedNameValidator;\r\n // mapping of a custom defined type to a primitive type\r\n private customTypes = {\r\n regular: new Map<string, Map<string, string>>(),\r\n typeOnly: new Map<string, Map<string, string>>(),\r\n };\r\n // imports to generated artefacts\r\n private internalImports = {\r\n regular: new Map<string, Map<string, string>>(),\r\n typeOnly: new Map<string, Map<string, string>>(),\r\n };\r\n\r\n private libs: ImportContainerType = {\r\n core: { regular: new Map(), typeOnly: new Map() },\r\n qObject: { regular: new Map(), typeOnly: new Map() },\r\n clientApi: { regular: new Map(), typeOnly: new Map() },\r\n service: { regular: new Map(), typeOnly: new Map() },\r\n };\r\n\r\n constructor(\r\n protected path: string,\r\n protected fileName: string,\r\n protected dataModel: DataModel,\r\n protected mainFileNames: { model: string; qObject: string; service: string },\r\n protected readonly bundledFileGeneration: boolean,\r\n protected reservedNames: Array<string> | undefined\r\n ) {\r\n this.importedNameValidator = new ImportedNameValidator(reservedNames);\r\n }\r\n\r\n public addCoreLib(odataVersion: ODataVersions, coreLib: CoreImports) {\r\n const isVersioned = VERSIONED_CORE_IMPORTS.includes(coreLib);\r\n const name = CoreImports[coreLib] + (isVersioned ? ODataVersions[odataVersion] : \"\");\r\n const importName = this.importedNameValidator.validateName(LIB_MODULES.core, name);\r\n\r\n // TODO: currently only types are imported, however enums could potentially be imported too\r\n this.libs.core.typeOnly.set(name, importName);\r\n\r\n return importName;\r\n }\r\n\r\n private addFromQObject(name: string, typeOnlyImport = false) {\r\n const importName = this.importedNameValidator.validateName(LIB_MODULES.qObject, name);\r\n\r\n const imports = typeOnlyImport ? this.libs.qObject.typeOnly : this.libs.qObject.regular;\r\n imports.set(name, importName);\r\n\r\n return importName;\r\n }\r\n\r\n public addQObject(qObject: QueryObjectImports | string) {\r\n return this.addFromQObject(qObject);\r\n }\r\n\r\n public addQObjectType(qObject: string) {\r\n return this.addFromQObject(qObject, true);\r\n }\r\n\r\n public addClientApi(clientApi: ClientApiImports) {\r\n const name = ClientApiImports[clientApi];\r\n const importName = this.importedNameValidator.validateName(LIB_MODULES.clientApi, name);\r\n\r\n // complete client api consists only of types\r\n this.libs.clientApi.typeOnly.set(name, importName);\r\n return importName;\r\n }\r\n\r\n public addServiceObject(odataVersion: ODataVersions, serviceObject: ServiceImports) {\r\n const isVersioned = VERSIONED_SERVICE_IMPORTS.includes(serviceObject);\r\n const name = ServiceImports[serviceObject] + (isVersioned ? ODataVersions[odataVersion] : \"\");\r\n const importName = this.importedNameValidator.validateName(LIB_MODULES.service, name);\r\n\r\n // only regular imports for the service package\r\n this.libs.service.regular.set(name, importName);\r\n return importName;\r\n }\r\n\r\n public addCustomType(moduleName: string, typeName: string, isTypeOnly: boolean = false) {\r\n const importName = this.importedNameValidator.validateName(moduleName, typeName);\r\n const imports = isTypeOnly ? this.customTypes.typeOnly : this.customTypes.regular;\r\n let importList = imports.get(moduleName);\r\n if (!importList) {\r\n importList = new Map();\r\n imports.set(moduleName, importList);\r\n }\r\n\r\n importList.set(typeName, importName);\r\n return importName;\r\n }\r\n\r\n private pathAndFile(filePath: string, fileName: string) {\r\n return filePath ? `${filePath}/${fileName}` : fileName;\r\n }\r\n\r\n private isDifferentFile(filePath: string, fileName: string) {\r\n return this.pathAndFile(this.path, this.fileName) !== this.pathAndFile(filePath, fileName);\r\n }\r\n\r\n private addGeneratedImport(folderPath: string, fileName: string, name: string, isTypeOnly = false): string {\r\n // imports are only relevant for different files\r\n if (!this.isDifferentFile(folderPath, fileName)) {\r\n return name;\r\n }\r\n\r\n const moduleName = this.pathAndFile(folderPath, fileName);\r\n const importName = this.importedNameValidator.validateName(moduleName, name);\r\n const imports = isTypeOnly ? this.internalImports.typeOnly : this.internalImports.regular;\r\n\r\n const importList = imports.get(moduleName) || new Map<string, string>();\r\n importList.set(name, importName);\r\n imports.set(moduleName, importList);\r\n\r\n return importName;\r\n }\r\n\r\n public addGeneratedModel(fqName: string, name: string): string {\r\n if (this.bundledFileGeneration) {\r\n return this.addGeneratedImport(\"\", this.mainFileNames.model, name, true);\r\n } else {\r\n const model = this.dataModel.getModel(fqName) as ComplexType | undefined;\r\n if (!model && fqName !== \"\") {\r\n throw new Error(`Cannot find model by its fully qualified name: ${fqName}!`);\r\n }\r\n\r\n const folderPath = model ? model.folderPath : \"\";\r\n const modelName = model ? model.modelName : this.mainFileNames.model;\r\n return this.addGeneratedImport(folderPath, modelName, name, true);\r\n }\r\n }\r\n\r\n public addGeneratedQObject(fqName: string, name: string, isTypeOnly = false) {\r\n if (this.bundledFileGeneration) {\r\n return this.addGeneratedImport(\"\", this.mainFileNames.qObject, name, isTypeOnly);\r\n } else {\r\n const model = this.dataModel.getModel(fqName) as ComplexType | undefined;\r\n if (!model && fqName !== \"\") {\r\n throw new Error(`Cannot find q-object by its fully qualified name: ${fqName}!`);\r\n }\r\n\r\n const folderPath = model ? model.folderPath : \"\";\r\n const qName = model ? model.qName : this.mainFileNames!.qObject;\r\n return this.addGeneratedImport(folderPath, qName, name, isTypeOnly);\r\n }\r\n }\r\n\r\n public addGeneratedService(fqName: string, name: string) {\r\n if (this.bundledFileGeneration) {\r\n return this.addGeneratedImport(\"\", this.mainFileNames.service, name);\r\n } else {\r\n const model = this.dataModel.getModel(fqName) as ComplexType;\r\n return this.addGeneratedImport(model.folderPath, model.serviceName, name);\r\n }\r\n }\r\n\r\n private createImportDecl(\r\n module: string,\r\n toImport: Map<string, string>,\r\n isTypeOnly = false\r\n ): OptionalKind<ImportDeclarationStructure> {\r\n return {\r\n namedImports: this.getNamedImports(toImport),\r\n moduleSpecifier: module,\r\n isTypeOnly,\r\n };\r\n }\r\n\r\n public getImportDeclarations(): Array<OptionalKind<ImportDeclarationStructure>> {\r\n return [\r\n ...Object.entries(this.libs).reduce<Array<OptionalKind<ImportDeclarationStructure>>>(\r\n (result, [moduleName, toImport]) => {\r\n const module = LIB_MODULES[moduleName as keyof typeof LIB_MODULES];\r\n if (toImport.typeOnly.size) {\r\n result.push(this.createImportDecl(module, toImport.typeOnly, true));\r\n }\r\n if (toImport.regular.size) {\r\n result.push(this.createImportDecl(module, toImport.regular));\r\n }\r\n return result;\r\n },\r\n []\r\n ),\r\n ...[...this.customTypes.typeOnly]\r\n .filter(([moduleName, toImport]) => toImport.size > 0)\r\n .map(([moduleName, toImport]) => {\r\n return this.createImportDecl(moduleName, toImport, true);\r\n }),\r\n ...[...this.customTypes.regular]\r\n .filter(([moduleName, toImport]) => toImport.size > 0)\r\n .map(([moduleName, toImport]) => {\r\n return this.createImportDecl(moduleName, toImport);\r\n }),\r\n ...[...this.internalImports.typeOnly]\r\n .filter(([_, toImport]) => toImport.size > 0)\r\n .map(([key, toImport]) => {\r\n const module = this.getModuleSpecifier(key);\r\n return this.createImportDecl(module, toImport, true);\r\n }),\r\n ...[...this.internalImports.regular]\r\n .filter(([_, toImport]) => toImport.size > 0)\r\n .map(([key, toImport]) => {\r\n const module = this.getModuleSpecifier(key);\r\n return this.createImportDecl(module, toImport);\r\n }),\r\n ];\r\n }\r\n\r\n private getNamedImports(toImport: Map<string, string>): Array<{ name: string; alias: string | undefined }> {\r\n return [...toImport.entries()].map(([name, alias]) => ({\r\n name,\r\n alias: alias !== name ? alias : undefined,\r\n }));\r\n }\r\n\r\n private getModuleSpecifier(filePath: string): string {\r\n const relativePath = path.relative(this.path, filePath).replaceAll(path.sep, \"/\");\r\n return !relativePath.startsWith(\".\") ? \"./\" + relativePath : relativePath;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ImportContainer.js","sourceRoot":"","sources":["../../src/generator/ImportContainer.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"path\";\r\nimport { ODataVersions } from \"@odata2ts/odata-core\";\r\nimport { ImportDeclarationStructure, OptionalKind } from \"ts-morph\";\r\nimport { DataModel } from \"../data-model/DataModel.js\";\r\nimport { ComplexType } from \"../data-model/DataTypeModel.js\";\r\nimport {\r\n ClientApiImports,\r\n CoreImports,\r\n LIB_MODULES,\r\n QueryObjectImports,\r\n ServiceImports,\r\n VERSIONED_CORE_IMPORTS,\r\n VERSIONED_SERVICE_IMPORTS,\r\n} from \"./import/ImportObjects.js\";\r\nimport { ImportedNameValidator } from \"./ImportedNameValidator.js\";\r\n\r\ntype ImportContainerType = Record<\r\n keyof typeof LIB_MODULES,\r\n { regular: Map<string, string>; typeOnly: Map<string, string> }\r\n>;\r\n\r\n/**\r\n * Handles all the import statements for a given file.\r\n *\r\n * Features a renaming mechanism, so that when the import name conflicts with an existing import a new\r\n * name is generated and returned.\r\n *\r\n * Map<string,string>\r\n */\r\nexport class ImportContainer {\r\n private readonly importedNameValidator: ImportedNameValidator;\r\n // mapping of a custom defined type to a primitive type\r\n private customTypes = {\r\n regular: new Map<string, Map<string, string>>(),\r\n typeOnly: new Map<string, Map<string, string>>(),\r\n };\r\n // imports to generated artefacts\r\n private internalImports = {\r\n regular: new Map<string, Map<string, string>>(),\r\n typeOnly: new Map<string, Map<string, string>>(),\r\n };\r\n\r\n private libs: ImportContainerType = {\r\n core: { regular: new Map(), typeOnly: new Map() },\r\n qObject: { regular: new Map(), typeOnly: new Map() },\r\n clientApi: { regular: new Map(), typeOnly: new Map() },\r\n service: { regular: new Map(), typeOnly: new Map() },\r\n };\r\n\r\n constructor(\r\n protected path: string,\r\n protected fileName: string,\r\n protected dataModel: DataModel,\r\n protected mainFileNames: { model: string; qObject: string; service: string },\r\n protected readonly bundledFileGeneration: boolean,\r\n protected reservedNames: Array<string> | undefined,\r\n ) {\r\n this.importedNameValidator = new ImportedNameValidator(reservedNames);\r\n }\r\n\r\n public addCoreLib(odataVersion: ODataVersions, coreLib: CoreImports) {\r\n const isVersioned = VERSIONED_CORE_IMPORTS.includes(coreLib);\r\n const name = CoreImports[coreLib] + (isVersioned ? ODataVersions[odataVersion] : \"\");\r\n const importName = this.importedNameValidator.validateName(LIB_MODULES.core, name);\r\n\r\n // TODO: currently only types are imported, however enums could potentially be imported too\r\n this.libs.core.typeOnly.set(name, importName);\r\n\r\n return importName;\r\n }\r\n\r\n private addFromQObject(name: string, typeOnlyImport = false) {\r\n const importName = this.importedNameValidator.validateName(LIB_MODULES.qObject, name);\r\n\r\n const imports = this.libs.qObject;\r\n if (typeOnlyImport) {\r\n if (!imports.regular.has(name)) {\r\n imports.typeOnly.set(name, importName);\r\n }\r\n } else {\r\n if (imports.typeOnly.has(name)) {\r\n imports.typeOnly.delete(name);\r\n }\r\n imports.regular.set(name, importName);\r\n }\r\n\r\n return importName;\r\n }\r\n\r\n public addQObject(qObject: QueryObjectImports | string) {\r\n return this.addFromQObject(qObject);\r\n }\r\n\r\n public addQObjectType(qObject: string) {\r\n return this.addFromQObject(qObject, true);\r\n }\r\n\r\n public addClientApi(clientApi: ClientApiImports) {\r\n const name = ClientApiImports[clientApi];\r\n const importName = this.importedNameValidator.validateName(LIB_MODULES.clientApi, name);\r\n\r\n // complete client api consists only of types\r\n this.libs.clientApi.typeOnly.set(name, importName);\r\n return importName;\r\n }\r\n\r\n public addServiceObject(odataVersion: ODataVersions, serviceObject: ServiceImports) {\r\n const isVersioned = VERSIONED_SERVICE_IMPORTS.includes(serviceObject);\r\n const name = ServiceImports[serviceObject] + (isVersioned ? ODataVersions[odataVersion] : \"\");\r\n const importName = this.importedNameValidator.validateName(LIB_MODULES.service, name);\r\n\r\n // only regular imports for the service package\r\n this.libs.service.regular.set(name, importName);\r\n return importName;\r\n }\r\n\r\n // TODO: make sure that regular imports win over additional typeOnly imports\r\n public addCustomType(moduleName: string, typeName: string, isTypeOnly: boolean = false) {\r\n const importName = this.importedNameValidator.validateName(moduleName, typeName);\r\n const imports = isTypeOnly ? this.customTypes.typeOnly : this.customTypes.regular;\r\n let importList = imports.get(moduleName);\r\n if (!importList) {\r\n importList = new Map();\r\n imports.set(moduleName, importList);\r\n }\r\n\r\n importList.set(typeName, importName);\r\n return importName;\r\n }\r\n\r\n private pathAndFile(filePath: string, fileName: string) {\r\n return filePath ? `${filePath}/${fileName}` : fileName;\r\n }\r\n\r\n private isDifferentFile(filePath: string, fileName: string) {\r\n return this.pathAndFile(this.path, this.fileName) !== this.pathAndFile(filePath, fileName);\r\n }\r\n\r\n private addGeneratedImport(folderPath: string, fileName: string, name: string, isTypeOnly = false): string {\r\n // imports are only relevant for different files\r\n if (!this.isDifferentFile(folderPath, fileName)) {\r\n return name;\r\n }\r\n\r\n const moduleName = this.pathAndFile(folderPath, fileName);\r\n const importName = this.importedNameValidator.validateName(moduleName, name);\r\n const imports = isTypeOnly ? this.internalImports.typeOnly : this.internalImports.regular;\r\n\r\n if (isTypeOnly && this.internalImports.regular.get(moduleName)?.has(name)) {\r\n return importName;\r\n }\r\n if (!isTypeOnly && this.internalImports.typeOnly.get(moduleName)?.has(name)) {\r\n this.internalImports.typeOnly.get(moduleName)?.delete(name);\r\n }\r\n\r\n const importList = imports.get(moduleName) || new Map<string, string>();\r\n importList.set(name, importName);\r\n imports.set(moduleName, importList);\r\n\r\n return importName;\r\n }\r\n\r\n public addGeneratedModel(fqName: string, name: string, isTypeOnly = true): string {\r\n if (this.bundledFileGeneration) {\r\n return this.addGeneratedImport(\"\", this.mainFileNames.model, name, isTypeOnly);\r\n } else {\r\n const model = this.dataModel.getModel(fqName) as ComplexType | undefined;\r\n if (!model && fqName !== \"\") {\r\n throw new Error(`Cannot find model by its fully qualified name: ${fqName}!`);\r\n }\r\n\r\n const folderPath = model ? model.folderPath : \"\";\r\n const modelName = model ? model.modelName : this.mainFileNames.model;\r\n return this.addGeneratedImport(folderPath, modelName, name, isTypeOnly);\r\n }\r\n }\r\n\r\n public addGeneratedQObject(fqName: string, name: string, isTypeOnly = false) {\r\n if (this.bundledFileGeneration) {\r\n return this.addGeneratedImport(\"\", this.mainFileNames.qObject, name, isTypeOnly);\r\n } else {\r\n const model = this.dataModel.getModel(fqName) as ComplexType | undefined;\r\n if (!model && fqName !== \"\") {\r\n throw new Error(`Cannot find q-object by its fully qualified name: ${fqName}!`);\r\n }\r\n\r\n const folderPath = model ? model.folderPath : \"\";\r\n const qName = model ? model.qName : this.mainFileNames!.qObject;\r\n return this.addGeneratedImport(folderPath, qName, name, isTypeOnly);\r\n }\r\n }\r\n\r\n public addGeneratedService(fqName: string, name: string) {\r\n if (this.bundledFileGeneration) {\r\n return this.addGeneratedImport(\"\", this.mainFileNames.service, name);\r\n } else {\r\n const model = this.dataModel.getModel(fqName) as ComplexType;\r\n return this.addGeneratedImport(model.folderPath, model.serviceName, name);\r\n }\r\n }\r\n\r\n private createImportDecl(\r\n module: string,\r\n toImport: Map<string, string>,\r\n isTypeOnly = false,\r\n ): OptionalKind<ImportDeclarationStructure> {\r\n return {\r\n namedImports: this.getNamedImports(toImport),\r\n moduleSpecifier: module,\r\n isTypeOnly,\r\n };\r\n }\r\n\r\n public getImportDeclarations(): Array<OptionalKind<ImportDeclarationStructure>> {\r\n return [\r\n ...Object.entries(this.libs).reduce<Array<OptionalKind<ImportDeclarationStructure>>>(\r\n (result, [moduleName, toImport]) => {\r\n const module = LIB_MODULES[moduleName as keyof typeof LIB_MODULES];\r\n if (toImport.typeOnly.size) {\r\n result.push(this.createImportDecl(module, toImport.typeOnly, true));\r\n }\r\n if (toImport.regular.size) {\r\n result.push(this.createImportDecl(module, toImport.regular));\r\n }\r\n return result;\r\n },\r\n [],\r\n ),\r\n ...[...this.customTypes.typeOnly]\r\n .filter(([moduleName, toImport]) => toImport.size > 0)\r\n .map(([moduleName, toImport]) => {\r\n return this.createImportDecl(moduleName, toImport, true);\r\n }),\r\n ...[...this.customTypes.regular]\r\n .filter(([moduleName, toImport]) => toImport.size > 0)\r\n .map(([moduleName, toImport]) => {\r\n return this.createImportDecl(moduleName, toImport);\r\n }),\r\n ...[...this.internalImports.typeOnly]\r\n .filter(([_, toImport]) => toImport.size > 0)\r\n .map(([key, toImport]) => {\r\n const module = this.getModuleSpecifier(key);\r\n return this.createImportDecl(module, toImport, true);\r\n }),\r\n ...[...this.internalImports.regular]\r\n .filter(([_, toImport]) => toImport.size > 0)\r\n .map(([key, toImport]) => {\r\n const module = this.getModuleSpecifier(key);\r\n return this.createImportDecl(module, toImport);\r\n }),\r\n ];\r\n }\r\n\r\n private getNamedImports(toImport: Map<string, string>): Array<{ name: string; alias: string | undefined }> {\r\n return [...toImport.entries()].map(([name, alias]) => ({\r\n name,\r\n alias: alias !== name ? alias : undefined,\r\n }));\r\n }\r\n\r\n private getModuleSpecifier(filePath: string): string {\r\n const relativePath = path.relative(this.path, filePath).replaceAll(path.sep, \"/\");\r\n return !relativePath.startsWith(\".\") ? \"./\" + relativePath : relativePath;\r\n }\r\n}\r\n"]}
@@ -1,7 +1,4 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ImportedNameValidator = void 0;
4
- class ImportedNameValidator {
1
+ export class ImportedNameValidator {
5
2
  constructor(reservedNames) {
6
3
  this.importedNames = new Map();
7
4
  reservedNames === null || reservedNames === void 0 ? void 0 : reservedNames.forEach((rn) => {
@@ -22,5 +19,4 @@ class ImportedNameValidator {
22
19
  return result;
23
20
  }
24
21
  }
25
- exports.ImportedNameValidator = ImportedNameValidator;
26
22
  //# sourceMappingURL=ImportedNameValidator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ImportedNameValidator.js","sourceRoot":"","sources":["../../src/generator/ImportedNameValidator.ts"],"names":[],"mappings":";;;AAAA,MAAa,qBAAqB;IAGhC,YAAmB,aAAyC;QAFpD,kBAAa,GAAG,IAAI,GAAG,EAAkC,CAAC;QAGhE,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;YAC5B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,YAAY,CAAC,SAAiB,EAAE,IAAY;;QACjD,MAAM,UAAU,GAAG,MAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,mCAAI,EAAE,CAAC;QACtD,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QAEtC,IAAI,OAAO,EAAE;YACX,OAAO,OAAO,CAAC;SAChB;QAED,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;QACtD,MAAM,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAEnE,UAAU,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC;QAC/B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAEzC,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAzBD,sDAyBC","sourcesContent":["export class ImportedNameValidator {\r\n private importedNames = new Map<string, Record<string, string>>();\r\n\r\n public constructor(reservedNames?: Array<string> | undefined) {\r\n reservedNames?.forEach((rn) => {\r\n this.importedNames.set(rn, { [\"_\"]: rn });\r\n });\r\n }\r\n\r\n public validateName(qualifier: string, name: string): string {\r\n const qualifiers = this.importedNames.get(name) ?? {};\r\n const hitName = qualifiers[qualifier];\r\n\r\n if (hitName) {\r\n return hitName;\r\n }\r\n\r\n const qualifiersSize = Object.keys(qualifiers).length;\r\n const result = qualifiersSize ? `${name}_${qualifiersSize}` : name;\r\n\r\n qualifiers[qualifier] = result;\r\n this.importedNames.set(name, qualifiers);\r\n\r\n return result;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ImportedNameValidator.js","sourceRoot":"","sources":["../../src/generator/ImportedNameValidator.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,qBAAqB;IAGhC,YAAmB,aAAyC;QAFpD,kBAAa,GAAG,IAAI,GAAG,EAAkC,CAAC;QAGhE,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;YAC5B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,YAAY,CAAC,SAAiB,EAAE,IAAY;;QACjD,MAAM,UAAU,GAAG,MAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,mCAAI,EAAE,CAAC;QACtD,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QAEtC,IAAI,OAAO,EAAE;YACX,OAAO,OAAO,CAAC;SAChB;QAED,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;QACtD,MAAM,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAEnE,UAAU,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC;QAC/B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAEzC,OAAO,MAAM,CAAC;IAChB,CAAC;CACF","sourcesContent":["export class ImportedNameValidator {\r\n private importedNames = new Map<string, Record<string, string>>();\r\n\r\n public constructor(reservedNames?: Array<string> | undefined) {\r\n reservedNames?.forEach((rn) => {\r\n this.importedNames.set(rn, { [\"_\"]: rn });\r\n });\r\n }\r\n\r\n public validateName(qualifier: string, name: string): string {\r\n const qualifiers = this.importedNames.get(name) ?? {};\r\n const hitName = qualifiers[qualifier];\r\n\r\n if (hitName) {\r\n return hitName;\r\n }\r\n\r\n const qualifiersSize = Object.keys(qualifiers).length;\r\n const result = qualifiersSize ? `${name}_${qualifiersSize}` : name;\r\n\r\n qualifiers[qualifier] = result;\r\n this.importedNames.set(name, qualifiers);\r\n\r\n return result;\r\n }\r\n}\r\n"]}
@@ -1,2 +1,2 @@
1
- import { EntityBasedGeneratorFunction } from "../FactoryFunctionModel";
1
+ import { EntityBasedGeneratorFunction } from "../FactoryFunctionModel.js";
2
2
  export declare const generateModels: EntityBasedGeneratorFunction;
@@ -1,14 +1,10 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateModels = void 0;
4
- const tslib_1 = require("tslib");
5
- const ts_morph_1 = require("ts-morph");
6
- const ImportObjects_1 = require("./import/ImportObjects");
7
- const generateModels = (project, dataModel, version, options, namingHelper) => {
1
+ import { __awaiter } from "tslib";
2
+ import { StructureKind } from "ts-morph";
3
+ import { CoreImports } from "./import/ImportObjects.js";
4
+ export const generateModels = (project, dataModel, version, options, namingHelper) => {
8
5
  const generator = new ModelGenerator(project, dataModel, version, options, namingHelper);
9
6
  return generator.generate();
10
7
  };
11
- exports.generateModels = generateModels;
12
8
  class ModelGenerator {
13
9
  constructor(project, dataModel, version, options, namingHelper) {
14
10
  this.project = project;
@@ -18,7 +14,7 @@ class ModelGenerator {
18
14
  this.namingHelper = namingHelper;
19
15
  }
20
16
  generate() {
21
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
17
+ return __awaiter(this, void 0, void 0, function* () {
22
18
  this.project.initModels();
23
19
  const promises = [
24
20
  ...this.generateEnums(),
@@ -35,10 +31,14 @@ class ModelGenerator {
35
31
  generateEnums() {
36
32
  return this.dataModel.getEnums().map((et) => {
37
33
  const file = this.project.createOrGetModelFile(et.folderPath, et.modelName);
34
+ const isNumeric = this.options.numericEnums;
38
35
  file.getFile().addEnum({
39
36
  name: et.modelName,
40
37
  isExported: true,
41
- members: et.members.map((mem) => ({ name: mem, initializer: `"${mem}"` })),
38
+ members: et.members.map((mem) => ({
39
+ name: mem.name,
40
+ initializer: isNumeric ? String(mem.value) : `"${mem.name}"`,
41
+ })),
42
42
  });
43
43
  return this.project.finalizeFile(file);
44
44
  });
@@ -134,13 +134,13 @@ class ModelGenerator {
134
134
  "OData Attributes:\n" +
135
135
  "|Attribute Name | Attribute Value |\n| --- | ---|\n" +
136
136
  attributeTable.map((row) => `| ${row[0]} | \`${row[1]}\` |`).join("\n");
137
- return { kind: ts_morph_1.StructureKind.JSDoc, description };
137
+ return { kind: StructureKind.JSDoc, description };
138
138
  }
139
139
  getPropType(imports, prop) {
140
140
  // V2 entity special: deferred content
141
141
  let suffix = "";
142
142
  if (this.dataModel.isV2() && prop.dataType == "ModelType" /* DataTypes.ModelType */) {
143
- const defContent = imports.addCoreLib(this.version, ImportObjects_1.CoreImports.DeferredContent);
143
+ const defContent = imports.addCoreLib(this.version, CoreImports.DeferredContent);
144
144
  suffix = ` | ${defContent}`;
145
145
  }
146
146
  let typeName;
@@ -224,7 +224,7 @@ class ModelGenerator {
224
224
  return editableType + (prop.required ? "" : " | null");
225
225
  }
226
226
  generateUnboundOperationParams() {
227
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
227
+ return __awaiter(this, void 0, void 0, function* () {
228
228
  const unboundOps = this.dataModel.getUnboundOperationTypes();
229
229
  const reservedNames = unboundOps.map((op) => op.paramsModelName);
230
230
  const file = this.project.createOrGetMainModelFile(reservedNames);
@@ -1 +1 @@
1
- {"version":3,"file":"ModelGenerator.js","sourceRoot":"","sources":["../../src/generator/ModelGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["import { ODataVersions } from \"@odata2ts/odata-core\";\r\nimport { JSDocStructure, OptionalKind, StructureKind } from \"ts-morph\";\r\n\r\nimport { DataModel } from \"../data-model/DataModel\";\r\nimport { ComplexType, DataTypes, EntityType, OperationType, PropertyModel } from \"../data-model/DataTypeModel\";\r\nimport { NamingHelper } from \"../data-model/NamingHelper\";\r\nimport { EntityBasedGeneratorFunction, GeneratorFunctionOptions } from \"../FactoryFunctionModel\";\r\nimport { FileHandler } from \"../project/FileHandler\";\r\nimport { ProjectManager } from \"../project/ProjectManager\";\r\nimport { CoreImports } from \"./import/ImportObjects\";\r\nimport { ImportContainer } from \"./ImportContainer\";\r\n\r\nexport const generateModels: EntityBasedGeneratorFunction = (\r\n project: ProjectManager,\r\n dataModel,\r\n version,\r\n options,\r\n namingHelper\r\n) => {\r\n const generator = new ModelGenerator(project, dataModel, version, options, namingHelper);\r\n return generator.generate();\r\n};\r\n\r\nclass ModelGenerator {\r\n constructor(\r\n private project: ProjectManager,\r\n private dataModel: DataModel,\r\n private version: ODataVersions,\r\n private options: GeneratorFunctionOptions,\r\n private namingHelper: NamingHelper\r\n ) {}\r\n\r\n public async generate(): Promise<void> {\r\n this.project.initModels();\r\n\r\n const promises: Array<Promise<void>> = [\r\n ...this.generateEnums(),\r\n ...this.generateEntityTypeModels(),\r\n ...this.generateComplexTypeModels(),\r\n ];\r\n\r\n if (!this.options.skipOperations) {\r\n promises.push(this.generateUnboundOperationParams());\r\n }\r\n\r\n await Promise.all(promises);\r\n\r\n return this.project.finalizeModels();\r\n }\r\n\r\n private generateEnums() {\r\n return this.dataModel.getEnums().map((et) => {\r\n const file = this.project.createOrGetModelFile(et.folderPath, et.modelName);\r\n\r\n file.getFile().addEnum({\r\n name: et.modelName,\r\n isExported: true,\r\n members: et.members.map((mem) => ({ name: mem, initializer: `\"${mem}\"` })),\r\n });\r\n\r\n return this.project.finalizeFile(file);\r\n });\r\n }\r\n\r\n private generateEntityTypeModels() {\r\n return this.dataModel.getEntityTypes().map((model) => {\r\n const file = this.project.createOrGetModelFile(model.folderPath, model.modelName, [\r\n model.modelName,\r\n model.id.modelName,\r\n model.editableName,\r\n ]);\r\n\r\n // query model\r\n this.generateModel(file, model);\r\n\r\n // key model\r\n if (!this.options.skipIdModels && model.generateId) {\r\n this.generateIdModel(file, model);\r\n }\r\n\r\n // editable model\r\n if (!this.options.skipEditableModels) {\r\n this.generateEditableModel(file, model);\r\n }\r\n\r\n // param models for bound operations\r\n if (!this.options.skipOperations) {\r\n [\r\n ...this.dataModel.getEntityTypeOperations(model.fqName),\r\n ...this.dataModel.getEntitySetOperations(model.fqName),\r\n ].forEach((operation) => {\r\n this.generateOperationParams(file, operation);\r\n });\r\n }\r\n\r\n return this.project.finalizeFile(file);\r\n });\r\n }\r\n\r\n private generateComplexTypeModels() {\r\n return this.dataModel.getComplexTypes().map((model) => {\r\n const file = this.project.createOrGetModelFile(model.folderPath, model.modelName, [\r\n model.modelName,\r\n model.editableName,\r\n ]);\r\n\r\n // query model\r\n this.generateModel(file, model);\r\n\r\n // editable model\r\n if (!this.options.skipEditableModels) {\r\n this.generateEditableModel(file, model);\r\n }\r\n\r\n return this.project.finalizeFile(file);\r\n });\r\n }\r\n\r\n private generateModel(file: FileHandler, model: ComplexType | EntityType) {\r\n const imports = file.getImports();\r\n let extendsClause = undefined;\r\n if (model.finalBaseClass) {\r\n const modelName = imports.addGeneratedModel(\r\n model.baseClasses[0],\r\n this.namingHelper.getModelName(model.finalBaseClass)\r\n );\r\n extendsClause = [modelName];\r\n }\r\n\r\n file.getFile().addInterface({\r\n name: model.modelName,\r\n isExported: true,\r\n properties: model.props.map((p) => {\r\n const isEntity = p.dataType == DataTypes.ModelType;\r\n return {\r\n name: p.name,\r\n type: this.getPropType(file.getImports(), p),\r\n // props for entities or entity collections are not added in V4 if not explicitly expanded\r\n hasQuestionToken: this.dataModel.isV4() && isEntity,\r\n docs: this.options.skipComments ? undefined : [this.generatePropDoc(p, model)],\r\n };\r\n }),\r\n extends: extendsClause,\r\n });\r\n }\r\n\r\n private generatePropDoc(prop: PropertyModel, model: ComplexType | EntityType): OptionalKind<JSDocStructure> {\r\n const isKeyProp = (model as EntityType).keyNames?.includes(prop.odataName);\r\n const baseAttribs: Array<string> = [];\r\n if (isKeyProp) {\r\n baseAttribs.push(\"**Key Property**: This is a key property used to identify the entity.\");\r\n }\r\n if (prop.managed) {\r\n baseAttribs.push(\"**Managed**: This property is managed on the server side and cannot be edited.\");\r\n }\r\n if (prop.converters?.length) {\r\n baseAttribs.push(`**Applied Converters**: ${prop.converters.map((c) => c.converterId).join(\",\")}.`);\r\n }\r\n\r\n const attributeTable: Array<[string, string]> = [\r\n [\"Name\", prop.odataName],\r\n [\"Type\", prop.odataType],\r\n ];\r\n if (prop.required) {\r\n attributeTable.push([\"Nullable\", \"false\"]);\r\n }\r\n\r\n const description =\r\n (baseAttribs ? baseAttribs.join(\"<br/>\") + \"\\n\\n\" : \"\") +\r\n \"OData Attributes:\\n\" +\r\n \"|Attribute Name | Attribute Value |\\n| --- | ---|\\n\" +\r\n attributeTable.map((row) => `| ${row[0]} | \\`${row[1]}\\` |`).join(\"\\n\");\r\n\r\n return { kind: StructureKind.JSDoc, description };\r\n }\r\n\r\n private getPropType(imports: ImportContainer, prop: PropertyModel): string {\r\n // V2 entity special: deferred content\r\n let suffix = \"\";\r\n if (this.dataModel.isV2() && prop.dataType == DataTypes.ModelType) {\r\n const defContent = imports.addCoreLib(this.version, CoreImports.DeferredContent);\r\n suffix = ` | ${defContent}`;\r\n }\r\n\r\n let typeName: string;\r\n if (prop.dataType === DataTypes.PrimitiveType) {\r\n // custom types which require type imports => possible via converters\r\n typeName = prop.typeModule ? imports.addCustomType(prop.typeModule, prop.type, true) : prop.type;\r\n } else {\r\n typeName = imports.addGeneratedModel(prop.fqType, prop.type);\r\n }\r\n\r\n // Collections\r\n if (prop.isCollection) {\r\n const type = `Array<${typeName}>`;\r\n if (this.dataModel.isV2() && this.options.v2ModelsWithExtraResultsWrapping) {\r\n return `{ results: ${type} }` + suffix;\r\n } else {\r\n return type + suffix;\r\n }\r\n }\r\n\r\n // primitive, enum & complex types\r\n return typeName + (prop.required ? \"\" : \" | null\") + suffix;\r\n }\r\n\r\n private generateIdModel(file: FileHandler, model: EntityType) {\r\n const singleType = model.keys.length === 1 ? `${model.keys[0].type} | ` : \"\";\r\n const keyTypes = model.keys\r\n .map((keyProp) => `${keyProp.name}: ${this.getPropType(file.getImports(), keyProp)}`)\r\n .join(\",\");\r\n const type = `${singleType}{${keyTypes}}`;\r\n\r\n file.getFile().addTypeAlias({\r\n name: model.id.modelName,\r\n isExported: true,\r\n type,\r\n });\r\n }\r\n\r\n private generateEditableModel(file: FileHandler, model: ComplexType) {\r\n const entityTypes = [DataTypes.ModelType, DataTypes.ComplexType];\r\n const allProps = [...model.baseProps, ...model.props].filter((p) => !p.managed);\r\n\r\n const requiredProps = allProps\r\n .filter((p) => p.required && !entityTypes.includes(p.dataType))\r\n .map((p) => `\"${p.name}\"`)\r\n .join(\" | \");\r\n const optionalProps = allProps\r\n .filter((p) => !p.required && !entityTypes.includes(p.dataType))\r\n .map((p) => `\"${p.name}\"`)\r\n .join(\" | \");\r\n const complexProps = allProps.filter((p) => p.dataType === DataTypes.ComplexType);\r\n\r\n const extendsClause = [\r\n requiredProps ? `Pick<${model.modelName}, ${requiredProps}>` : null,\r\n optionalProps ? `Partial<Pick<${model.modelName}, ${optionalProps}>>` : null,\r\n ].filter((e): e is string => !!e);\r\n\r\n file.getFile().addInterface({\r\n name: model.editableName,\r\n isExported: true,\r\n extends: extendsClause,\r\n properties: !complexProps\r\n ? undefined\r\n : complexProps.map((p) => {\r\n return {\r\n name: p.name,\r\n type: this.getEditablePropType(file.getImports(), p),\r\n // optional props don't need to be specified in editable model\r\n // also, entities would require deep insert func => we make it optional for now\r\n hasQuestionToken: !p.required || p.dataType === DataTypes.ModelType,\r\n };\r\n }),\r\n });\r\n }\r\n\r\n private getEditablePropType(imports: ImportContainer, prop: PropertyModel): string {\r\n const isModelType = [DataTypes.ModelType, DataTypes.ComplexType].includes(prop.dataType);\r\n\r\n let editableType = prop.type;\r\n if (isModelType) {\r\n const editName = this.dataModel.getComplexType(prop.fqType)!.editableName;\r\n editableType = imports.addGeneratedModel(prop.fqType, editName);\r\n }\r\n\r\n // Collections\r\n if (prop.isCollection) {\r\n return `Array<${editableType}>`;\r\n }\r\n\r\n // primitive, enum & complex types\r\n return editableType + (prop.required ? \"\" : \" | null\");\r\n }\r\n\r\n private async generateUnboundOperationParams() {\r\n const unboundOps = this.dataModel.getUnboundOperationTypes();\r\n const reservedNames = unboundOps.map((op) => op.paramsModelName);\r\n const file = this.project.createOrGetMainModelFile(reservedNames);\r\n\r\n unboundOps.forEach((operation) => {\r\n this.generateOperationParams(file, operation);\r\n });\r\n }\r\n\r\n private generateOperationParams(file: FileHandler, operation: OperationType) {\r\n const paramSets = [operation.parameters, ...(operation.overrides ?? [])].filter((pSet) => !!pSet.length);\r\n\r\n // standard: one interface for parameters\r\n if (paramSets.length === 1) {\r\n file.getFile().addInterface({\r\n name: operation.paramsModelName,\r\n isExported: true,\r\n properties: paramSets[0].map((p) => {\r\n return {\r\n name: p.name,\r\n type: this.getPropType(file.getImports(), p),\r\n hasQuestionToken: !p.required,\r\n };\r\n }),\r\n });\r\n }\r\n // function overload: one type with intersections of different param models\r\n else if (paramSets.length > 1) {\r\n file.getFile().addTypeAlias({\r\n name: operation.paramsModelName,\r\n isExported: true,\r\n type: (writer) => {\r\n paramSets.forEach((pSet, index) => {\r\n writer.block(() => {\r\n pSet.forEach((param, index) => {\r\n const paramType = this.getPropType(file.getImports(), param);\r\n writer.write(`${param.name}${param.required ? \"\" : \"?\"}: ${paramType}`);\r\n if (index < pSet.length - 1) {\r\n writer.write(\",\");\r\n }\r\n });\r\n });\r\n if (index < paramSets.length - 1) {\r\n writer.write(\" | \");\r\n }\r\n });\r\n },\r\n });\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ModelGenerator.js","sourceRoot":"","sources":["../../src/generator/ModelGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["import { ODataVersions } from \"@odata2ts/odata-core\";\r\nimport { JSDocStructure, OptionalKind, StructureKind } from \"ts-morph\";\r\nimport { DataModel } from \"../data-model/DataModel.js\";\r\nimport { ComplexType, DataTypes, EntityType, OperationType, PropertyModel } from \"../data-model/DataTypeModel.js\";\r\nimport { NamingHelper } from \"../data-model/NamingHelper.js\";\r\nimport { EntityBasedGeneratorFunction, GeneratorFunctionOptions } from \"../FactoryFunctionModel.js\";\r\nimport { FileHandler } from \"../project/FileHandler.js\";\r\nimport { ProjectManager } from \"../project/ProjectManager.js\";\r\nimport { CoreImports } from \"./import/ImportObjects.js\";\r\nimport { ImportContainer } from \"./ImportContainer.js\";\r\n\r\nexport const generateModels: EntityBasedGeneratorFunction = (\r\n project: ProjectManager,\r\n dataModel,\r\n version,\r\n options,\r\n namingHelper,\r\n) => {\r\n const generator = new ModelGenerator(project, dataModel, version, options, namingHelper);\r\n return generator.generate();\r\n};\r\n\r\nclass ModelGenerator {\r\n constructor(\r\n private project: ProjectManager,\r\n private dataModel: DataModel,\r\n private version: ODataVersions,\r\n private options: GeneratorFunctionOptions,\r\n private namingHelper: NamingHelper,\r\n ) {}\r\n\r\n public async generate(): Promise<void> {\r\n this.project.initModels();\r\n\r\n const promises: Array<Promise<void>> = [\r\n ...this.generateEnums(),\r\n ...this.generateEntityTypeModels(),\r\n ...this.generateComplexTypeModels(),\r\n ];\r\n\r\n if (!this.options.skipOperations) {\r\n promises.push(this.generateUnboundOperationParams());\r\n }\r\n\r\n await Promise.all(promises);\r\n\r\n return this.project.finalizeModels();\r\n }\r\n\r\n private generateEnums() {\r\n return this.dataModel.getEnums().map((et) => {\r\n const file = this.project.createOrGetModelFile(et.folderPath, et.modelName);\r\n\r\n const isNumeric = this.options.numericEnums;\r\n file.getFile().addEnum({\r\n name: et.modelName,\r\n isExported: true,\r\n members: et.members.map((mem) => ({\r\n name: mem.name,\r\n initializer: isNumeric ? String(mem.value) : `\"${mem.name}\"`,\r\n })),\r\n });\r\n\r\n return this.project.finalizeFile(file);\r\n });\r\n }\r\n\r\n private generateEntityTypeModels() {\r\n return this.dataModel.getEntityTypes().map((model) => {\r\n const file = this.project.createOrGetModelFile(model.folderPath, model.modelName, [\r\n model.modelName,\r\n model.id.modelName,\r\n model.editableName,\r\n ]);\r\n\r\n // query model\r\n this.generateModel(file, model);\r\n\r\n // key model\r\n if (!this.options.skipIdModels && model.generateId) {\r\n this.generateIdModel(file, model);\r\n }\r\n\r\n // editable model\r\n if (!this.options.skipEditableModels) {\r\n this.generateEditableModel(file, model);\r\n }\r\n\r\n // param models for bound operations\r\n if (!this.options.skipOperations) {\r\n [\r\n ...this.dataModel.getEntityTypeOperations(model.fqName),\r\n ...this.dataModel.getEntitySetOperations(model.fqName),\r\n ].forEach((operation) => {\r\n this.generateOperationParams(file, operation);\r\n });\r\n }\r\n\r\n return this.project.finalizeFile(file);\r\n });\r\n }\r\n\r\n private generateComplexTypeModels() {\r\n return this.dataModel.getComplexTypes().map((model) => {\r\n const file = this.project.createOrGetModelFile(model.folderPath, model.modelName, [\r\n model.modelName,\r\n model.editableName,\r\n ]);\r\n\r\n // query model\r\n this.generateModel(file, model);\r\n\r\n // editable model\r\n if (!this.options.skipEditableModels) {\r\n this.generateEditableModel(file, model);\r\n }\r\n\r\n return this.project.finalizeFile(file);\r\n });\r\n }\r\n\r\n private generateModel(file: FileHandler, model: ComplexType | EntityType) {\r\n const imports = file.getImports();\r\n let extendsClause = undefined;\r\n if (model.finalBaseClass) {\r\n const modelName = imports.addGeneratedModel(\r\n model.baseClasses[0],\r\n this.namingHelper.getModelName(model.finalBaseClass),\r\n );\r\n extendsClause = [modelName];\r\n }\r\n\r\n file.getFile().addInterface({\r\n name: model.modelName,\r\n isExported: true,\r\n properties: model.props.map((p) => {\r\n const isEntity = p.dataType == DataTypes.ModelType;\r\n return {\r\n name: p.name,\r\n type: this.getPropType(file.getImports(), p),\r\n // props for entities or entity collections are not added in V4 if not explicitly expanded\r\n hasQuestionToken: this.dataModel.isV4() && isEntity,\r\n docs: this.options.skipComments ? undefined : [this.generatePropDoc(p, model)],\r\n };\r\n }),\r\n extends: extendsClause,\r\n });\r\n }\r\n\r\n private generatePropDoc(prop: PropertyModel, model: ComplexType | EntityType): OptionalKind<JSDocStructure> {\r\n const isKeyProp = (model as EntityType).keyNames?.includes(prop.odataName);\r\n const baseAttribs: Array<string> = [];\r\n if (isKeyProp) {\r\n baseAttribs.push(\"**Key Property**: This is a key property used to identify the entity.\");\r\n }\r\n if (prop.managed) {\r\n baseAttribs.push(\"**Managed**: This property is managed on the server side and cannot be edited.\");\r\n }\r\n if (prop.converters?.length) {\r\n baseAttribs.push(`**Applied Converters**: ${prop.converters.map((c) => c.converterId).join(\",\")}.`);\r\n }\r\n\r\n const attributeTable: Array<[string, string]> = [\r\n [\"Name\", prop.odataName],\r\n [\"Type\", prop.odataType],\r\n ];\r\n if (prop.required) {\r\n attributeTable.push([\"Nullable\", \"false\"]);\r\n }\r\n\r\n const description =\r\n (baseAttribs ? baseAttribs.join(\"<br/>\") + \"\\n\\n\" : \"\") +\r\n \"OData Attributes:\\n\" +\r\n \"|Attribute Name | Attribute Value |\\n| --- | ---|\\n\" +\r\n attributeTable.map((row) => `| ${row[0]} | \\`${row[1]}\\` |`).join(\"\\n\");\r\n\r\n return { kind: StructureKind.JSDoc, description };\r\n }\r\n\r\n private getPropType(imports: ImportContainer, prop: PropertyModel): string {\r\n // V2 entity special: deferred content\r\n let suffix = \"\";\r\n if (this.dataModel.isV2() && prop.dataType == DataTypes.ModelType) {\r\n const defContent = imports.addCoreLib(this.version, CoreImports.DeferredContent);\r\n suffix = ` | ${defContent}`;\r\n }\r\n\r\n let typeName: string;\r\n if (prop.dataType === DataTypes.PrimitiveType) {\r\n // custom types which require type imports => possible via converters\r\n typeName = prop.typeModule ? imports.addCustomType(prop.typeModule, prop.type, true) : prop.type;\r\n } else {\r\n typeName = imports.addGeneratedModel(prop.fqType, prop.type);\r\n }\r\n\r\n // Collections\r\n if (prop.isCollection) {\r\n const type = `Array<${typeName}>`;\r\n if (this.dataModel.isV2() && this.options.v2ModelsWithExtraResultsWrapping) {\r\n return `{ results: ${type} }` + suffix;\r\n } else {\r\n return type + suffix;\r\n }\r\n }\r\n\r\n // primitive, enum & complex types\r\n return typeName + (prop.required ? \"\" : \" | null\") + suffix;\r\n }\r\n\r\n private generateIdModel(file: FileHandler, model: EntityType) {\r\n const singleType = model.keys.length === 1 ? `${model.keys[0].type} | ` : \"\";\r\n const keyTypes = model.keys\r\n .map((keyProp) => `${keyProp.name}: ${this.getPropType(file.getImports(), keyProp)}`)\r\n .join(\",\");\r\n const type = `${singleType}{${keyTypes}}`;\r\n\r\n file.getFile().addTypeAlias({\r\n name: model.id.modelName,\r\n isExported: true,\r\n type,\r\n });\r\n }\r\n\r\n private generateEditableModel(file: FileHandler, model: ComplexType) {\r\n const entityTypes = [DataTypes.ModelType, DataTypes.ComplexType];\r\n const allProps = [...model.baseProps, ...model.props].filter((p) => !p.managed);\r\n\r\n const requiredProps = allProps\r\n .filter((p) => p.required && !entityTypes.includes(p.dataType))\r\n .map((p) => `\"${p.name}\"`)\r\n .join(\" | \");\r\n const optionalProps = allProps\r\n .filter((p) => !p.required && !entityTypes.includes(p.dataType))\r\n .map((p) => `\"${p.name}\"`)\r\n .join(\" | \");\r\n const complexProps = allProps.filter((p) => p.dataType === DataTypes.ComplexType);\r\n\r\n const extendsClause = [\r\n requiredProps ? `Pick<${model.modelName}, ${requiredProps}>` : null,\r\n optionalProps ? `Partial<Pick<${model.modelName}, ${optionalProps}>>` : null,\r\n ].filter((e): e is string => !!e);\r\n\r\n file.getFile().addInterface({\r\n name: model.editableName,\r\n isExported: true,\r\n extends: extendsClause,\r\n properties: !complexProps\r\n ? undefined\r\n : complexProps.map((p) => {\r\n return {\r\n name: p.name,\r\n type: this.getEditablePropType(file.getImports(), p),\r\n // optional props don't need to be specified in editable model\r\n // also, entities would require deep insert func => we make it optional for now\r\n hasQuestionToken: !p.required || p.dataType === DataTypes.ModelType,\r\n };\r\n }),\r\n });\r\n }\r\n\r\n private getEditablePropType(imports: ImportContainer, prop: PropertyModel): string {\r\n const isModelType = [DataTypes.ModelType, DataTypes.ComplexType].includes(prop.dataType);\r\n\r\n let editableType = prop.type;\r\n if (isModelType) {\r\n const editName = this.dataModel.getComplexType(prop.fqType)!.editableName;\r\n editableType = imports.addGeneratedModel(prop.fqType, editName);\r\n }\r\n\r\n // Collections\r\n if (prop.isCollection) {\r\n return `Array<${editableType}>`;\r\n }\r\n\r\n // primitive, enum & complex types\r\n return editableType + (prop.required ? \"\" : \" | null\");\r\n }\r\n\r\n private async generateUnboundOperationParams() {\r\n const unboundOps = this.dataModel.getUnboundOperationTypes();\r\n const reservedNames = unboundOps.map((op) => op.paramsModelName);\r\n const file = this.project.createOrGetMainModelFile(reservedNames);\r\n\r\n unboundOps.forEach((operation) => {\r\n this.generateOperationParams(file, operation);\r\n });\r\n }\r\n\r\n private generateOperationParams(file: FileHandler, operation: OperationType) {\r\n const paramSets = [operation.parameters, ...(operation.overrides ?? [])].filter((pSet) => !!pSet.length);\r\n\r\n // standard: one interface for parameters\r\n if (paramSets.length === 1) {\r\n file.getFile().addInterface({\r\n name: operation.paramsModelName,\r\n isExported: true,\r\n properties: paramSets[0].map((p) => {\r\n return {\r\n name: p.name,\r\n type: this.getPropType(file.getImports(), p),\r\n hasQuestionToken: !p.required,\r\n };\r\n }),\r\n });\r\n }\r\n // function overload: one type with intersections of different param models\r\n else if (paramSets.length > 1) {\r\n file.getFile().addTypeAlias({\r\n name: operation.paramsModelName,\r\n isExported: true,\r\n type: (writer) => {\r\n paramSets.forEach((pSet, index) => {\r\n writer.block(() => {\r\n pSet.forEach((param, index) => {\r\n const paramType = this.getPropType(file.getImports(), param);\r\n writer.write(`${param.name}${param.required ? \"\" : \"?\"}: ${paramType}`);\r\n if (index < pSet.length - 1) {\r\n writer.write(\",\");\r\n }\r\n });\r\n });\r\n if (index < paramSets.length - 1) {\r\n writer.write(\" | \");\r\n }\r\n });\r\n },\r\n });\r\n }\r\n }\r\n}\r\n"]}
@@ -1,2 +1,2 @@
1
- import { EntityBasedGeneratorFunction } from "../FactoryFunctionModel";
1
+ import { EntityBasedGeneratorFunction } from "../FactoryFunctionModel.js";
2
2
  export declare const generateQueryObjects: EntityBasedGeneratorFunction;
@@ -1,16 +1,12 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateQueryObjects = void 0;
4
- const tslib_1 = require("tslib");
5
- const odata_core_1 = require("@odata2ts/odata-core");
6
- const ts_morph_1 = require("ts-morph");
7
- const processors_1 = require("xml2js/lib/processors");
8
- const ImportObjects_1 = require("./import/ImportObjects");
9
- const generateQueryObjects = (project, dataModel, version, options, namingHelper) => {
1
+ import { __awaiter } from "tslib";
2
+ import { ODataVersions } from "@odata2ts/odata-core";
3
+ import { Scope, VariableDeclarationKind } from "ts-morph";
4
+ import { firstCharLowerCase } from "xml2js/lib/processors.js";
5
+ import { QueryObjectImports } from "./import/ImportObjects.js";
6
+ export const generateQueryObjects = (project, dataModel, version, options, namingHelper) => {
10
7
  const generator = new QueryObjectGenerator(project, dataModel, version, options, namingHelper);
11
8
  return generator.generate();
12
9
  };
13
- exports.generateQueryObjects = generateQueryObjects;
14
10
  class QueryObjectGenerator {
15
11
  constructor(project, dataModel, version, options, namingHelper) {
16
12
  this.project = project;
@@ -20,7 +16,7 @@ class QueryObjectGenerator {
20
16
  this.namingHelper = namingHelper;
21
17
  }
22
18
  generate() {
23
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
19
+ return __awaiter(this, void 0, void 0, function* () {
24
20
  this.project.initQObjects();
25
21
  // process EntityType & ComplexType
26
22
  const promises = [...this.generateEntityTypes(), ...this.generateComplexTypes()];
@@ -36,7 +32,7 @@ class QueryObjectGenerator {
36
32
  return this.dataModel.getEntityTypes().map((model) => {
37
33
  const file = this.project.createOrGetQObjectFile(model.folderPath, model.qName, [
38
34
  model.qName,
39
- (0, processors_1.firstCharLowerCase)(model.qName),
35
+ firstCharLowerCase(model.qName),
40
36
  model.id.qName,
41
37
  ]);
42
38
  // q object
@@ -61,7 +57,7 @@ class QueryObjectGenerator {
61
57
  return this.dataModel.getComplexTypes().map((model) => {
62
58
  const file = this.project.createOrGetQObjectFile(model.folderPath, model.qName, [
63
59
  model.qName,
64
- (0, processors_1.firstCharLowerCase)(model.qName),
60
+ firstCharLowerCase(model.qName),
65
61
  ]);
66
62
  this.generateModel(file, model);
67
63
  return this.project.finalizeFile(file);
@@ -79,7 +75,7 @@ class QueryObjectGenerator {
79
75
  extendsClause = imports.addGeneratedQObject(baseClass, baseModel.qName);
80
76
  }
81
77
  else {
82
- extendsClause = imports.addQObject(ImportObjects_1.QueryObjectImports.QueryObject);
78
+ extendsClause = imports.addQObject(QueryObjectImports.QueryObject);
83
79
  }
84
80
  file.getFile().addClass({
85
81
  name: model.qName,
@@ -89,11 +85,11 @@ class QueryObjectGenerator {
89
85
  properties: this.generateQueryObjectProps(file.getImports(), model.props),
90
86
  });
91
87
  file.getFile().addVariableStatement({
92
- declarationKind: ts_morph_1.VariableDeclarationKind.Const,
88
+ declarationKind: VariableDeclarationKind.Const,
93
89
  isExported: true,
94
90
  declarations: [
95
91
  {
96
- name: (0, processors_1.firstCharLowerCase)(model.qName),
92
+ name: firstCharLowerCase(model.qName),
97
93
  initializer: `new ${model.qName}()`,
98
94
  },
99
95
  ],
@@ -104,14 +100,24 @@ class QueryObjectGenerator {
104
100
  const { odataName } = prop;
105
101
  const name = this.namingHelper.getQPropName(prop.name);
106
102
  const isModelType = prop.dataType === "ModelType" /* DataTypes.ModelType */ || prop.dataType === "ComplexType" /* DataTypes.ComplexType */;
103
+ const isEnumType = prop.dataType === "EnumType" /* DataTypes.EnumType */;
104
+ const isNumericEnum = this.options.numericEnums;
107
105
  let qPathInit;
108
106
  // factor in collections
109
107
  if (prop.isCollection) {
110
- const qPath = importContainer.addQObject(isModelType ? ImportObjects_1.QueryObjectImports.QEntityCollectionPath : ImportObjects_1.QueryObjectImports.QCollectionPath);
108
+ const qPath = importContainer.addQObject(isModelType
109
+ ? QueryObjectImports.QEntityCollectionPath
110
+ : isEnumType
111
+ ? isNumericEnum
112
+ ? QueryObjectImports.QNumericEnumCollectionPath
113
+ : QueryObjectImports.QEnumCollectionPath
114
+ : QueryObjectImports.QCollectionPath);
111
115
  const qObject = isModelType
112
116
  ? importContainer.addGeneratedQObject(prop.fqType, prop.qObject)
113
- : importContainer.addQObject(prop.qObject);
114
- qPathInit = `new ${qPath}(this.withPrefix("${odataName}"), () => ${qObject})`;
117
+ : isEnumType
118
+ ? importContainer.addGeneratedModel(prop.fqType, prop.type, false)
119
+ : importContainer.addQObject(prop.qObject);
120
+ qPathInit = `new ${qPath}(this.withPrefix("${odataName}"), ${isEnumType ? qObject : `() => ${qObject}`})`;
115
121
  }
116
122
  else {
117
123
  // add import for data type
@@ -120,6 +126,10 @@ class QueryObjectGenerator {
120
126
  const qObject = importContainer.addGeneratedQObject(prop.fqType, prop.qObject);
121
127
  qPathInit = `new ${qPath}(this.withPrefix("${odataName}"), () => ${qObject})`;
122
128
  }
129
+ else if (isEnumType) {
130
+ const qObject = importContainer.addGeneratedModel(prop.fqType, prop.type, false);
131
+ qPathInit = `new ${qPath}(this.withPrefix("${odataName}"), ${qObject})`;
132
+ }
123
133
  else {
124
134
  let converterStmt = this.generateConverterStmt(importContainer, prop.converters);
125
135
  qPathInit = `new ${qPath}(this.withPrefix("${odataName}")${converterStmt ? `, ${converterStmt}` : ""})`;
@@ -127,7 +137,7 @@ class QueryObjectGenerator {
127
137
  }
128
138
  return {
129
139
  name,
130
- scope: ts_morph_1.Scope.Public,
140
+ scope: Scope.Public,
131
141
  isReadonly: true,
132
142
  initializer: qPathInit,
133
143
  };
@@ -151,7 +161,7 @@ class QueryObjectGenerator {
151
161
  }
152
162
  generateIdFunction(file, model) {
153
163
  const importContainer = file.getImports();
154
- const qFunc = importContainer.addQObject(ImportObjects_1.QueryObjectImports.QId);
164
+ const qFunc = importContainer.addQObject(QueryObjectImports.QId);
155
165
  const idModelName = importContainer.addGeneratedModel(model.fqName, model.id.modelName);
156
166
  file.getFile().addClass({
157
167
  name: model.id.qName,
@@ -160,7 +170,7 @@ class QueryObjectGenerator {
160
170
  properties: [
161
171
  {
162
172
  name: "params",
163
- scope: ts_morph_1.Scope.Private,
173
+ scope: Scope.Private,
164
174
  isReadonly: true,
165
175
  initializer: this.getParamInitString(importContainer, model.keys),
166
176
  },
@@ -201,7 +211,7 @@ class QueryObjectGenerator {
201
211
  return allParams.length === 1 ? allParams[0] : `[${allParams.join(",")}]`;
202
212
  }
203
213
  generateUnboundOperations() {
204
- return tslib_1.__awaiter(this, void 0, void 0, function* () {
214
+ return __awaiter(this, void 0, void 0, function* () {
205
215
  const unboundOps = this.dataModel.getUnboundOperationTypes();
206
216
  const reservedNames = unboundOps.map((op) => op.qName);
207
217
  const file = this.project.createOrGetMainQObjectFile(reservedNames);
@@ -213,12 +223,12 @@ class QueryObjectGenerator {
213
223
  generateOperation(file, operation, baseFqName) {
214
224
  var _a, _b;
215
225
  const imports = file.getImports();
216
- const isV2 = this.version === odata_core_1.ODataVersions.V2;
226
+ const isV2 = this.version === ODataVersions.V2;
217
227
  const returnType = operation.returnType;
218
228
  const hasParams = operation.parameters.length > 0 || ((_a = operation.overrides) === null || _a === void 0 ? void 0 : _a.length);
219
229
  const isParamsOptional = !![operation.parameters, ...((_b = operation.overrides) !== null && _b !== void 0 ? _b : [])].find((pSet) => pSet.length === 0);
220
230
  // imports
221
- const qOp = operation.type === "Action" /* OperationTypes.Action */ ? ImportObjects_1.QueryObjectImports.QAction : ImportObjects_1.QueryObjectImports.QFunction;
231
+ const qOp = operation.type === "Action" /* OperationTypes.Action */ ? QueryObjectImports.QAction : QueryObjectImports.QFunction;
222
232
  const qOperation = imports.addQObject(qOp);
223
233
  const paramModelName = hasParams ? imports.addGeneratedModel(baseFqName, operation.paramsModelName) : undefined;
224
234
  let returnTypeOpStmt = "";
@@ -226,17 +236,17 @@ class QueryObjectGenerator {
226
236
  const collectionSuffix = returnType.isCollection ? "_COLLECTION" : "";
227
237
  if (returnType.dataType === "ComplexType" /* DataTypes.ComplexType */ || returnType.dataType === "ModelType" /* DataTypes.ModelType */) {
228
238
  if (returnType.qObject) {
229
- const opRt = imports.addQObject(ImportObjects_1.QueryObjectImports.OperationReturnType);
230
- const rts = imports.addQObject(ImportObjects_1.QueryObjectImports.ReturnTypes);
231
- const qComplexParam = imports.addQObject(ImportObjects_1.QueryObjectImports.QComplexParam);
239
+ const opRt = imports.addQObject(QueryObjectImports.OperationReturnType);
240
+ const rts = imports.addQObject(QueryObjectImports.ReturnTypes);
241
+ const qComplexParam = imports.addQObject(QueryObjectImports.QComplexParam);
232
242
  const returnQName = imports.addGeneratedQObject(returnType.fqType, returnType.qObject);
233
243
  returnTypeOpStmt = `new ${opRt}(${rts}.COMPLEX${collectionSuffix}, new ${qComplexParam}("NONE", new ${returnQName}))`;
234
244
  }
235
245
  }
236
246
  // currently, it only makes sense to add the OperationReturnType if a converter is present
237
247
  else if (returnType.converters && returnType.qParam) {
238
- const rtClass = imports.addQObject(ImportObjects_1.QueryObjectImports.OperationReturnType);
239
- const rtTypes = imports.addQObject(ImportObjects_1.QueryObjectImports.ReturnTypes);
248
+ const rtClass = imports.addQObject(QueryObjectImports.OperationReturnType);
249
+ const rtTypes = imports.addQObject(QueryObjectImports.ReturnTypes);
240
250
  const qParam = imports.addQObject(returnType.qParam);
241
251
  // TODO: some constants with string concat
242
252
  const rtKind = `${rtTypes}.VALUE${collectionSuffix}`;
@@ -253,7 +263,7 @@ class QueryObjectGenerator {
253
263
  properties: [
254
264
  {
255
265
  name: "params",
256
- scope: ts_morph_1.Scope.Private,
266
+ scope: Scope.Private,
257
267
  isReadonly: true,
258
268
  type: hasParams ? undefined : "[]",
259
269
  initializer: this.getParamInitString(imports, operation.parameters, operation.overrides),