@odata2ts/odata2ts 0.33.1 → 0.33.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/lib/FactoryFunctionModel.d.ts +3 -3
- package/lib/FactoryFunctionModel.js.map +1 -1
- package/lib/OptionModel.d.ts +9 -0
- package/lib/OptionModel.js.map +1 -1
- package/lib/app.js +18 -8
- package/lib/app.js.map +1 -1
- package/lib/data-model/DataModel.d.ts +12 -6
- package/lib/data-model/DataModel.js +10 -0
- package/lib/data-model/DataModel.js.map +1 -1
- package/lib/data-model/DataModelDigestion.js +37 -20
- package/lib/data-model/DataModelDigestion.js.map +1 -1
- package/lib/data-model/DataModelDigestionV4.js +0 -9
- package/lib/data-model/DataModelDigestionV4.js.map +1 -1
- package/lib/data-model/DataTypeModel.d.ts +17 -7
- package/lib/data-model/DataTypeModel.js.map +1 -1
- package/lib/data-model/NamingHelper.d.ts +1 -0
- package/lib/data-model/NamingHelper.js +4 -1
- package/lib/data-model/NamingHelper.js.map +1 -1
- package/lib/data-model/ServiceConfigHelper.js +2 -2
- package/lib/data-model/ServiceConfigHelper.js.map +1 -1
- package/lib/data-model/validation/NameClashValidator.d.ts +23 -0
- package/lib/data-model/validation/NameClashValidator.js +89 -0
- package/lib/data-model/validation/NameClashValidator.js.map +1 -0
- package/lib/data-model/validation/NameValidator.d.ts +6 -17
- package/lib/data-model/validation/NameValidator.js +0 -77
- package/lib/data-model/validation/NameValidator.js.map +1 -1
- package/lib/data-model/validation/NoopValidator.d.ts +12 -0
- package/lib/data-model/validation/NoopValidator.js +34 -0
- package/lib/data-model/validation/NoopValidator.js.map +1 -0
- package/lib/defaultConfig.js +1 -0
- package/lib/defaultConfig.js.map +1 -1
- package/lib/generator/ImportContainer.d.ts +44 -11
- package/lib/generator/ImportContainer.js +150 -47
- package/lib/generator/ImportContainer.js.map +1 -1
- package/lib/generator/ImportedNameValidator.d.ts +5 -0
- package/lib/generator/ImportedNameValidator.js +26 -0
- package/lib/generator/ImportedNameValidator.js.map +1 -0
- package/lib/generator/ModelGenerator.js +113 -72
- package/lib/generator/ModelGenerator.js.map +1 -1
- package/lib/generator/QueryObjectGenerator.js +134 -107
- package/lib/generator/QueryObjectGenerator.js.map +1 -1
- package/lib/generator/ServiceGenerator.d.ts +1 -1
- package/lib/generator/ServiceGenerator.js +160 -161
- package/lib/generator/ServiceGenerator.js.map +1 -1
- package/lib/generator/import/ImportObjects.d.ts +66 -0
- package/lib/generator/import/ImportObjects.js +83 -0
- package/lib/generator/import/ImportObjects.js.map +1 -0
- package/lib/project/FileHandler.d.ts +28 -0
- package/lib/project/FileHandler.js +66 -0
- package/lib/project/FileHandler.js.map +1 -0
- package/lib/project/ProjectManager.d.ts +44 -18
- package/lib/project/ProjectManager.js +155 -111
- package/lib/project/ProjectManager.js.map +1 -1
- package/lib/project/TsMorphHelper.d.ts +11 -0
- package/lib/project/TsMorphHelper.js +66 -0
- package/lib/project/TsMorphHelper.js.map +1 -0
- package/package.json +10 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImportContainer.js","sourceRoot":"","sources":["../../src/generator/ImportContainer.ts"],"names":[],"mappings":";;;;AAcA,MAAa,eAAe;IAsB1B,YAAY,SAAuB;QArB3B,YAAO,GAEX;YACF,IAAI,EAAE,EAAE,UAAU,EAAE,sBAAsB,EAAE,UAAU,EAAE,KAAK,EAAE;YAC/D,QAAQ,EAAE,EAAE,UAAU,EAAE,+BAA+B,EAAE,UAAU,EAAE,KAAK,EAAE;YAC5E,SAAS,EAAE,EAAE,UAAU,EAAE,2BAA2B,EAAE,UAAU,EAAE,KAAK,EAAE;YACzE,OAAO,EAAE,EAAE,UAAU,EAAE,yBAAyB,EAAE,UAAU,EAAE,KAAK,EAAE;YACrE,QAAQ,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;YAC9C,WAAW,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;SAClD,CAAC;QAEM,cAAS,GAAwB;YACvC,IAAI,EAAE,IAAI,GAAG,EAAE;YACf,QAAQ,EAAE,IAAI,GAAG,EAAE;YACnB,SAAS,EAAE,IAAI,GAAG,EAAE;YACpB,OAAO,EAAE,IAAI,GAAG,EAAE;YAClB,QAAQ,EAAE,IAAI,GAAG,EAAE;YACnB,WAAW,EAAE,IAAI,GAAG,EAAE;YACtB,WAAW,EAAE,IAAI,GAAG,EAAE;SACvB,CAAC;QAGA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC;QACnD,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC;IAC1D,CAAC;IAEM,WAAW,CAAC,GAAG,KAAoB;QACxC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAEM,cAAc,CAAC,GAAG,KAAoB;QAC3C,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;IAEM,gBAAgB,CAAC,GAAG,KAAoB;QAC7C,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;IAEM,cAAc,CAAC,GAAG,KAAoB;QAC3C,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IAEM,iBAAiB,CAAC,GAAG,KAAoB;QAC9C,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;IAEM,mBAAmB,CAAC,GAAG,KAAoB;QAChD,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;IAEM,aAAa,CAAC,UAAkB,EAAE,QAAgB;QACvD,IAAI,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC5D,IAAI,CAAC,UAAU,EAAE;YACf,UAAU,GAAG,IAAI,GAAG,EAAE,CAAC;YACvB,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;SACxD;QACD,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;IAEM,qBAAqB,CAAC,cAAuB,KAAK;QACvD,MAAM,KAAsC,IAAI,CAAC,SAAS,EAApD,EAAE,WAAW,OAAuC,EAAlC,eAAe,sBAAjC,eAAmC,CAAiB,CAAC;QAE3D,OAAO;YACL,GAAG,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;iBACvB,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,WAAC,OAAA,CAAC,CAAC,CAAA,MAAA,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,0CAAE,IAAI,CAAA,CAAA,EAAA,CAAC;iBAC7C,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gBACX,OAAO;oBACL,YAAY,EAAE,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;oBACxC,eAAe,EAAE,GAAG;iBACS,CAAC;YAClC,CAAC,CAAC;YACJ,GAAG,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC;iBAC/B,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;iBACtC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE;gBACrB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAClC,OAAO;oBACL,YAAY,EAAE,CAAC,GAAG,MAAM,CAAC;oBACzB,eAAe,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE;iBACtE,CAAC;YAClC,CAAC,CAAC;SACL,CAAC;IACJ,CAAC;CACF;AAnFD,0CAmFC","sourcesContent":["import { ImportDeclarationStructure } from \"ts-morph\";\r\n\r\nimport { ProjectFiles } from \"../data-model/DataModel\";\r\n\r\ntype ImportContainerType = {\r\n core: Set<string>;\r\n qobjects: Set<string>;\r\n clientApi: Set<string>;\r\n service: Set<string>;\r\n genModel: Set<string>;\r\n genQObjects: Set<string>;\r\n customTypes: Map<string, Set<string>>;\r\n};\r\n\r\nexport class ImportContainer {\r\n private mapping: {\r\n [K in keyof ImportContainerType as string]: { moduleName: string; isRelative: boolean; addName?: boolean };\r\n } = {\r\n core: { moduleName: \"@odata2ts/odata-core\", isRelative: false },\r\n qobjects: { moduleName: \"@odata2ts/odata-query-objects\", isRelative: false },\r\n clientApi: { moduleName: \"@odata2ts/http-client-api\", isRelative: false },\r\n service: { moduleName: \"@odata2ts/odata-service\", isRelative: false },\r\n genModel: { moduleName: \"\", isRelative: true },\r\n genQObjects: { moduleName: \"\", isRelative: true },\r\n };\r\n\r\n private container: ImportContainerType = {\r\n core: new Set(),\r\n qobjects: new Set(),\r\n clientApi: new Set(),\r\n service: new Set(),\r\n genModel: new Set(),\r\n genQObjects: new Set(),\r\n customTypes: new Map(),\r\n };\r\n\r\n constructor(fileNames: ProjectFiles) {\r\n this.mapping.genModel.moduleName = fileNames.model;\r\n this.mapping.genQObjects.moduleName = fileNames.qObject;\r\n }\r\n\r\n public addFromCore(...names: Array<string>) {\r\n names.forEach((n) => this.container.core.add(n));\r\n }\r\n\r\n public addFromQObject(...names: Array<string>) {\r\n names.forEach((n) => this.container.qobjects.add(n));\r\n }\r\n\r\n public addFromClientApi(...names: Array<string>) {\r\n names.forEach((n) => this.container.clientApi.add(n));\r\n }\r\n\r\n public addFromService(...names: Array<string>) {\r\n names.forEach((n) => this.container.service.add(n));\r\n }\r\n\r\n public addGeneratedModel(...names: Array<string>) {\r\n names.forEach((n) => this.container.genModel.add(n));\r\n }\r\n\r\n public addGeneratedQObject(...names: Array<string>) {\r\n names.forEach((n) => this.container.genQObjects.add(n));\r\n }\r\n\r\n public addCustomType(moduleName: string, typeName: string) {\r\n let importList = this.container.customTypes.get(moduleName);\r\n if (!importList) {\r\n importList = new Set();\r\n this.container.customTypes.set(moduleName, importList);\r\n }\r\n importList.add(typeName);\r\n }\r\n\r\n public getImportDeclarations(fromSubPath: boolean = false): Array<ImportDeclarationStructure> {\r\n const { customTypes, ...standardImports } = this.container;\r\n\r\n return [\r\n ...[...customTypes.keys()]\r\n .filter((key) => !!customTypes.get(key)?.size)\r\n .map((key) => {\r\n return {\r\n namedImports: [...customTypes.get(key)!],\r\n moduleSpecifier: key,\r\n } as ImportDeclarationStructure;\r\n }),\r\n ...Object.entries(standardImports)\r\n .filter(([_, values]) => !!values.size)\r\n .map(([key, values]) => {\r\n const mapping = this.mapping[key];\r\n return {\r\n namedImports: [...values],\r\n moduleSpecifier: `${mapping.isRelative ? `${fromSubPath ? \"..\" : \".\"}/` : \"\"}${mapping.moduleName}`,\r\n } as ImportDeclarationStructure;\r\n }),\r\n ];\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\";\n\nimport { ODataVersions } from \"@odata2ts/odata-core\";\nimport { ImportDeclarationStructure } from \"ts-morph\";\n\nimport { DataModel } from \"../data-model/DataModel\";\nimport { ComplexType, OperationType } from \"../data-model/DataTypeModel\";\nimport {\n ClientApiImports,\n CoreImports,\n LIB_MODULES,\n QueryObjectImports,\n ServiceImports,\n VERSIONED_CORE_IMPORTS,\n VERSIONED_SERVICE_IMPORTS,\n} from \"./import/ImportObjects\";\nimport { ImportedNameValidator } from \"./ImportedNameValidator\";\n\ntype ImportContainerType = Record<keyof typeof LIB_MODULES, Map<string, string>>;\n\n/**\n * Handles all the import statements for a given file.\n *\n * Features a renaming mechanism, so that when the import name conflicts with an existing import a new\n * name is generated and returned.\n *\n * Map<string,string>\n */\nexport class ImportContainer {\n private readonly importedNameValidator: ImportedNameValidator;\n // mapping of a custom defined type to a primitive type\n private customTypes = new Map<string, Map<string, string>>();\n // imports to generated artefacts\n private internalImports = new Map<string, Map<string, string>>();\n\n private libs: ImportContainerType = {\n core: new Map(),\n qObject: new Map(),\n clientApi: new Map(),\n service: new Map(),\n };\n\n constructor(\n protected path: string,\n protected fileName: string,\n protected dataModel: DataModel,\n protected mainFileNames: { model: string; qObject: string; service: string },\n protected readonly bundledFileGeneration: boolean,\n protected reservedNames: Array<string> | undefined\n ) {\n this.importedNameValidator = new ImportedNameValidator(reservedNames);\n }\n\n public addCoreLib(odataVersion: ODataVersions, ...coreLibs: Array<CoreImports>) {\n return coreLibs.map((coreLib) => {\n const name = CoreImports[coreLib] + (VERSIONED_CORE_IMPORTS.includes(coreLib) ? ODataVersions[odataVersion] : \"\");\n const importName = this.importedNameValidator.validateName(LIB_MODULES.core, name);\n this.libs.core.set(name, importName);\n return importName;\n });\n }\n\n public addFromQObject(...names: Array<string>) {\n return names.map((n) => {\n const importName = this.importedNameValidator.validateName(LIB_MODULES.qObject, n);\n this.libs.qObject.set(n, importName);\n return importName;\n });\n }\n\n public addQObject(...qObjects: Array<QueryObjectImports>) {\n return this.addFromQObject(...qObjects.map((qObject) => QueryObjectImports[qObject]));\n }\n\n public addClientApi(...clientApis: Array<ClientApiImports>) {\n return clientApis.map((clientApi) => {\n const name = ClientApiImports[clientApi];\n const importName = this.importedNameValidator.validateName(LIB_MODULES.clientApi, name);\n this.libs.clientApi.set(name, importName);\n return importName;\n });\n }\n\n public addServiceObject(odataVersion: ODataVersions, ...serviceObjects: Array<ServiceImports>) {\n return serviceObjects\n .map((so) => {\n return ServiceImports[so] + (VERSIONED_SERVICE_IMPORTS.includes(so) ? ODataVersions[odataVersion] : \"\");\n })\n .map((so) => {\n const importName = this.importedNameValidator.validateName(LIB_MODULES.service, so);\n this.libs.service.set(so, importName);\n return importName;\n });\n }\n\n public addCustomType(moduleName: string, typeName: string) {\n let importList = this.customTypes.get(moduleName);\n if (!importList) {\n importList = new Map();\n this.customTypes.set(moduleName, importList);\n }\n\n const importName = this.importedNameValidator.validateName(moduleName, typeName);\n importList.set(typeName, importName);\n return importName;\n }\n\n private pathAndFile(filePath: string, fileName: string) {\n return filePath ? `${filePath}/${fileName}` : fileName;\n }\n\n private isDifferentFile(filePath: string, fileName: string) {\n return this.pathAndFile(this.path, this.fileName) !== this.pathAndFile(filePath, fileName);\n }\n\n private addGeneratedImport(folderPath: string, fileName: string, name: string): string {\n // imports are only relevant for different files\n if (!this.isDifferentFile(folderPath, fileName)) {\n return name;\n }\n\n const moduleName = this.pathAndFile(folderPath, fileName);\n const importName = this.importedNameValidator.validateName(moduleName, name);\n\n const imports = this.internalImports.get(moduleName) || new Map<string, string>();\n imports.set(name, importName);\n this.internalImports.set(moduleName, imports);\n\n return importName;\n }\n\n public addGeneratedModel(fqName: string, name: string): string {\n if (this.bundledFileGeneration) {\n return this.addGeneratedImport(\"\", this.mainFileNames.model, name);\n } else {\n const model = this.dataModel.getModel(fqName) as ComplexType | undefined;\n if (!model && fqName !== \"\") {\n throw new Error(`Cannot find model by its fully qualified name: ${fqName}!`);\n }\n\n const folderPath = model ? model.folderPath : \"\";\n const modelName = model ? model.modelName : this.mainFileNames.model;\n return this.addGeneratedImport(folderPath, modelName, name);\n }\n }\n\n public addGeneratedQObject(fqName: string, name: string) {\n if (this.bundledFileGeneration) {\n return this.addGeneratedImport(\"\", this.mainFileNames.qObject, name);\n } else {\n const model = this.dataModel.getModel(fqName) as ComplexType | undefined;\n if (!model && fqName !== \"\") {\n throw new Error(`Cannot find q-object by its fully qualified name: ${fqName}!`);\n }\n\n const folderPath = model ? model.folderPath : \"\";\n const qName = model ? model.qName : this.mainFileNames!.qObject;\n return this.addGeneratedImport(folderPath, qName, name);\n }\n }\n\n public addGeneratedService(fqName: string, name: string) {\n if (this.bundledFileGeneration) {\n return this.addGeneratedImport(\"\", this.mainFileNames.service, name);\n } else {\n const model = this.dataModel.getModel(fqName) as ComplexType;\n return this.addGeneratedImport(model.folderPath, model.serviceName, name);\n }\n }\n\n public getImportDeclarations(fromSubPath: boolean = false): Array<ImportDeclarationStructure> {\n return [\n ...Object.entries(this.libs)\n .filter(([_, values]) => !!values.size)\n .map(([moduleName, toImport]) => {\n return {\n namedImports: this.getNamedImports(toImport),\n moduleSpecifier: LIB_MODULES[moduleName as keyof typeof LIB_MODULES],\n } as ImportDeclarationStructure;\n }),\n ...[...this.customTypes.keys()]\n .filter((moduleName) => !!this.customTypes.get(moduleName)?.size)\n .map((moduleName) => {\n const toImport = this.customTypes.get(moduleName)!;\n return {\n namedImports: this.getNamedImports(toImport),\n moduleSpecifier: moduleName,\n } as ImportDeclarationStructure;\n }),\n ...[...this.internalImports.entries()]\n .filter(([_, toImport]) => toImport.size > 0)\n .map(([key, toImport]) => {\n return {\n namedImports: this.getNamedImports(toImport),\n moduleSpecifier: this.getModuleSpecifier(key),\n } as ImportDeclarationStructure;\n }),\n ];\n }\n\n private getNamedImports(toImport: Map<string, string>): Array<{ name: string; alias: string | undefined }> {\n return [...toImport.entries()].map(([name, alias]) => ({\n name,\n alias: alias !== name ? alias : undefined,\n }));\n }\n\n private getModuleSpecifier(filePath: string): string {\n const relativePath = path.relative(this.path, filePath).replaceAll(path.sep, \"/\");\n return !relativePath.startsWith(\".\") ? \"./\" + relativePath : relativePath;\n }\n}\n"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ImportedNameValidator = void 0;
|
|
4
|
+
class ImportedNameValidator {
|
|
5
|
+
constructor(reservedNames) {
|
|
6
|
+
this.importedNames = new Map();
|
|
7
|
+
reservedNames === null || reservedNames === void 0 ? void 0 : reservedNames.forEach((rn) => {
|
|
8
|
+
this.importedNames.set(rn, { ["_"]: rn });
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
validateName(qualifier, name) {
|
|
12
|
+
var _a;
|
|
13
|
+
const qualifiers = (_a = this.importedNames.get(name)) !== null && _a !== void 0 ? _a : {};
|
|
14
|
+
const hitName = qualifiers[qualifier];
|
|
15
|
+
if (hitName) {
|
|
16
|
+
return hitName;
|
|
17
|
+
}
|
|
18
|
+
const qualifiersSize = Object.keys(qualifiers).length;
|
|
19
|
+
const result = qualifiersSize ? `${name}_${qualifiersSize}` : name;
|
|
20
|
+
qualifiers[qualifier] = result;
|
|
21
|
+
this.importedNames.set(name, qualifiers);
|
|
22
|
+
return result;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.ImportedNameValidator = ImportedNameValidator;
|
|
26
|
+
//# sourceMappingURL=ImportedNameValidator.js.map
|
|
@@ -0,0 +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 {\n private importedNames = new Map<string, Record<string, string>>();\n\n public constructor(reservedNames?: Array<string> | undefined) {\n reservedNames?.forEach((rn) => {\n this.importedNames.set(rn, { [\"_\"]: rn });\n });\n }\n\n public validateName(qualifier: string, name: string): string {\n const qualifiers = this.importedNames.get(name) ?? {};\n const hitName = qualifiers[qualifier];\n\n if (hitName) {\n return hitName;\n }\n\n const qualifiersSize = Object.keys(qualifiers).length;\n const result = qualifiersSize ? `${name}_${qualifiersSize}` : name;\n\n qualifiers[qualifier] = result;\n this.importedNames.set(name, qualifiers);\n\n return result;\n }\n}\n"]}
|
|
@@ -1,75 +1,113 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.generateModels = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
4
5
|
const ts_morph_1 = require("ts-morph");
|
|
5
|
-
const
|
|
6
|
-
const generateModels = (
|
|
7
|
-
const generator = new ModelGenerator(
|
|
6
|
+
const ImportObjects_1 = require("./import/ImportObjects");
|
|
7
|
+
const generateModels = (project, dataModel, version, options, namingHelper) => {
|
|
8
|
+
const generator = new ModelGenerator(project, dataModel, version, options, namingHelper);
|
|
8
9
|
return generator.generate();
|
|
9
10
|
};
|
|
10
11
|
exports.generateModels = generateModels;
|
|
11
|
-
const DEFERRED_CONTENT = "DeferredContent";
|
|
12
12
|
class ModelGenerator {
|
|
13
|
-
constructor(
|
|
13
|
+
constructor(project, dataModel, version, options, namingHelper) {
|
|
14
|
+
this.project = project;
|
|
14
15
|
this.dataModel = dataModel;
|
|
15
|
-
this.sourceFile = sourceFile;
|
|
16
16
|
this.version = version;
|
|
17
17
|
this.options = options;
|
|
18
18
|
this.namingHelper = namingHelper;
|
|
19
19
|
}
|
|
20
20
|
generate() {
|
|
21
|
-
this
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
21
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
22
|
+
this.project.initModels();
|
|
23
|
+
const promises = [
|
|
24
|
+
...this.generateEnums(),
|
|
25
|
+
...this.generateEntityTypeModels(),
|
|
26
|
+
...this.generateComplexTypeModels(),
|
|
27
|
+
];
|
|
28
|
+
if (!this.options.skipOperations) {
|
|
29
|
+
promises.push(this.generateUnboundOperationParams());
|
|
30
|
+
}
|
|
31
|
+
yield Promise.all(promises);
|
|
32
|
+
return this.project.finalizeModels();
|
|
33
|
+
});
|
|
27
34
|
}
|
|
28
35
|
generateEnums() {
|
|
29
|
-
this.dataModel.getEnums().
|
|
30
|
-
this.
|
|
31
|
-
|
|
36
|
+
return this.dataModel.getEnums().map((et) => {
|
|
37
|
+
const file = this.project.createOrGetModelFile(et.folderPath, et.modelName);
|
|
38
|
+
file.getFile().addEnum({
|
|
39
|
+
name: et.modelName,
|
|
32
40
|
isExported: true,
|
|
33
41
|
members: et.members.map((mem) => ({ name: mem, initializer: `"${mem}"` })),
|
|
34
42
|
});
|
|
43
|
+
return this.project.finalizeFile(file);
|
|
35
44
|
});
|
|
36
45
|
}
|
|
37
|
-
|
|
38
|
-
this.dataModel.getEntityTypes().
|
|
39
|
-
this.
|
|
46
|
+
generateEntityTypeModels() {
|
|
47
|
+
return this.dataModel.getEntityTypes().map((model) => {
|
|
48
|
+
const file = this.project.createOrGetModelFile(model.folderPath, model.modelName, [
|
|
49
|
+
model.modelName,
|
|
50
|
+
model.id.modelName,
|
|
51
|
+
model.editableName,
|
|
52
|
+
]);
|
|
53
|
+
// query model
|
|
54
|
+
this.generateModel(file, model);
|
|
55
|
+
// key model
|
|
40
56
|
if (!this.options.skipIdModels && model.generateId) {
|
|
41
|
-
this.generateIdModel(model);
|
|
57
|
+
this.generateIdModel(file, model);
|
|
42
58
|
}
|
|
43
|
-
|
|
44
|
-
|
|
59
|
+
// editable model
|
|
60
|
+
if (!this.options.skipEditableModels) {
|
|
61
|
+
this.generateEditableModel(file, model);
|
|
45
62
|
}
|
|
63
|
+
// param models for bound operations
|
|
46
64
|
if (!this.options.skipOperations) {
|
|
47
|
-
|
|
65
|
+
[
|
|
66
|
+
...this.dataModel.getEntityTypeOperations(model.fqName),
|
|
67
|
+
...this.dataModel.getEntitySetOperations(model.fqName),
|
|
68
|
+
].forEach((operation) => {
|
|
69
|
+
this.generateOperationParams(file, operation);
|
|
70
|
+
});
|
|
48
71
|
}
|
|
72
|
+
return this.project.finalizeFile(file);
|
|
49
73
|
});
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
74
|
+
}
|
|
75
|
+
generateComplexTypeModels() {
|
|
76
|
+
return this.dataModel.getComplexTypes().map((model) => {
|
|
77
|
+
const file = this.project.createOrGetModelFile(model.folderPath, model.modelName, [
|
|
78
|
+
model.modelName,
|
|
79
|
+
model.editableName,
|
|
80
|
+
]);
|
|
81
|
+
// query model
|
|
82
|
+
this.generateModel(file, model);
|
|
83
|
+
// editable model
|
|
84
|
+
if (!this.options.skipEditableModels) {
|
|
85
|
+
this.generateEditableModel(file, model);
|
|
54
86
|
}
|
|
87
|
+
return this.project.finalizeFile(file);
|
|
55
88
|
});
|
|
56
|
-
this.sourceFile.addImportDeclarations(this.importContainer.getImportDeclarations());
|
|
57
89
|
}
|
|
58
|
-
generateModel(model) {
|
|
59
|
-
|
|
60
|
-
|
|
90
|
+
generateModel(file, model) {
|
|
91
|
+
const imports = file.getImports();
|
|
92
|
+
let extendsClause = undefined;
|
|
93
|
+
if (model.finalBaseClass) {
|
|
94
|
+
const modelName = imports.addGeneratedModel(model.baseClasses[0], this.namingHelper.getModelName(model.finalBaseClass));
|
|
95
|
+
extendsClause = [modelName];
|
|
96
|
+
}
|
|
97
|
+
file.getFile().addInterface({
|
|
98
|
+
name: model.modelName,
|
|
61
99
|
isExported: true,
|
|
62
100
|
properties: model.props.map((p) => {
|
|
63
101
|
const isEntity = p.dataType == "ModelType" /* DataTypes.ModelType */;
|
|
64
102
|
return {
|
|
65
103
|
name: p.name,
|
|
66
|
-
type: this.getPropType(p),
|
|
104
|
+
type: this.getPropType(file.getImports(), p),
|
|
67
105
|
// props for entities or entity collections are not added in V4 if not explicitly expanded
|
|
68
106
|
hasQuestionToken: this.dataModel.isV4() && isEntity,
|
|
69
107
|
docs: this.options.skipComments ? undefined : [this.generatePropDoc(p, model)],
|
|
70
108
|
};
|
|
71
109
|
}),
|
|
72
|
-
extends:
|
|
110
|
+
extends: extendsClause,
|
|
73
111
|
});
|
|
74
112
|
}
|
|
75
113
|
generatePropDoc(prop, model) {
|
|
@@ -98,21 +136,24 @@ class ModelGenerator {
|
|
|
98
136
|
attributeTable.map((row) => `| ${row[0]} | \`${row[1]}\` |`).join("\n");
|
|
99
137
|
return { kind: ts_morph_1.StructureKind.JSDoc, description };
|
|
100
138
|
}
|
|
101
|
-
getPropType(prop) {
|
|
102
|
-
const isEntity = prop.dataType == "ModelType" /* DataTypes.ModelType */;
|
|
139
|
+
getPropType(imports, prop) {
|
|
103
140
|
// V2 entity special: deferred content
|
|
104
141
|
let suffix = "";
|
|
105
|
-
if (
|
|
106
|
-
this.
|
|
107
|
-
suffix = ` | ${
|
|
142
|
+
if (this.dataModel.isV2() && prop.dataType == "ModelType" /* DataTypes.ModelType */) {
|
|
143
|
+
const [defContent] = imports.addCoreLib(this.version, ImportObjects_1.CoreImports.DeferredContent);
|
|
144
|
+
suffix = ` | ${defContent}`;
|
|
145
|
+
}
|
|
146
|
+
let typeName;
|
|
147
|
+
if (prop.dataType === "PrimitiveType" /* DataTypes.PrimitiveType */) {
|
|
148
|
+
// custom types which require type imports => possible via converters
|
|
149
|
+
typeName = prop.typeModule ? imports.addCustomType(prop.typeModule, prop.type) : prop.type;
|
|
108
150
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
this.importContainer.addCustomType(prop.typeModule, prop.type);
|
|
151
|
+
else {
|
|
152
|
+
typeName = imports.addGeneratedModel(prop.fqType, prop.type);
|
|
112
153
|
}
|
|
113
154
|
// Collections
|
|
114
155
|
if (prop.isCollection) {
|
|
115
|
-
const type = `Array<${
|
|
156
|
+
const type = `Array<${typeName}>`;
|
|
116
157
|
if (this.dataModel.isV2() && this.options.v2ModelsWithExtraResultsWrapping) {
|
|
117
158
|
return `{ results: ${type} }` + suffix;
|
|
118
159
|
}
|
|
@@ -121,19 +162,21 @@ class ModelGenerator {
|
|
|
121
162
|
}
|
|
122
163
|
}
|
|
123
164
|
// primitive, enum & complex types
|
|
124
|
-
return
|
|
165
|
+
return typeName + (prop.required ? "" : " | null") + suffix;
|
|
125
166
|
}
|
|
126
|
-
generateIdModel(model) {
|
|
167
|
+
generateIdModel(file, model) {
|
|
127
168
|
const singleType = model.keys.length === 1 ? `${model.keys[0].type} | ` : "";
|
|
128
|
-
const keyTypes = model.keys
|
|
169
|
+
const keyTypes = model.keys
|
|
170
|
+
.map((keyProp) => `${keyProp.name}: ${this.getPropType(file.getImports(), keyProp)}`)
|
|
171
|
+
.join(",");
|
|
129
172
|
const type = `${singleType}{${keyTypes}}`;
|
|
130
|
-
|
|
131
|
-
name: model.
|
|
173
|
+
file.getFile().addTypeAlias({
|
|
174
|
+
name: model.id.modelName,
|
|
132
175
|
isExported: true,
|
|
133
176
|
type,
|
|
134
177
|
});
|
|
135
178
|
}
|
|
136
|
-
generateEditableModel(model) {
|
|
179
|
+
generateEditableModel(file, model) {
|
|
137
180
|
const entityTypes = ["ModelType" /* DataTypes.ModelType */, "ComplexType" /* DataTypes.ComplexType */];
|
|
138
181
|
const allProps = [...model.baseProps, ...model.props].filter((p) => !p.managed);
|
|
139
182
|
const requiredProps = allProps
|
|
@@ -146,10 +189,10 @@ class ModelGenerator {
|
|
|
146
189
|
.join(" | ");
|
|
147
190
|
const complexProps = allProps.filter((p) => p.dataType === "ComplexType" /* DataTypes.ComplexType */);
|
|
148
191
|
const extendsClause = [
|
|
149
|
-
requiredProps ? `Pick<${model.
|
|
150
|
-
optionalProps ? `Partial<Pick<${model.
|
|
192
|
+
requiredProps ? `Pick<${model.modelName}, ${requiredProps}>` : null,
|
|
193
|
+
optionalProps ? `Partial<Pick<${model.modelName}, ${optionalProps}>>` : null,
|
|
151
194
|
].filter((e) => !!e);
|
|
152
|
-
|
|
195
|
+
file.getFile().addInterface({
|
|
153
196
|
name: model.editableName,
|
|
154
197
|
isExported: true,
|
|
155
198
|
extends: extendsClause,
|
|
@@ -158,7 +201,7 @@ class ModelGenerator {
|
|
|
158
201
|
: complexProps.map((p) => {
|
|
159
202
|
return {
|
|
160
203
|
name: p.name,
|
|
161
|
-
type: this.getEditablePropType(p),
|
|
204
|
+
type: this.getEditablePropType(file.getImports(), p),
|
|
162
205
|
// optional props don't need to be specified in editable model
|
|
163
206
|
// also, entities would require deep insert func => we make it optional for now
|
|
164
207
|
hasQuestionToken: !p.required || p.dataType === "ModelType" /* DataTypes.ModelType */,
|
|
@@ -166,43 +209,41 @@ class ModelGenerator {
|
|
|
166
209
|
}),
|
|
167
210
|
});
|
|
168
211
|
}
|
|
169
|
-
getEditablePropType(prop) {
|
|
170
|
-
const
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
212
|
+
getEditablePropType(imports, prop) {
|
|
213
|
+
const isModelType = ["ModelType" /* DataTypes.ModelType */, "ComplexType" /* DataTypes.ComplexType */].includes(prop.dataType);
|
|
214
|
+
let editableType = prop.type;
|
|
215
|
+
if (isModelType) {
|
|
216
|
+
const editName = this.dataModel.getComplexType(prop.fqType).editableName;
|
|
217
|
+
editableType = imports.addGeneratedModel(prop.fqType, editName);
|
|
218
|
+
}
|
|
175
219
|
// Collections
|
|
176
220
|
if (prop.isCollection) {
|
|
177
|
-
return `Array<${
|
|
221
|
+
return `Array<${editableType}>`;
|
|
178
222
|
}
|
|
179
223
|
// primitive, enum & complex types
|
|
180
|
-
return
|
|
224
|
+
return editableType + (prop.required ? "" : " | null");
|
|
181
225
|
}
|
|
182
226
|
generateUnboundOperationParams() {
|
|
183
|
-
|
|
184
|
-
this.
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
...this.dataModel.getEntitySetOperations(entityName),
|
|
191
|
-
].forEach((operation) => {
|
|
192
|
-
this.generateOperationParams(operation);
|
|
227
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
228
|
+
const unboundOps = this.dataModel.getUnboundOperationTypes();
|
|
229
|
+
const reservedNames = unboundOps.map((op) => op.paramsModelName);
|
|
230
|
+
const file = this.project.createOrGetMainModelFile(reservedNames);
|
|
231
|
+
unboundOps.forEach((operation) => {
|
|
232
|
+
this.generateOperationParams(file, operation);
|
|
233
|
+
});
|
|
193
234
|
});
|
|
194
235
|
}
|
|
195
|
-
generateOperationParams(operation) {
|
|
236
|
+
generateOperationParams(file, operation) {
|
|
196
237
|
if (!operation.parameters.length) {
|
|
197
238
|
return;
|
|
198
239
|
}
|
|
199
|
-
|
|
240
|
+
file.getFile().addInterface({
|
|
200
241
|
name: operation.paramsModelName,
|
|
201
242
|
isExported: true,
|
|
202
243
|
properties: operation.parameters.map((p) => {
|
|
203
244
|
return {
|
|
204
245
|
name: p.name,
|
|
205
|
-
type: this.getPropType(p),
|
|
246
|
+
type: this.getPropType(file.getImports(), p),
|
|
206
247
|
hasQuestionToken: !p.required,
|
|
207
248
|
};
|
|
208
249
|
}),
|
|
@@ -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\";\nimport { JSDocStructure, OptionalKind, SourceFile, StructureKind } from \"ts-morph\";\n\nimport { DataModel } from \"../data-model/DataModel\";\nimport { ComplexType, DataTypes, ModelType, OperationType, PropertyModel } from \"../data-model/DataTypeModel\";\nimport { NamingHelper } from \"../data-model/NamingHelper\";\nimport { EntityBasedGeneratorFunction, GeneratorFunctionOptions } from \"../FactoryFunctionModel\";\nimport { ImportContainer } from \"./ImportContainer\";\n\nexport const generateModels: EntityBasedGeneratorFunction = (dataModel, sourceFile, version, options, namingHelper) => {\n const generator = new ModelGenerator(dataModel, sourceFile, version, options, namingHelper);\n return generator.generate();\n};\n\nconst DEFERRED_CONTENT = \"DeferredContent\";\n\nclass ModelGenerator {\n private importContainer!: ImportContainer;\n\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 this.importContainer = new ImportContainer(this.namingHelper.getFileNames());\n\n this.generateEnums();\n this.generateModels();\n if (!this.options.skipOperations) {\n this.generateUnboundOperationParams();\n }\n }\n\n private generateEnums() {\n this.dataModel.getEnums().forEach((et) => {\n this.sourceFile.addEnum({\n name: et.name,\n isExported: true,\n members: et.members.map((mem) => ({ name: mem, initializer: `\"${mem}\"` })),\n });\n });\n }\n\n private generateModels() {\n this.dataModel.getEntityTypes().forEach((model) => {\n this.generateModel(model);\n if (!this.options.skipIdModels && model.generateId) {\n this.generateIdModel(model);\n }\n if (!this.options.skipEditableModels && !model.abstract) {\n this.generateEditableModel(model);\n }\n if (!this.options.skipOperations) {\n this.generateBoundOperationParams(model.fqName);\n }\n });\n this.dataModel.getComplexTypes().forEach((model) => {\n this.generateModel(model);\n if (!this.options.skipEditableModels && !model.abstract) {\n this.generateEditableModel(model);\n }\n });\n\n this.sourceFile.addImportDeclarations(this.importContainer.getImportDeclarations());\n }\n\n private generateModel(model: ComplexType | ModelType) {\n this.sourceFile.addInterface({\n name: model.name,\n isExported: true,\n properties: model.props.map((p) => {\n const isEntity = p.dataType == DataTypes.ModelType;\n return {\n name: p.name,\n type: this.getPropType(p),\n // props for entities or entity collections are not added in V4 if not explicitly expanded\n hasQuestionToken: this.dataModel.isV4() && isEntity,\n docs: this.options.skipComments ? undefined : [this.generatePropDoc(p, model)],\n };\n }),\n extends: model.finalBaseClass ? [this.namingHelper.getModelName(model.finalBaseClass)] : undefined,\n });\n }\n\n private generatePropDoc(prop: PropertyModel, model: ComplexType | ModelType): OptionalKind<JSDocStructure> {\n const isKeyProp = (model as ModelType).keyNames?.includes(prop.odataName);\n const baseAttribs: Array<string> = [];\n if (isKeyProp) {\n baseAttribs.push(\"**Key Property**: This is a key property used to identify the entity.\");\n }\n if (prop.managed) {\n baseAttribs.push(\"**Managed**: This property is managed on the server side and cannot be edited.\");\n }\n if (prop.converters?.length) {\n baseAttribs.push(`**Applied Converters**: ${prop.converters.map((c) => c.converterId).join(\",\")}.`);\n }\n\n const attributeTable: Array<[string, string]> = [\n [\"Name\", prop.odataName],\n [\"Type\", prop.odataType],\n ];\n if (prop.required) {\n attributeTable.push([\"Nullable\", \"false\"]);\n }\n\n const description =\n (baseAttribs ? baseAttribs.join(\"<br/>\") + \"\\n\\n\" : \"\") +\n \"OData Attributes:\\n\" +\n \"|Attribute Name | Attribute Value |\\n| --- | ---|\\n\" +\n attributeTable.map((row) => `| ${row[0]} | \\`${row[1]}\\` |`).join(\"\\n\");\n\n return { kind: StructureKind.JSDoc, description };\n }\n\n private getPropType(prop: PropertyModel): string {\n const isEntity = prop.dataType == DataTypes.ModelType;\n\n // V2 entity special: deferred content\n let suffix = \"\";\n if (isEntity && this.dataModel.isV2()) {\n this.importContainer.addFromCore(DEFERRED_CONTENT);\n suffix = ` | ${DEFERRED_CONTENT}`;\n }\n // custom types which require type imports => possible via converters\n else if (prop.typeModule) {\n this.importContainer.addCustomType(prop.typeModule, prop.type);\n }\n\n // Collections\n if (prop.isCollection) {\n const type = `Array<${prop.type}>`;\n if (this.dataModel.isV2() && this.options.v2ModelsWithExtraResultsWrapping) {\n return `{ results: ${type} }` + suffix;\n } else {\n return type + suffix;\n }\n }\n\n // primitive, enum & complex types\n return prop.type + (prop.required ? \"\" : \" | null\") + suffix;\n }\n\n private generateIdModel(model: ModelType) {\n const singleType = model.keys.length === 1 ? `${model.keys[0].type} | ` : \"\";\n const keyTypes = model.keys.map((keyProp) => `${keyProp.name}: ${this.getPropType(keyProp)}`).join(\",\");\n const type = `${singleType}{${keyTypes}}`;\n\n this.sourceFile.addTypeAlias({\n name: model.idModelName,\n isExported: true,\n type,\n });\n }\n\n private generateEditableModel(model: ComplexType) {\n const entityTypes = [DataTypes.ModelType, DataTypes.ComplexType];\n const allProps = [...model.baseProps, ...model.props].filter((p) => !p.managed);\n\n const requiredProps = allProps\n .filter((p) => p.required && !entityTypes.includes(p.dataType))\n .map((p) => `\"${p.name}\"`)\n .join(\" | \");\n const optionalProps = allProps\n .filter((p) => !p.required && !entityTypes.includes(p.dataType))\n .map((p) => `\"${p.name}\"`)\n .join(\" | \");\n const complexProps = allProps.filter((p) => p.dataType === DataTypes.ComplexType);\n\n const extendsClause = [\n requiredProps ? `Pick<${model.name}, ${requiredProps}>` : null,\n optionalProps ? `Partial<Pick<${model.name}, ${optionalProps}>>` : null,\n ].filter((e): e is string => !!e);\n\n this.sourceFile.addInterface({\n name: model.editableName,\n isExported: true,\n extends: extendsClause,\n properties: !complexProps\n ? undefined\n : complexProps.map((p) => {\n return {\n name: p.name,\n type: this.getEditablePropType(p),\n // optional props don't need to be specified in editable model\n // also, entities would require deep insert func => we make it optional for now\n hasQuestionToken: !p.required || p.dataType === DataTypes.ModelType,\n };\n }),\n });\n }\n\n private getEditablePropType(prop: PropertyModel): string {\n const type =\n prop.dataType === DataTypes.ModelType\n ? this.dataModel.getEntityType(prop.fqType)!.editableName\n : prop.dataType === DataTypes.ComplexType\n ? this.dataModel.getComplexType(prop.fqType)!.editableName\n : prop.type;\n\n // Collections\n if (prop.isCollection) {\n return `Array<${type}>`;\n }\n\n // primitive, enum & complex types\n return type + (prop.required ? \"\" : \" | null\");\n }\n\n private generateUnboundOperationParams() {\n this.dataModel.getUnboundOperationTypes().forEach((operation) => {\n this.generateOperationParams(operation);\n });\n }\n\n private generateBoundOperationParams(entityName: string) {\n [\n ...this.dataModel.getEntityTypeOperations(entityName),\n ...this.dataModel.getEntitySetOperations(entityName),\n ].forEach((operation) => {\n this.generateOperationParams(operation);\n });\n }\n\n private generateOperationParams(operation: OperationType) {\n if (!operation.parameters.length) {\n return;\n }\n this.sourceFile.addInterface({\n name: operation.paramsModelName,\n isExported: true,\n properties: operation.parameters.map((p) => {\n return {\n name: p.name,\n type: this.getPropType(p),\n hasQuestionToken: !p.required,\n };\n }),\n });\n }\n}\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\";\nimport { JSDocStructure, OptionalKind, StructureKind } from \"ts-morph\";\n\nimport { DataModel } from \"../data-model/DataModel\";\nimport { ComplexType, DataTypes, EntityType, OperationType, PropertyModel } from \"../data-model/DataTypeModel\";\nimport { NamingHelper } from \"../data-model/NamingHelper\";\nimport { EntityBasedGeneratorFunction, GeneratorFunctionOptions } from \"../FactoryFunctionModel\";\nimport { FileHandler } from \"../project/FileHandler\";\nimport { ProjectManager } from \"../project/ProjectManager\";\nimport { CoreImports } from \"./import/ImportObjects\";\nimport { ImportContainer } from \"./ImportContainer\";\n\nexport const generateModels: EntityBasedGeneratorFunction = (\n project: ProjectManager,\n dataModel,\n version,\n options,\n namingHelper\n) => {\n const generator = new ModelGenerator(project, dataModel, version, options, namingHelper);\n return generator.generate();\n};\n\nclass ModelGenerator {\n constructor(\n private project: ProjectManager,\n private dataModel: DataModel,\n private version: ODataVersions,\n private options: GeneratorFunctionOptions,\n private namingHelper: NamingHelper\n ) {}\n\n public async generate(): Promise<void> {\n this.project.initModels();\n\n const promises: Array<Promise<void>> = [\n ...this.generateEnums(),\n ...this.generateEntityTypeModels(),\n ...this.generateComplexTypeModels(),\n ];\n\n if (!this.options.skipOperations) {\n promises.push(this.generateUnboundOperationParams());\n }\n\n await Promise.all(promises);\n\n return this.project.finalizeModels();\n }\n\n private generateEnums() {\n return this.dataModel.getEnums().map((et) => {\n const file = this.project.createOrGetModelFile(et.folderPath, et.modelName);\n\n file.getFile().addEnum({\n name: et.modelName,\n isExported: true,\n members: et.members.map((mem) => ({ name: mem, initializer: `\"${mem}\"` })),\n });\n\n return this.project.finalizeFile(file);\n });\n }\n\n private generateEntityTypeModels() {\n return this.dataModel.getEntityTypes().map((model) => {\n const file = this.project.createOrGetModelFile(model.folderPath, model.modelName, [\n model.modelName,\n model.id.modelName,\n model.editableName,\n ]);\n\n // query model\n this.generateModel(file, model);\n\n // key model\n if (!this.options.skipIdModels && model.generateId) {\n this.generateIdModel(file, model);\n }\n\n // editable model\n if (!this.options.skipEditableModels) {\n this.generateEditableModel(file, model);\n }\n\n // param models for bound operations\n if (!this.options.skipOperations) {\n [\n ...this.dataModel.getEntityTypeOperations(model.fqName),\n ...this.dataModel.getEntitySetOperations(model.fqName),\n ].forEach((operation) => {\n this.generateOperationParams(file, operation);\n });\n }\n\n return this.project.finalizeFile(file);\n });\n }\n\n private generateComplexTypeModels() {\n return this.dataModel.getComplexTypes().map((model) => {\n const file = this.project.createOrGetModelFile(model.folderPath, model.modelName, [\n model.modelName,\n model.editableName,\n ]);\n\n // query model\n this.generateModel(file, model);\n\n // editable model\n if (!this.options.skipEditableModels) {\n this.generateEditableModel(file, model);\n }\n\n return this.project.finalizeFile(file);\n });\n }\n\n private generateModel(file: FileHandler, model: ComplexType | EntityType) {\n const imports = file.getImports();\n let extendsClause = undefined;\n if (model.finalBaseClass) {\n const modelName = imports.addGeneratedModel(\n model.baseClasses[0],\n this.namingHelper.getModelName(model.finalBaseClass)\n );\n extendsClause = [modelName];\n }\n\n file.getFile().addInterface({\n name: model.modelName,\n isExported: true,\n properties: model.props.map((p) => {\n const isEntity = p.dataType == DataTypes.ModelType;\n return {\n name: p.name,\n type: this.getPropType(file.getImports(), p),\n // props for entities or entity collections are not added in V4 if not explicitly expanded\n hasQuestionToken: this.dataModel.isV4() && isEntity,\n docs: this.options.skipComments ? undefined : [this.generatePropDoc(p, model)],\n };\n }),\n extends: extendsClause,\n });\n }\n\n private generatePropDoc(prop: PropertyModel, model: ComplexType | EntityType): OptionalKind<JSDocStructure> {\n const isKeyProp = (model as EntityType).keyNames?.includes(prop.odataName);\n const baseAttribs: Array<string> = [];\n if (isKeyProp) {\n baseAttribs.push(\"**Key Property**: This is a key property used to identify the entity.\");\n }\n if (prop.managed) {\n baseAttribs.push(\"**Managed**: This property is managed on the server side and cannot be edited.\");\n }\n if (prop.converters?.length) {\n baseAttribs.push(`**Applied Converters**: ${prop.converters.map((c) => c.converterId).join(\",\")}.`);\n }\n\n const attributeTable: Array<[string, string]> = [\n [\"Name\", prop.odataName],\n [\"Type\", prop.odataType],\n ];\n if (prop.required) {\n attributeTable.push([\"Nullable\", \"false\"]);\n }\n\n const description =\n (baseAttribs ? baseAttribs.join(\"<br/>\") + \"\\n\\n\" : \"\") +\n \"OData Attributes:\\n\" +\n \"|Attribute Name | Attribute Value |\\n| --- | ---|\\n\" +\n attributeTable.map((row) => `| ${row[0]} | \\`${row[1]}\\` |`).join(\"\\n\");\n\n return { kind: StructureKind.JSDoc, description };\n }\n\n private getPropType(imports: ImportContainer, prop: PropertyModel): string {\n // V2 entity special: deferred content\n let suffix = \"\";\n if (this.dataModel.isV2() && prop.dataType == DataTypes.ModelType) {\n const [defContent] = imports.addCoreLib(this.version, CoreImports.DeferredContent);\n suffix = ` | ${defContent}`;\n }\n\n let typeName: string;\n if (prop.dataType === DataTypes.PrimitiveType) {\n // custom types which require type imports => possible via converters\n typeName = prop.typeModule ? imports.addCustomType(prop.typeModule, prop.type) : prop.type;\n } else {\n typeName = imports.addGeneratedModel(prop.fqType, prop.type);\n }\n\n // Collections\n if (prop.isCollection) {\n const type = `Array<${typeName}>`;\n if (this.dataModel.isV2() && this.options.v2ModelsWithExtraResultsWrapping) {\n return `{ results: ${type} }` + suffix;\n } else {\n return type + suffix;\n }\n }\n\n // primitive, enum & complex types\n return typeName + (prop.required ? \"\" : \" | null\") + suffix;\n }\n\n private generateIdModel(file: FileHandler, model: EntityType) {\n const singleType = model.keys.length === 1 ? `${model.keys[0].type} | ` : \"\";\n const keyTypes = model.keys\n .map((keyProp) => `${keyProp.name}: ${this.getPropType(file.getImports(), keyProp)}`)\n .join(\",\");\n const type = `${singleType}{${keyTypes}}`;\n\n file.getFile().addTypeAlias({\n name: model.id.modelName,\n isExported: true,\n type,\n });\n }\n\n private generateEditableModel(file: FileHandler, model: ComplexType) {\n const entityTypes = [DataTypes.ModelType, DataTypes.ComplexType];\n const allProps = [...model.baseProps, ...model.props].filter((p) => !p.managed);\n\n const requiredProps = allProps\n .filter((p) => p.required && !entityTypes.includes(p.dataType))\n .map((p) => `\"${p.name}\"`)\n .join(\" | \");\n const optionalProps = allProps\n .filter((p) => !p.required && !entityTypes.includes(p.dataType))\n .map((p) => `\"${p.name}\"`)\n .join(\" | \");\n const complexProps = allProps.filter((p) => p.dataType === DataTypes.ComplexType);\n\n const extendsClause = [\n requiredProps ? `Pick<${model.modelName}, ${requiredProps}>` : null,\n optionalProps ? `Partial<Pick<${model.modelName}, ${optionalProps}>>` : null,\n ].filter((e): e is string => !!e);\n\n file.getFile().addInterface({\n name: model.editableName,\n isExported: true,\n extends: extendsClause,\n properties: !complexProps\n ? undefined\n : complexProps.map((p) => {\n return {\n name: p.name,\n type: this.getEditablePropType(file.getImports(), p),\n // optional props don't need to be specified in editable model\n // also, entities would require deep insert func => we make it optional for now\n hasQuestionToken: !p.required || p.dataType === DataTypes.ModelType,\n };\n }),\n });\n }\n\n private getEditablePropType(imports: ImportContainer, prop: PropertyModel): string {\n const isModelType = [DataTypes.ModelType, DataTypes.ComplexType].includes(prop.dataType);\n\n let editableType = prop.type;\n if (isModelType) {\n const editName = this.dataModel.getComplexType(prop.fqType)!.editableName;\n editableType = imports.addGeneratedModel(prop.fqType, editName);\n }\n\n // Collections\n if (prop.isCollection) {\n return `Array<${editableType}>`;\n }\n\n // primitive, enum & complex types\n return editableType + (prop.required ? \"\" : \" | null\");\n }\n\n private async generateUnboundOperationParams() {\n const unboundOps = this.dataModel.getUnboundOperationTypes();\n const reservedNames = unboundOps.map((op) => op.paramsModelName);\n const file = this.project.createOrGetMainModelFile(reservedNames);\n\n unboundOps.forEach((operation) => {\n this.generateOperationParams(file, operation);\n });\n }\n\n private generateOperationParams(file: FileHandler, operation: OperationType) {\n if (!operation.parameters.length) {\n return;\n }\n file.getFile().addInterface({\n name: operation.paramsModelName,\n isExported: true,\n properties: operation.parameters.map((p) => {\n return {\n name: p.name,\n type: this.getPropType(file.getImports(), p),\n hasQuestionToken: !p.required,\n };\n }),\n });\n }\n}\n"]}
|