@odata2ts/odata2ts 0.32.0 → 0.33.1

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 CHANGED
@@ -3,6 +3,22 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [0.33.1](https://github.com/odata2ts/odata2ts/compare/@odata2ts/odata2ts@0.33.0...@odata2ts/odata2ts@0.33.1) (2024-03-23)
7
+
8
+ **Note:** Version bump only for package @odata2ts/odata2ts
9
+
10
+ # [0.33.0](https://github.com/odata2ts/odata2ts/compare/@odata2ts/odata2ts@0.32.0...@odata2ts/odata2ts@0.33.0) (2024-03-17)
11
+
12
+ ### Bug Fixes
13
+
14
+ * **generator:** enumerate generated files for emit mode ts ([#249](https://github.com/odata2ts/odata2ts/issues/249)) ([e58e3d5](https://github.com/odata2ts/odata2ts/commit/e58e3d5c6a9f73ec8eb9c011b9b42747d0576fc4))
15
+
16
+ ### Features
17
+
18
+ * **generator:** auto detected service names are run through pascalCase to ensure valid class names ([#250](https://github.com/odata2ts/odata2ts/issues/250)) ([04fcf49](https://github.com/odata2ts/odata2ts/commit/04fcf490aee43dc1c2bc70af394fe9d1d8ce3249))
19
+ * **generator:** no collection services for entity types without keys ([#248](https://github.com/odata2ts/odata2ts/issues/248)) ([56540b2](https://github.com/odata2ts/odata2ts/commit/56540b22aa92a7a8c929b4088c69d8af30b63364))
20
+ * **generator:** support abstract entities ([#247](https://github.com/odata2ts/odata2ts/issues/247)) ([cbf5121](https://github.com/odata2ts/odata2ts/commit/cbf51214da0fdbccba7fff5a3c0b770f73ed06bd))
21
+
6
22
  # [0.32.0](https://github.com/odata2ts/odata2ts/compare/@odata2ts/odata2ts@0.31.1...@odata2ts/odata2ts@0.32.0) (2024-03-10)
7
23
 
8
24
  ### Bug Fixes
package/lib/app.js CHANGED
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.runApp = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const odata_core_1 = require("@odata2ts/odata-core");
6
+ const pascal_case_1 = require("pascal-case");
6
7
  const DataModelDigestionV2_1 = require("./data-model/DataModelDigestionV2");
7
8
  const DataModelDigestionV4_1 = require("./data-model/DataModelDigestionV4");
8
9
  const NamingHelper_1 = require("./data-model/NamingHelper");
@@ -15,6 +16,16 @@ function isQObjectGen(mode) {
15
16
  function isServiceGen(mode) {
16
17
  return [OptionModel_1.Modes.service, OptionModel_1.Modes.all].includes(mode);
17
18
  }
19
+ function getServiceName(options, schemas) {
20
+ if (options.serviceName) {
21
+ return options.serviceName;
22
+ }
23
+ // auto-detection of first namespace with defined EntityTypes
24
+ // NOTE: we make use of PascalCase here to enforce valid class names
25
+ const detectedSchema = schemas.find((schema) => { var _a; return schema.$.Namespace && ((_a = schema.EntityType) === null || _a === void 0 ? void 0 : _a.length); }) || schemas[0];
26
+ const serviceName = detectedSchema.$.Namespace;
27
+ return (0, pascal_case_1.pascalCase)(serviceName);
28
+ }
18
29
  /**
19
30
  *
20
31
  * @param metadataJson metadata of a given OData service already parsed as JSON
@@ -27,8 +38,7 @@ function runApp(metadataJson, options) {
27
38
  const version = edmxVersion === "1.0" ? odata_core_1.ODataVersions.V2 : odata_core_1.ODataVersions.V4;
28
39
  const dataService = metadataJson["edmx:Edmx"]["edmx:DataServices"][0];
29
40
  const schemas = dataService.Schema;
30
- const detectedSchema = schemas.find((schema) => { var _a; return schema.$.Namespace && ((_a = schema.EntityType) === null || _a === void 0 ? void 0 : _a.length); }) || schemas[0];
31
- const serviceName = options.serviceName || detectedSchema.$.Namespace;
41
+ const serviceName = getServiceName(options, schemas);
32
42
  const namespaces = schemas.map((schema) => [schema.$.Namespace, schema.$.Alias]);
33
43
  // encapsulate the whole naming logic
34
44
  const namingHelper = new NamingHelper_1.NamingHelper(options, serviceName, namespaces);
package/lib/app.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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","sourcesContent":["import { ODataVersions } from \"@odata2ts/odata-core\";\r\n\r\nimport { NamespaceWithAlias } from \"./data-model/DataModel\";\r\nimport { digest as digestV2 } from \"./data-model/DataModelDigestionV2\";\r\nimport { digest as digestV4 } from \"./data-model/DataModelDigestionV4\";\r\nimport { ODataEdmxModelBase, Schema } from \"./data-model/edmx/ODataEdmxModelBase\";\r\nimport { SchemaV3 } from \"./data-model/edmx/ODataEdmxModelV3\";\r\nimport { SchemaV4 } from \"./data-model/edmx/ODataEdmxModelV4\";\r\nimport { NamingHelper } from \"./data-model/NamingHelper\";\r\nimport { generateModels, generateQueryObjects, generateServices } from \"./generator\";\r\nimport { Modes, RunOptions } from \"./OptionModel\";\r\nimport { createProjectManager } from \"./project/ProjectManager\";\r\n\r\nfunction isQObjectGen(mode: Modes) {\r\n return [Modes.qobjects, Modes.service, Modes.all].includes(mode);\r\n}\r\n\r\nfunction isServiceGen(mode: Modes) {\r\n return [Modes.service, Modes.all].includes(mode);\r\n}\r\n\r\n/**\r\n *\r\n * @param metadataJson metadata of a given OData service already parsed as JSON\r\n * @param options further options\r\n */\r\nexport async function runApp(metadataJson: ODataEdmxModelBase<any>, options: RunOptions): Promise<void> {\r\n // determine edmx edmxVersion attribute\r\n const edmxVersion = metadataJson[\"edmx:Edmx\"].$.Version;\r\n const version = edmxVersion === \"1.0\" ? ODataVersions.V2 : ODataVersions.V4;\r\n\r\n const dataService = metadataJson[\"edmx:Edmx\"][\"edmx:DataServices\"][0];\r\n const schemas = dataService.Schema as Array<SchemaV3 | SchemaV4>;\r\n\r\n const detectedSchema = schemas.find((schema) => schema.$.Namespace && schema.EntityType?.length) || schemas[0];\r\n const serviceName = options.serviceName || detectedSchema.$.Namespace;\r\n\r\n const namespaces = schemas.map<NamespaceWithAlias>((schema) => [schema.$.Namespace, schema.$.Alias]);\r\n\r\n // encapsulate the whole naming logic\r\n const namingHelper = new NamingHelper(options, serviceName, namespaces);\r\n // parse model information from edmx into something we can really work with\r\n // => that stuff is called dataModel!\r\n const dataModel =\r\n version === ODataVersions.V2\r\n ? await digestV2(dataService.Schema as Array<SchemaV3>, options, namingHelper)\r\n : await digestV4(dataService.Schema as Array<SchemaV4>, options, namingHelper);\r\n\r\n // Validation of entity names: the same name might be used across different namespaces\r\n const validationErrors = dataModel.getNameValidation();\r\n if (validationErrors.size) {\r\n console.log(\"---\");\r\n validationErrors.forEach((errors, name) => {\r\n console.log(\r\n `Duplicate name: ${name} - Fully Qualified Names: ${errors\r\n .map((error) => error.fqName + (error.renamedTo ? ` (renamed to: ${error.renamedTo})` : \"\"))\r\n .join(\", \")}`\r\n );\r\n });\r\n\r\n if (options.disableAutomaticNameClashResolution) {\r\n throw new Error(\"Name validation failed: Multiple entities have the same name across different namespaces!\");\r\n }\r\n }\r\n\r\n // handling the overall generation project\r\n const project = await createProjectManager(\r\n namingHelper.getFileNames(),\r\n options.output,\r\n options.emitMode,\r\n options.prettier,\r\n options.tsconfig\r\n );\r\n\r\n // Generate Model Interfaces\r\n // supported edmx types: EntityType, ComplexType, EnumType\r\n const modelsFile = await project.createModelFile();\r\n generateModels(dataModel, modelsFile, version, options, namingHelper);\r\n\r\n // Generate Query Objects\r\n // supported edmx types: EntityType, ComplexType\r\n // supported edmx prop types: primitive types, enum types, primitive collection (incl enum types), entity collection, entity object, complex object\r\n if (isQObjectGen(options.mode)) {\r\n const qFile = await project.createQObjectFile();\r\n generateQueryObjects(dataModel, qFile, version, options, namingHelper);\r\n }\r\n\r\n // Generate Individual OData-Service\r\n if (isServiceGen(options.mode)) {\r\n await generateServices(dataModel, project, version, namingHelper, options);\r\n }\r\n\r\n await project.writeFiles();\r\n}\r\n"]}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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","sourcesContent":["import { ODataVersions } from \"@odata2ts/odata-core\";\r\nimport { pascalCase } from \"pascal-case\";\r\n\r\nimport { NamespaceWithAlias } from \"./data-model/DataModel\";\r\nimport { digest as digestV2 } from \"./data-model/DataModelDigestionV2\";\r\nimport { digest as digestV4 } from \"./data-model/DataModelDigestionV4\";\r\nimport { ODataEdmxModelBase, Schema } from \"./data-model/edmx/ODataEdmxModelBase\";\r\nimport { SchemaV3 } from \"./data-model/edmx/ODataEdmxModelV3\";\r\nimport { SchemaV4 } from \"./data-model/edmx/ODataEdmxModelV4\";\r\nimport { NamingHelper } from \"./data-model/NamingHelper\";\r\nimport { generateModels, generateQueryObjects, generateServices } from \"./generator\";\r\nimport { Modes, RunOptions } from \"./OptionModel\";\r\nimport { createProjectManager } from \"./project/ProjectManager\";\r\n\r\nfunction isQObjectGen(mode: Modes) {\r\n return [Modes.qobjects, Modes.service, Modes.all].includes(mode);\r\n}\r\n\r\nfunction isServiceGen(mode: Modes) {\r\n return [Modes.service, Modes.all].includes(mode);\r\n}\r\n\r\nfunction getServiceName(options: RunOptions, schemas: Array<SchemaV3 | SchemaV4>) {\r\n if (options.serviceName) {\r\n return options.serviceName;\r\n }\r\n\r\n // auto-detection of first namespace with defined EntityTypes\r\n // NOTE: we make use of PascalCase here to enforce valid class names\r\n const detectedSchema = schemas.find((schema) => schema.$.Namespace && schema.EntityType?.length) || schemas[0];\r\n const serviceName = detectedSchema.$.Namespace;\r\n return pascalCase(serviceName);\r\n}\r\n\r\n/**\r\n *\r\n * @param metadataJson metadata of a given OData service already parsed as JSON\r\n * @param options further options\r\n */\r\nexport async function runApp(metadataJson: ODataEdmxModelBase<any>, options: RunOptions): Promise<void> {\r\n // determine edmx edmxVersion attribute\r\n const edmxVersion = metadataJson[\"edmx:Edmx\"].$.Version;\r\n const version = edmxVersion === \"1.0\" ? ODataVersions.V2 : ODataVersions.V4;\r\n\r\n const dataService = metadataJson[\"edmx:Edmx\"][\"edmx:DataServices\"][0];\r\n const schemas = dataService.Schema as Array<SchemaV3 | SchemaV4>;\r\n\r\n const serviceName = getServiceName(options, schemas);\r\n\r\n const namespaces = schemas.map<NamespaceWithAlias>((schema) => [schema.$.Namespace, schema.$.Alias]);\r\n\r\n // encapsulate the whole naming logic\r\n const namingHelper = new NamingHelper(options, serviceName, namespaces);\r\n // parse model information from edmx into something we can really work with\r\n // => that stuff is called dataModel!\r\n const dataModel =\r\n version === ODataVersions.V2\r\n ? await digestV2(dataService.Schema as Array<SchemaV3>, options, namingHelper)\r\n : await digestV4(dataService.Schema as Array<SchemaV4>, options, namingHelper);\r\n\r\n // Validation of entity names: the same name might be used across different namespaces\r\n const validationErrors = dataModel.getNameValidation();\r\n if (validationErrors.size) {\r\n console.log(\"---\");\r\n validationErrors.forEach((errors, name) => {\r\n console.log(\r\n `Duplicate name: ${name} - Fully Qualified Names: ${errors\r\n .map((error) => error.fqName + (error.renamedTo ? ` (renamed to: ${error.renamedTo})` : \"\"))\r\n .join(\", \")}`\r\n );\r\n });\r\n\r\n if (options.disableAutomaticNameClashResolution) {\r\n throw new Error(\"Name validation failed: Multiple entities have the same name across different namespaces!\");\r\n }\r\n }\r\n\r\n // handling the overall generation project\r\n const project = await createProjectManager(\r\n namingHelper.getFileNames(),\r\n options.output,\r\n options.emitMode,\r\n options.prettier,\r\n options.tsconfig\r\n );\r\n\r\n // Generate Model Interfaces\r\n // supported edmx types: EntityType, ComplexType, EnumType\r\n const modelsFile = await project.createModelFile();\r\n generateModels(dataModel, modelsFile, version, options, namingHelper);\r\n\r\n // Generate Query Objects\r\n // supported edmx types: EntityType, ComplexType\r\n // supported edmx prop types: primitive types, enum types, primitive collection (incl enum types), entity collection, entity object, complex object\r\n if (isQObjectGen(options.mode)) {\r\n const qFile = await project.createQObjectFile();\r\n generateQueryObjects(dataModel, qFile, version, options, namingHelper);\r\n }\r\n\r\n // Generate Individual OData-Service\r\n if (isServiceGen(options.mode)) {\r\n await generateServices(dataModel, project, version, namingHelper, options);\r\n }\r\n\r\n await project.writeFiles();\r\n}\r\n"]}
@@ -46,6 +46,7 @@ export declare abstract class Digester<S extends Schema<ET, CT>, ET extends Enti
46
46
  private addComplexType;
47
47
  private addEntityType;
48
48
  private postProcessModel;
49
+ private postProcessKeys;
49
50
  private collectBaseClassPropsAndKeys;
50
51
  protected mapProp: (p: Property, entityPropConfig?: PropertyGenerationOptions | undefined) => PropertyModel;
51
52
  }
@@ -5,6 +5,12 @@ const tslib_1 = require("tslib");
5
5
  const DataModel_1 = require("./DataModel");
6
6
  const ServiceConfigHelper_1 = require("./ServiceConfigHelper");
7
7
  const NameValidator_1 = require("./validation/NameValidator");
8
+ function ifTrue(value) {
9
+ return value === "true";
10
+ }
11
+ function ifFalse(value) {
12
+ return value === "false";
13
+ }
8
14
  class Digester {
9
15
  constructor(version, schemas, options, namingHelper, converters) {
10
16
  this.version = version;
@@ -82,7 +88,7 @@ class Digester {
82
88
  else {
83
89
  throw new Error(`Unknown type [${dataType}]: Not 'Collection(...)', not OData type 'Edm.*', not starting with one of the namespaces!W`);
84
90
  }
85
- return Object.assign({ odataName: p.$.Name, name, odataType: p.$.Type, fqType: dataType, required: p.$.Nullable === "false", isCollection: isCollection, managed: typeof (entityPropConfig === null || entityPropConfig === void 0 ? void 0 : entityPropConfig.managed) !== "undefined" ? entityPropConfig.managed : configProp === null || configProp === void 0 ? void 0 : configProp.managed }, result);
91
+ return Object.assign({ odataName: p.$.Name, name, odataType: p.$.Type, fqType: dataType, required: ifFalse(p.$.Nullable), isCollection: isCollection, managed: typeof (entityPropConfig === null || entityPropConfig === void 0 ? void 0 : entityPropConfig.managed) !== "undefined" ? entityPropConfig.managed : configProp === null || configProp === void 0 ? void 0 : configProp.managed }, result);
86
92
  };
87
93
  const namespaces = schemas.map((s) => [s.$.Namespace, s.$.Alias]);
88
94
  this.dataModel = new DataModel_1.DataModel(namespaces, version, converters);
@@ -135,6 +141,7 @@ class Digester {
135
141
  this.digestOperations(schema);
136
142
  });
137
143
  this.postProcessModel();
144
+ this.postProcessKeys();
138
145
  }
139
146
  getBaseModel(entityConfig, model, name, fqName) {
140
147
  var _a, _b;
@@ -164,7 +171,9 @@ class Digester {
164
171
  baseClasses,
165
172
  finalBaseClass,
166
173
  props,
167
- baseProps: [], // postprocess required
174
+ baseProps: [],
175
+ abstract: ifTrue(model.$.Abstract),
176
+ open: ifTrue(model.$.OpenType),
168
177
  };
169
178
  }
170
179
  addTypeDefinition(ns, types) {
@@ -227,31 +236,40 @@ class Digester {
227
236
  keyNames.push(...propNames);
228
237
  }
229
238
  }
230
- this.dataModel.addEntityType(namespace[0], baseModel.odataName, Object.assign(Object.assign({}, baseModel), { idModelName: this.namingHelper.getIdModelName(name), qIdFunctionName: this.namingHelper.getQIdFunctionName(name), generateId: true, keyNames: keyNames, keys: [], getKeyUnion: () => keyNames.join(" | ") }));
239
+ this.dataModel.addEntityType(namespace[0], baseModel.odataName, Object.assign(Object.assign({}, baseModel), { idModelName: this.namingHelper.getIdModelName(name), qIdFunctionName: this.namingHelper.getQIdFunctionName(name), generateId: !!keyNames.length, keyNames: keyNames, keys: [], getKeyUnion: () => keyNames.join(" | ") }));
231
240
  }
232
241
  }
233
242
  postProcessModel() {
234
243
  // complex types
235
244
  const complexTypes = this.dataModel.getComplexTypes();
236
245
  complexTypes.forEach((ct) => {
237
- const [baseProps] = this.collectBaseClassPropsAndKeys(ct, []);
238
- ct.baseProps = baseProps;
246
+ const [baseProps, _, baseAttributes] = this.collectBaseClassPropsAndKeys(ct, []);
247
+ const { open } = baseAttributes;
248
+ ct.baseProps = baseProps.map((bp) => (Object.assign({}, bp)));
249
+ if (open) {
250
+ ct.open = true;
251
+ }
239
252
  });
240
253
  // entity types
241
254
  const entityTypes = this.dataModel.getEntityTypes();
242
255
  entityTypes.forEach((et) => {
243
- const [baseProps, baseKeys, idName, qIdName] = this.collectBaseClassPropsAndKeys(et, []);
244
- et.baseProps = baseProps;
256
+ const [baseProps, baseKeys, baseAttributes] = this.collectBaseClassPropsAndKeys(et, []);
257
+ const { idName, qIdName, open } = baseAttributes;
258
+ et.baseProps = baseProps.map((bp) => (Object.assign({}, bp)));
245
259
  if (!et.keyNames.length && idName) {
246
260
  et.idModelName = idName;
247
261
  et.qIdFunctionName = qIdName;
248
262
  et.generateId = false;
249
263
  }
250
- et.keyNames.unshift(...baseKeys);
251
- // sanity check: entity types require key specification
252
- if (!et.keyNames.length) {
253
- throw new Error(`Key property is missing from Entity "${et.name}" (${et.odataName})!`);
264
+ if (open) {
265
+ et.open = open;
254
266
  }
267
+ et.keyNames.unshift(...baseKeys);
268
+ });
269
+ }
270
+ postProcessKeys() {
271
+ const entityTypes = this.dataModel.getEntityTypes();
272
+ entityTypes.forEach((et) => {
255
273
  const isSingleKey = et.keyNames.length === 1;
256
274
  const props = [...et.baseProps, ...et.props];
257
275
  et.keys = et.keyNames.map((keyName) => {
@@ -272,33 +290,38 @@ class Digester {
272
290
  throw new Error(`Cyclic inheritance detected for model ${model.fqName}!`);
273
291
  }
274
292
  visitedModels.push(model.fqName);
275
- return model.baseClasses.reduce(([props, keys, idName, qIdName], bc) => {
293
+ return model.baseClasses.reduce(([props, keys, attributes], bc) => {
276
294
  var _a;
277
295
  const baseModel = this.dataModel.getEntityType(bc) || this.dataModel.getComplexType(bc);
278
296
  if (!baseModel) {
279
297
  throw new Error(`BaseModel "${bc}" doesn't exist!`);
280
298
  }
281
- let idNameResult = idName;
282
- let qIdNameResult = qIdName;
299
+ let { idName, qIdName, open } = attributes;
283
300
  // recursive
284
301
  if (baseModel.baseClasses.length) {
285
- const [parentProps, parentKeys, parentIdName, parentQIdName] = this.collectBaseClassPropsAndKeys(baseModel, visitedModels);
302
+ const [parentProps, parentKeys, parentAttributes] = this.collectBaseClassPropsAndKeys(baseModel, visitedModels);
286
303
  props.unshift(...parentProps);
287
304
  keys.unshift(...parentKeys);
288
- if (parentIdName) {
289
- idNameResult = parentIdName;
290
- qIdNameResult = parentQIdName;
305
+ if (parentAttributes === null || parentAttributes === void 0 ? void 0 : parentAttributes.idName) {
306
+ idName = parentAttributes.idName;
307
+ qIdName = parentAttributes.qIdName;
308
+ }
309
+ if (parentAttributes === null || parentAttributes === void 0 ? void 0 : parentAttributes.open) {
310
+ open = true;
291
311
  }
292
312
  }
293
313
  props.push(...baseModel.props);
294
314
  const entityModel = baseModel;
295
315
  if ((_a = entityModel.keyNames) === null || _a === void 0 ? void 0 : _a.length) {
296
316
  keys.push(...entityModel.keyNames.filter((kn) => !keys.includes(kn)));
297
- idNameResult = entityModel.idModelName;
298
- qIdNameResult = entityModel.qIdFunctionName;
317
+ idName = entityModel.idModelName;
318
+ qIdName = entityModel.qIdFunctionName;
319
+ }
320
+ if (baseModel.open) {
321
+ open = true;
299
322
  }
300
- return [props, keys, idNameResult, qIdNameResult];
301
- }, [[], [], "", ""]);
323
+ return [props, keys, { idName, qIdName, open }];
324
+ }, [[], [], { idName: "", qIdName: "", open: false }]);
302
325
  }
303
326
  }
304
327
  exports.Digester = Digester;
@@ -1 +1 @@
1
- {"version":3,"file":"DataModelDigestion.js","sourceRoot":"","sources":["../../src/data-model/DataModelDigestion.ts"],"names":[],"mappings":"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","sourcesContent":["import { MappedConverterChains } from \"@odata2ts/converter-runtime\";\n\nimport { DigestionOptions } from \"../FactoryFunctionModel\";\nimport { ComplexTypeGenerationOptions, EntityTypeGenerationOptions, PropertyGenerationOptions } from \"../OptionModel\";\nimport { DataModel, NamespaceWithAlias, withNamespace } from \"./DataModel\";\nimport { ComplexType as ComplexModelType, DataTypes, ModelType, ODataVersion, PropertyModel } from \"./DataTypeModel\";\nimport { ComplexType, EntityType, EnumType, Property, Schema, TypeDefinition } from \"./edmx/ODataEdmxModelBase\";\nimport { SchemaV3 } from \"./edmx/ODataEdmxModelV3\";\nimport { SchemaV4 } from \"./edmx/ODataEdmxModelV4\";\nimport { NamingHelper } from \"./NamingHelper\";\nimport { ServiceConfigHelper, WithoutName } from \"./ServiceConfigHelper\";\nimport { NameValidator } from \"./validation/NameValidator\";\n\nexport interface TypeModel {\n outputType: string;\n qPath: string;\n qCollection: string;\n qParam: string | undefined;\n}\n\nexport abstract class Digester<S extends Schema<ET, CT>, ET extends EntityType, CT extends ComplexType> {\n protected static EDM_PREFIX = \"Edm.\";\n\n protected readonly dataModel: DataModel;\n protected readonly serviceConfigHelper: ServiceConfigHelper;\n protected readonly nameValidator: NameValidator;\n\n private model2Type = new Map<string, DataTypes>();\n\n protected constructor(\n protected version: ODataVersion,\n protected schemas: Array<S>,\n protected options: DigestionOptions,\n protected namingHelper: NamingHelper,\n converters?: MappedConverterChains\n ) {\n const namespaces = schemas.map<NamespaceWithAlias>((s) => [s.$.Namespace, s.$.Alias]);\n this.dataModel = new DataModel(namespaces, version, converters);\n this.serviceConfigHelper = new ServiceConfigHelper(options);\n this.nameValidator = new NameValidator(options);\n\n this.collectModelTypes(schemas);\n }\n\n private collectModelTypes(schemas: Array<S>) {\n schemas.forEach((schema) => {\n const { Namespace: ns, Alias: alias } = schema.$;\n\n schema.EnumType?.forEach((et) => {\n this.addModel2Type(ns, alias, et.$.Name, DataTypes.EnumType);\n });\n schema.ComplexType?.forEach((ct) => {\n this.addModel2Type(ns, alias, ct.$.Name, DataTypes.ComplexType);\n });\n schema.EntityType?.forEach((et) => {\n this.addModel2Type(ns, alias, et.$.Name, DataTypes.ModelType);\n });\n });\n }\n\n private addModel2Type(ns: string, alias: string | undefined, name: string, dt: DataTypes) {\n this.model2Type.set(withNamespace(ns, name), dt);\n if (alias) {\n this.model2Type.set(withNamespace(alias, name), dt);\n }\n }\n\n protected abstract getNavigationProps(entityType: ET | ComplexType): Array<Property>;\n\n protected abstract digestOperations(schema: SchemaV3 | SchemaV4): void;\n\n protected abstract digestEntityContainer(schema: SchemaV3 | SchemaV4): void;\n\n /**\n * Get essential infos about a given odata type from the version specific service variants.\n *\n * @param type\n * @return tuple of return type, query object, query collection object\n */\n protected abstract mapODataType(type: string): TypeModel;\n\n public async digest(): Promise<DataModel> {\n this.digestEntityTypesAndOperations();\n\n // delegate to version specific entity container digestion\n this.schemas.forEach((schema) => this.digestEntityContainer(schema));\n\n this.dataModel.setNameValidation(this.nameValidator.validate());\n return this.dataModel;\n }\n\n private digestEntityTypesAndOperations() {\n this.schemas.forEach((schema) => {\n const ns: NamespaceWithAlias = [schema.$.Namespace, schema.$.Alias];\n\n // type definitions: alias for primitive types\n this.addTypeDefinition(schema.$.Namespace, schema.TypeDefinition);\n\n // enums\n this.addEnum(ns, schema.EnumType);\n\n // complex types\n this.addComplexType(ns, schema.ComplexType);\n\n // entity types\n this.addEntityType(ns, schema.EntityType);\n\n // V4 only: function & action types\n this.digestOperations(schema);\n });\n\n this.postProcessModel();\n }\n\n private getBaseModel(\n entityConfig: WithoutName<EntityTypeGenerationOptions | ComplexTypeGenerationOptions> | undefined,\n model: ComplexType,\n name: string,\n fqName: string\n ) {\n const odataName = model.$.Name;\n\n // map properties respecting the config\n const props = [...(model.Property ?? []), ...this.getNavigationProps(model)].map((p) => {\n const epConfig = entityConfig?.properties?.find((ep) => ep.name === p.$.Name);\n return this.mapProp(p, epConfig);\n });\n\n // support for base types, i.e. extends clause of interfaces\n const baseClasses = [];\n let finalBaseClass: string | undefined = undefined;\n if (model.$.BaseType) {\n baseClasses.push(model.$.BaseType);\n const [baseName, basePrefix] = this.namingHelper.getNameAndServicePrefix(model.$.BaseType);\n const baseConfig =\n this.serviceConfigHelper.findEntityTypeConfig([basePrefix!], baseName) ||\n this.serviceConfigHelper.findComplexTypeConfig([basePrefix!], baseName);\n finalBaseClass = baseConfig?.mappedName ?? baseName;\n }\n\n return {\n fqName,\n odataName,\n name: this.namingHelper.getModelName(name),\n qName: this.namingHelper.getQName(name),\n editableName: this.namingHelper.getEditableModelName(name),\n baseClasses,\n finalBaseClass,\n props,\n baseProps: [], // postprocess required\n };\n }\n\n private addTypeDefinition(ns: string, types: Array<TypeDefinition> | undefined) {\n if (!types || !types.length) {\n return;\n }\n\n for (const t of types) {\n this.dataModel.addTypeDefinition(ns, t.$.Name, t.$.UnderlyingType);\n }\n }\n\n private addEnum(namespace: NamespaceWithAlias, models: Array<EnumType> | undefined) {\n if (!models || !models.length) {\n return;\n }\n\n for (const et of models) {\n const odataName = et.$.Name;\n const fqName = withNamespace(namespace[0], odataName);\n const config = this.serviceConfigHelper.findEnumTypeConfig(namespace, odataName);\n const enumName = this.nameValidator.addEnumType(fqName, config?.mappedName || odataName);\n\n this.dataModel.addEnum(namespace[0], odataName, {\n fqName,\n odataName,\n name: this.namingHelper.getEnumName(enumName),\n members: et.Member.map((m) => m.$.Name),\n });\n }\n }\n\n private addComplexType(namespace: NamespaceWithAlias, models: Array<ComplexType> | undefined) {\n if (!models || !models.length) {\n return;\n }\n\n for (const model of models) {\n const config = this.serviceConfigHelper.findComplexTypeConfig(namespace, model.$.Name);\n const fqName = withNamespace(namespace[0], model.$.Name);\n const name = this.nameValidator.addComplexType(fqName, config?.mappedName || model.$.Name);\n const baseModel = this.getBaseModel(config, model, name, fqName);\n this.dataModel.addComplexType(namespace[0], baseModel.odataName, baseModel);\n }\n }\n\n private addEntityType(namespace: NamespaceWithAlias, models: Array<ET> | undefined) {\n if (!models || !models.length) {\n return;\n }\n\n for (const model of models) {\n const entityConfig = this.serviceConfigHelper.findEntityTypeConfig(namespace, model.$.Name);\n const fqName = withNamespace(namespace[0], model.$.Name);\n const name = this.nameValidator.addEntityType(fqName, entityConfig?.mappedName || model.$.Name);\n const baseModel = this.getBaseModel(entityConfig, model, name, fqName);\n\n // key support: we add keys from this entity,\n // but not keys stemming from base classes (postprocess required)\n const keyNames: Array<string> = [];\n if (entityConfig?.keys?.length) {\n keyNames.push(...entityConfig.keys);\n } else {\n const entity = model as EntityType;\n if (entity.Key && entity.Key.length && entity.Key[0].PropertyRef.length) {\n const propNames = entity.Key[0].PropertyRef.map((key) => key.$.Name);\n keyNames.push(...propNames);\n }\n }\n\n this.dataModel.addEntityType(namespace[0], baseModel.odataName, {\n ...baseModel,\n idModelName: this.namingHelper.getIdModelName(name),\n qIdFunctionName: this.namingHelper.getQIdFunctionName(name),\n generateId: true,\n keyNames: keyNames, // postprocess required to include key specs from base classes\n keys: [], // postprocess required to include props from base classes\n getKeyUnion: () => keyNames.join(\" | \"),\n });\n }\n }\n\n private postProcessModel() {\n // complex types\n const complexTypes = this.dataModel.getComplexTypes();\n complexTypes.forEach((ct) => {\n const [baseProps] = this.collectBaseClassPropsAndKeys(ct, []);\n ct.baseProps = baseProps;\n });\n // entity types\n const entityTypes = this.dataModel.getEntityTypes();\n entityTypes.forEach((et) => {\n const [baseProps, baseKeys, idName, qIdName] = this.collectBaseClassPropsAndKeys(et, []);\n et.baseProps = baseProps;\n\n if (!et.keyNames.length && idName) {\n et.idModelName = idName;\n et.qIdFunctionName = qIdName;\n et.generateId = false;\n }\n et.keyNames.unshift(...baseKeys);\n\n // sanity check: entity types require key specification\n if (!et.keyNames.length) {\n throw new Error(`Key property is missing from Entity \"${et.name}\" (${et.odataName})!`);\n }\n\n const isSingleKey = et.keyNames.length === 1;\n const props = [...et.baseProps, ...et.props];\n et.keys = et.keyNames.map((keyName) => {\n const prop = props.find((p) => p.odataName === keyName);\n if (!prop) {\n throw new Error(`Key with name [${keyName}] not found in props!`);\n }\n // automatically set key prop to managed, if this is the only key of the given entity\n if (prop.managed === undefined) {\n prop.managed = !this.options.disableAutoManagedKey && isSingleKey;\n }\n return prop;\n });\n });\n }\n\n private collectBaseClassPropsAndKeys(\n model: ComplexModelType,\n visitedModels: string[]\n ): [Array<PropertyModel>, Array<string>, string, string] {\n if (visitedModels.includes(model.fqName)) {\n throw new Error(`Cyclic inheritance detected for model ${model.fqName}!`);\n }\n visitedModels.push(model.fqName);\n return model.baseClasses.reduce(\n ([props, keys, idName, qIdName], bc) => {\n const baseModel = this.dataModel.getEntityType(bc) || this.dataModel.getComplexType(bc);\n if (!baseModel) {\n throw new Error(`BaseModel \"${bc}\" doesn't exist!`);\n }\n\n let idNameResult = idName;\n let qIdNameResult = qIdName;\n\n // recursive\n if (baseModel.baseClasses.length) {\n const [parentProps, parentKeys, parentIdName, parentQIdName] = this.collectBaseClassPropsAndKeys(\n baseModel,\n visitedModels\n );\n props.unshift(...parentProps);\n keys.unshift(...parentKeys);\n if (parentIdName) {\n idNameResult = parentIdName;\n qIdNameResult = parentQIdName;\n }\n }\n\n props.push(...baseModel.props);\n const entityModel = baseModel as ModelType;\n if (entityModel.keyNames?.length) {\n keys.push(...entityModel.keyNames.filter((kn) => !keys.includes(kn)));\n idNameResult = entityModel.idModelName;\n qIdNameResult = entityModel.qIdFunctionName;\n }\n return [props, keys, idNameResult, qIdNameResult];\n },\n [[], [], \"\", \"\"] as [Array<PropertyModel>, Array<string>, string, string]\n );\n }\n\n protected mapProp = (p: Property, entityPropConfig?: PropertyGenerationOptions | undefined): PropertyModel => {\n if (!p.$.Type) {\n throw new Error(`No type information given for property [${p.$.Name}]!`);\n }\n\n const configProp = this.serviceConfigHelper.findPropConfigByName(p.$.Name);\n const name = this.namingHelper.getModelPropName(entityPropConfig?.mappedName || configProp?.mappedName || p.$.Name);\n const isCollection = !!p.$.Type.match(/^Collection\\(/);\n let dataType = p.$.Type.replace(/^Collection\\(([^\\)]+)\\)/, \"$1\");\n\n // support for primitive type mapping\n if (this.namingHelper.includesServicePrefix(dataType)) {\n const dt = this.dataModel.getPrimitiveType(dataType);\n if (dt !== undefined) {\n dataType = dt;\n }\n }\n\n let result: Pick<PropertyModel, \"dataType\" | \"type\" | \"typeModule\" | \"qPath\" | \"qParam\" | \"qObject\" | \"converters\">;\n\n // domain object known from service:\n // EntityType, ComplexType, EnumType\n if (this.namingHelper.includesServicePrefix(dataType)) {\n const resultDt = this.model2Type.get(dataType)!;\n const [dataTypeName, dataTypePrefix] = this.namingHelper.getNameAndServicePrefix(dataType);\n const dataTypeNamespace: NamespaceWithAlias = [dataTypePrefix!];\n if (!resultDt) {\n throw new Error(\n `Couldn't determine model data type for property \"${p.$.Name}\"! Given data type: \"${dataType}\".`\n );\n }\n\n // special handling for enums\n if (resultDt === DataTypes.EnumType) {\n const enumConfig = this.serviceConfigHelper.findEnumTypeConfig(dataTypeNamespace, dataTypeName);\n result = {\n dataType: resultDt,\n type: this.namingHelper.getEnumName(enumConfig?.mappedName ?? dataType),\n qPath: \"QEnumPath\",\n qObject: isCollection ? \"QEnumCollection\" : undefined,\n qParam: \"QEnumParam\",\n };\n }\n // handling of complex & entity types\n else {\n const entityConfig =\n resultDt === DataTypes.ComplexType\n ? this.serviceConfigHelper.findComplexTypeConfig(dataTypeNamespace, dataTypeName)\n : this.serviceConfigHelper.findEntityTypeConfig(dataTypeNamespace, dataTypeName);\n const resultDataType = entityConfig?.mappedName ?? dataType;\n result = {\n dataType: resultDt,\n type: this.namingHelper.getModelName(resultDataType),\n qPath: \"QEntityPath\",\n qObject: this.namingHelper.getQName(resultDataType),\n qParam: \"QComplexParam\",\n };\n }\n }\n // OData built-in data types\n else if (dataType.startsWith(Digester.EDM_PREFIX)) {\n const { outputType, qPath, qParam, qCollection } = this.mapODataType(dataType);\n const { to, toModule: typeModule, converters } = this.dataModel.getConverter(dataType) || {};\n\n const type = !to ? outputType : to.startsWith(Digester.EDM_PREFIX) ? this.mapODataType(to).outputType : to;\n\n result = {\n dataType: DataTypes.PrimitiveType,\n type,\n typeModule,\n qPath,\n qParam,\n qObject: isCollection ? qCollection : undefined,\n converters,\n };\n } else {\n throw new Error(\n `Unknown type [${dataType}]: Not 'Collection(...)', not OData type 'Edm.*', not starting with one of the namespaces!W`\n );\n }\n\n return {\n odataName: p.$.Name,\n name,\n odataType: p.$.Type,\n fqType: dataType,\n required: p.$.Nullable === \"false\",\n isCollection: isCollection,\n managed: typeof entityPropConfig?.managed !== \"undefined\" ? entityPropConfig.managed : configProp?.managed,\n ...result,\n };\n };\n}\n"]}
1
+ {"version":3,"file":"DataModelDigestion.js","sourceRoot":"","sources":["../../src/data-model/DataModelDigestion.ts"],"names":[],"mappings":"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","sourcesContent":["import { MappedConverterChains } from \"@odata2ts/converter-runtime\";\n\nimport { DigestionOptions } from \"../FactoryFunctionModel\";\nimport { ComplexTypeGenerationOptions, EntityTypeGenerationOptions, PropertyGenerationOptions } from \"../OptionModel\";\nimport { DataModel, NamespaceWithAlias, withNamespace } from \"./DataModel\";\nimport { ComplexType as ComplexModelType, DataTypes, ModelType, ODataVersion, PropertyModel } from \"./DataTypeModel\";\nimport { ComplexType, EntityType, EnumType, Property, Schema, TypeDefinition } from \"./edmx/ODataEdmxModelBase\";\nimport { SchemaV3 } from \"./edmx/ODataEdmxModelV3\";\nimport { SchemaV4 } from \"./edmx/ODataEdmxModelV4\";\nimport { NamingHelper } from \"./NamingHelper\";\nimport { ServiceConfigHelper, WithoutName } from \"./ServiceConfigHelper\";\nimport { NameValidator } from \"./validation/NameValidator\";\n\ntype CollectorTuple = [Array<PropertyModel>, Array<string>, { idName: string; qIdName: string; open: boolean }];\n\nfunction ifTrue(value: string | undefined): boolean {\n return value === \"true\";\n}\n\nfunction ifFalse(value: string | undefined): boolean {\n return value === \"false\";\n}\n\nexport interface TypeModel {\n outputType: string;\n qPath: string;\n qCollection: string;\n qParam: string | undefined;\n}\n\nexport abstract class Digester<S extends Schema<ET, CT>, ET extends EntityType, CT extends ComplexType> {\n protected static EDM_PREFIX = \"Edm.\";\n\n protected readonly dataModel: DataModel;\n protected readonly serviceConfigHelper: ServiceConfigHelper;\n protected readonly nameValidator: NameValidator;\n\n private model2Type = new Map<string, DataTypes>();\n\n protected constructor(\n protected version: ODataVersion,\n protected schemas: Array<S>,\n protected options: DigestionOptions,\n protected namingHelper: NamingHelper,\n converters?: MappedConverterChains\n ) {\n const namespaces = schemas.map<NamespaceWithAlias>((s) => [s.$.Namespace, s.$.Alias]);\n this.dataModel = new DataModel(namespaces, version, converters);\n this.serviceConfigHelper = new ServiceConfigHelper(options);\n this.nameValidator = new NameValidator(options);\n\n this.collectModelTypes(schemas);\n }\n\n private collectModelTypes(schemas: Array<S>) {\n schemas.forEach((schema) => {\n const { Namespace: ns, Alias: alias } = schema.$;\n\n schema.EnumType?.forEach((et) => {\n this.addModel2Type(ns, alias, et.$.Name, DataTypes.EnumType);\n });\n schema.ComplexType?.forEach((ct) => {\n this.addModel2Type(ns, alias, ct.$.Name, DataTypes.ComplexType);\n });\n schema.EntityType?.forEach((et) => {\n this.addModel2Type(ns, alias, et.$.Name, DataTypes.ModelType);\n });\n });\n }\n\n private addModel2Type(ns: string, alias: string | undefined, name: string, dt: DataTypes) {\n this.model2Type.set(withNamespace(ns, name), dt);\n if (alias) {\n this.model2Type.set(withNamespace(alias, name), dt);\n }\n }\n\n protected abstract getNavigationProps(entityType: ET | ComplexType): Array<Property>;\n\n protected abstract digestOperations(schema: SchemaV3 | SchemaV4): void;\n\n protected abstract digestEntityContainer(schema: SchemaV3 | SchemaV4): void;\n\n /**\n * Get essential infos about a given odata type from the version specific service variants.\n *\n * @param type\n * @return tuple of return type, query object, query collection object\n */\n protected abstract mapODataType(type: string): TypeModel;\n\n public async digest(): Promise<DataModel> {\n this.digestEntityTypesAndOperations();\n\n // delegate to version specific entity container digestion\n this.schemas.forEach((schema) => this.digestEntityContainer(schema));\n\n this.dataModel.setNameValidation(this.nameValidator.validate());\n return this.dataModel;\n }\n\n private digestEntityTypesAndOperations() {\n this.schemas.forEach((schema) => {\n const ns: NamespaceWithAlias = [schema.$.Namespace, schema.$.Alias];\n\n // type definitions: alias for primitive types\n this.addTypeDefinition(schema.$.Namespace, schema.TypeDefinition);\n\n // enums\n this.addEnum(ns, schema.EnumType);\n\n // complex types\n this.addComplexType(ns, schema.ComplexType);\n\n // entity types\n this.addEntityType(ns, schema.EntityType);\n\n // V4 only: function & action types\n this.digestOperations(schema);\n });\n\n this.postProcessModel();\n this.postProcessKeys();\n }\n\n private getBaseModel(\n entityConfig: WithoutName<EntityTypeGenerationOptions | ComplexTypeGenerationOptions> | undefined,\n model: ComplexType,\n name: string,\n fqName: string\n ) {\n const odataName = model.$.Name;\n\n // map properties respecting the config\n const props = [...(model.Property ?? []), ...this.getNavigationProps(model)].map((p) => {\n const epConfig = entityConfig?.properties?.find((ep) => ep.name === p.$.Name);\n return this.mapProp(p, epConfig);\n });\n\n // support for base types, i.e. extends clause of interfaces\n const baseClasses = [];\n let finalBaseClass: string | undefined = undefined;\n if (model.$.BaseType) {\n baseClasses.push(model.$.BaseType);\n const [baseName, basePrefix] = this.namingHelper.getNameAndServicePrefix(model.$.BaseType);\n const baseConfig =\n this.serviceConfigHelper.findEntityTypeConfig([basePrefix!], baseName) ||\n this.serviceConfigHelper.findComplexTypeConfig([basePrefix!], baseName);\n finalBaseClass = baseConfig?.mappedName ?? baseName;\n }\n\n return {\n fqName,\n odataName,\n name: this.namingHelper.getModelName(name),\n qName: this.namingHelper.getQName(name),\n editableName: this.namingHelper.getEditableModelName(name),\n baseClasses,\n finalBaseClass,\n props,\n baseProps: [], // postprocess required\n abstract: ifTrue(model.$.Abstract),\n open: ifTrue(model.$.OpenType),\n };\n }\n\n private addTypeDefinition(ns: string, types: Array<TypeDefinition> | undefined) {\n if (!types || !types.length) {\n return;\n }\n\n for (const t of types) {\n this.dataModel.addTypeDefinition(ns, t.$.Name, t.$.UnderlyingType);\n }\n }\n\n private addEnum(namespace: NamespaceWithAlias, models: Array<EnumType> | undefined) {\n if (!models || !models.length) {\n return;\n }\n\n for (const et of models) {\n const odataName = et.$.Name;\n const fqName = withNamespace(namespace[0], odataName);\n const config = this.serviceConfigHelper.findEnumTypeConfig(namespace, odataName);\n const enumName = this.nameValidator.addEnumType(fqName, config?.mappedName || odataName);\n\n this.dataModel.addEnum(namespace[0], odataName, {\n fqName,\n odataName,\n name: this.namingHelper.getEnumName(enumName),\n members: et.Member.map((m) => m.$.Name),\n });\n }\n }\n\n private addComplexType(namespace: NamespaceWithAlias, models: Array<ComplexType> | undefined) {\n if (!models || !models.length) {\n return;\n }\n\n for (const model of models) {\n const config = this.serviceConfigHelper.findComplexTypeConfig(namespace, model.$.Name);\n const fqName = withNamespace(namespace[0], model.$.Name);\n const name = this.nameValidator.addComplexType(fqName, config?.mappedName || model.$.Name);\n const baseModel = this.getBaseModel(config, model, name, fqName);\n this.dataModel.addComplexType(namespace[0], baseModel.odataName, baseModel);\n }\n }\n\n private addEntityType(namespace: NamespaceWithAlias, models: Array<ET> | undefined) {\n if (!models || !models.length) {\n return;\n }\n\n for (const model of models) {\n const entityConfig = this.serviceConfigHelper.findEntityTypeConfig(namespace, model.$.Name);\n const fqName = withNamespace(namespace[0], model.$.Name);\n const name = this.nameValidator.addEntityType(fqName, entityConfig?.mappedName || model.$.Name);\n const baseModel = this.getBaseModel(entityConfig, model, name, fqName);\n\n // key support: we add keys from this entity,\n // but not keys stemming from base classes (postprocess required)\n const keyNames: Array<string> = [];\n if (entityConfig?.keys?.length) {\n keyNames.push(...entityConfig.keys);\n } else {\n const entity = model as EntityType;\n if (entity.Key && entity.Key.length && entity.Key[0].PropertyRef.length) {\n const propNames = entity.Key[0].PropertyRef.map((key) => key.$.Name);\n keyNames.push(...propNames);\n }\n }\n\n this.dataModel.addEntityType(namespace[0], baseModel.odataName, {\n ...baseModel,\n idModelName: this.namingHelper.getIdModelName(name),\n qIdFunctionName: this.namingHelper.getQIdFunctionName(name),\n generateId: !!keyNames.length,\n keyNames: keyNames, // postprocess required to include key specs from base classes\n keys: [], // postprocess required to include props from base classes\n getKeyUnion: () => keyNames.join(\" | \"),\n });\n }\n }\n\n private postProcessModel() {\n // complex types\n const complexTypes = this.dataModel.getComplexTypes();\n complexTypes.forEach((ct) => {\n const [baseProps, _, baseAttributes] = this.collectBaseClassPropsAndKeys(ct, []);\n const { open } = baseAttributes;\n ct.baseProps = baseProps.map((bp) => ({ ...bp }));\n if (open) {\n ct.open = true;\n }\n });\n // entity types\n const entityTypes = this.dataModel.getEntityTypes();\n entityTypes.forEach((et) => {\n const [baseProps, baseKeys, baseAttributes] = this.collectBaseClassPropsAndKeys(et, []);\n const { idName, qIdName, open } = baseAttributes;\n et.baseProps = baseProps.map((bp) => ({ ...bp }));\n\n if (!et.keyNames.length && idName) {\n et.idModelName = idName;\n et.qIdFunctionName = qIdName;\n et.generateId = false;\n }\n if (open) {\n et.open = open;\n }\n et.keyNames.unshift(...baseKeys);\n });\n }\n\n private postProcessKeys() {\n const entityTypes = this.dataModel.getEntityTypes();\n entityTypes.forEach((et) => {\n const isSingleKey = et.keyNames.length === 1;\n const props = [...et.baseProps, ...et.props];\n et.keys = et.keyNames.map((keyName) => {\n const prop = props.find((p) => p.odataName === keyName);\n if (!prop) {\n throw new Error(`Key with name [${keyName}] not found in props!`);\n }\n\n // automatically set key prop to managed, if this is the only key of the given entity\n if (prop.managed === undefined) {\n prop.managed = !this.options.disableAutoManagedKey && isSingleKey;\n }\n\n return prop;\n });\n });\n }\n\n private collectBaseClassPropsAndKeys(model: ComplexModelType, visitedModels: string[]): CollectorTuple {\n if (visitedModels.includes(model.fqName)) {\n throw new Error(`Cyclic inheritance detected for model ${model.fqName}!`);\n }\n visitedModels.push(model.fqName);\n return model.baseClasses.reduce(\n ([props, keys, attributes], bc) => {\n const baseModel = this.dataModel.getEntityType(bc) || this.dataModel.getComplexType(bc);\n if (!baseModel) {\n throw new Error(`BaseModel \"${bc}\" doesn't exist!`);\n }\n\n let { idName, qIdName, open } = attributes;\n\n // recursive\n if (baseModel.baseClasses.length) {\n const [parentProps, parentKeys, parentAttributes] = this.collectBaseClassPropsAndKeys(\n baseModel,\n visitedModels\n );\n props.unshift(...parentProps);\n keys.unshift(...parentKeys);\n if (parentAttributes?.idName) {\n idName = parentAttributes.idName;\n qIdName = parentAttributes.qIdName;\n }\n if (parentAttributes?.open) {\n open = true;\n }\n }\n\n props.push(...baseModel.props);\n const entityModel = baseModel as ModelType;\n if (entityModel.keyNames?.length) {\n keys.push(...entityModel.keyNames.filter((kn) => !keys.includes(kn)));\n idName = entityModel.idModelName;\n qIdName = entityModel.qIdFunctionName;\n }\n if (baseModel.open) {\n open = true;\n }\n return [props, keys, { idName, qIdName, open }];\n },\n [[], [], { idName: \"\", qIdName: \"\", open: false }] as CollectorTuple\n );\n }\n\n protected mapProp = (p: Property, entityPropConfig?: PropertyGenerationOptions | undefined): PropertyModel => {\n if (!p.$.Type) {\n throw new Error(`No type information given for property [${p.$.Name}]!`);\n }\n\n const configProp = this.serviceConfigHelper.findPropConfigByName(p.$.Name);\n const name = this.namingHelper.getModelPropName(entityPropConfig?.mappedName || configProp?.mappedName || p.$.Name);\n const isCollection = !!p.$.Type.match(/^Collection\\(/);\n let dataType = p.$.Type.replace(/^Collection\\(([^\\)]+)\\)/, \"$1\");\n\n // support for primitive type mapping\n if (this.namingHelper.includesServicePrefix(dataType)) {\n const dt = this.dataModel.getPrimitiveType(dataType);\n if (dt !== undefined) {\n dataType = dt;\n }\n }\n\n let result: Pick<PropertyModel, \"dataType\" | \"type\" | \"typeModule\" | \"qPath\" | \"qParam\" | \"qObject\" | \"converters\">;\n\n // domain object known from service:\n // EntityType, ComplexType, EnumType\n if (this.namingHelper.includesServicePrefix(dataType)) {\n const resultDt = this.model2Type.get(dataType)!;\n const [dataTypeName, dataTypePrefix] = this.namingHelper.getNameAndServicePrefix(dataType);\n const dataTypeNamespace: NamespaceWithAlias = [dataTypePrefix!];\n if (!resultDt) {\n throw new Error(\n `Couldn't determine model data type for property \"${p.$.Name}\"! Given data type: \"${dataType}\".`\n );\n }\n\n // special handling for enums\n if (resultDt === DataTypes.EnumType) {\n const enumConfig = this.serviceConfigHelper.findEnumTypeConfig(dataTypeNamespace, dataTypeName);\n result = {\n dataType: resultDt,\n type: this.namingHelper.getEnumName(enumConfig?.mappedName ?? dataType),\n qPath: \"QEnumPath\",\n qObject: isCollection ? \"QEnumCollection\" : undefined,\n qParam: \"QEnumParam\",\n };\n }\n // handling of complex & entity types\n else {\n const entityConfig =\n resultDt === DataTypes.ComplexType\n ? this.serviceConfigHelper.findComplexTypeConfig(dataTypeNamespace, dataTypeName)\n : this.serviceConfigHelper.findEntityTypeConfig(dataTypeNamespace, dataTypeName);\n const resultDataType = entityConfig?.mappedName ?? dataType;\n result = {\n dataType: resultDt,\n type: this.namingHelper.getModelName(resultDataType),\n qPath: \"QEntityPath\",\n qObject: this.namingHelper.getQName(resultDataType),\n qParam: \"QComplexParam\",\n };\n }\n }\n // OData built-in data types\n else if (dataType.startsWith(Digester.EDM_PREFIX)) {\n const { outputType, qPath, qParam, qCollection } = this.mapODataType(dataType);\n const { to, toModule: typeModule, converters } = this.dataModel.getConverter(dataType) || {};\n\n const type = !to ? outputType : to.startsWith(Digester.EDM_PREFIX) ? this.mapODataType(to).outputType : to;\n\n result = {\n dataType: DataTypes.PrimitiveType,\n type,\n typeModule,\n qPath,\n qParam,\n qObject: isCollection ? qCollection : undefined,\n converters,\n };\n } else {\n throw new Error(\n `Unknown type [${dataType}]: Not 'Collection(...)', not OData type 'Edm.*', not starting with one of the namespaces!W`\n );\n }\n\n return {\n odataName: p.$.Name,\n name,\n odataType: p.$.Type,\n fqType: dataType,\n required: ifFalse(p.$.Nullable),\n isCollection: isCollection,\n managed: typeof entityPropConfig?.managed !== \"undefined\" ? entityPropConfig.managed : configProp?.managed,\n ...result,\n };\n };\n}\n"]}
@@ -48,6 +48,8 @@ export interface ComplexType {
48
48
  baseProps: Array<PropertyModel>;
49
49
  baseClasses: Array<string>;
50
50
  finalBaseClass: string | undefined;
51
+ abstract: boolean;
52
+ open: boolean;
51
53
  }
52
54
  export interface EnumType {
53
55
  dataType: DataTypes;
@@ -1 +1 @@
1
- {"version":3,"file":"DataTypeModel.js","sourceRoot":"","sources":["../../src/data-model/DataTypeModel.ts"],"names":[],"mappings":";;;AAEA,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,0BAAU,CAAA;IACV,0BAAU,CAAA;AACZ,CAAC,EAHW,YAAY,4BAAZ,YAAY,QAGvB","sourcesContent":["import { ValueConverterImport } from \"@odata2ts/converter-runtime\";\n\nexport enum ODataVersion {\n V2 = \"2.0\",\n V4 = \"4.0\",\n}\n\nexport const enum DataTypes {\n PrimitiveType = \"PrimitiveType\",\n EnumType = \"EnumType\",\n ComplexType = \"ComplexType\",\n ModelType = \"ModelType\",\n}\n\nexport const enum OperationTypes {\n Function = \"Function\",\n Action = \"Action\",\n}\n\nexport interface PropertyModel {\n odataName: string;\n name: string;\n odataType: string;\n fqType: string;\n type: string;\n typeModule?: string;\n qObject?: string;\n qPath: string;\n qParam?: string;\n required: boolean;\n isCollection: boolean;\n dataType: DataTypes;\n converters?: Array<ValueConverterImport>;\n managed?: boolean;\n}\n\nexport interface ModelType extends ComplexType {\n idModelName: string;\n qIdFunctionName: string;\n generateId: boolean;\n keyNames: Array<string>;\n keys: Array<PropertyModel>;\n getKeyUnion(): string;\n}\n\nexport interface ComplexType {\n dataType: DataTypes;\n fqName: string;\n odataName: string;\n name: string;\n editableName: string;\n qName: string;\n props: Array<PropertyModel>;\n baseProps: Array<PropertyModel>;\n baseClasses: Array<string>;\n finalBaseClass: string | undefined;\n}\n\nexport interface EnumType {\n dataType: DataTypes;\n fqName: string;\n odataName: string;\n name: string;\n members: Array<string>;\n}\n\nexport interface OperationType {\n fqName: string;\n odataName: string;\n name: string;\n paramsModelName: string;\n qName: string;\n type: OperationTypes;\n parameters: Array<PropertyModel>;\n returnType?: ReturnTypeModel;\n usePost?: boolean;\n}\n\nexport interface ReturnTypeModel extends PropertyModel {}\n\nexport type EntityContainerModel = {\n entitySets: { [name: string]: EntitySetType };\n singletons: { [name: string]: SingletonType };\n functions: { [name: string]: FunctionImportType };\n actions: { [name: string]: ActionImportType };\n};\n\nexport interface SingletonType {\n fqName: string;\n odataName: string;\n name: string;\n entityType: ModelType;\n navPropBinding?: Array<NavPropBindingType>;\n}\n\nexport interface EntitySetType {\n fqName: string;\n odataName: string;\n name: string;\n entityType: ModelType;\n navPropBinding?: Array<NavPropBindingType>;\n}\n\nexport interface NavPropBindingType {\n path: string;\n target: string;\n}\n\nexport interface ActionImportType {\n fqName: string;\n odataName: string;\n name: string;\n operation: string;\n}\n\nexport interface FunctionImportType extends ActionImportType {\n entitySet: string;\n}\n"]}
1
+ {"version":3,"file":"DataTypeModel.js","sourceRoot":"","sources":["../../src/data-model/DataTypeModel.ts"],"names":[],"mappings":";;;AAEA,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,0BAAU,CAAA;IACV,0BAAU,CAAA;AACZ,CAAC,EAHW,YAAY,4BAAZ,YAAY,QAGvB","sourcesContent":["import { ValueConverterImport } from \"@odata2ts/converter-runtime\";\n\nexport enum ODataVersion {\n V2 = \"2.0\",\n V4 = \"4.0\",\n}\n\nexport const enum DataTypes {\n PrimitiveType = \"PrimitiveType\",\n EnumType = \"EnumType\",\n ComplexType = \"ComplexType\",\n ModelType = \"ModelType\",\n}\n\nexport const enum OperationTypes {\n Function = \"Function\",\n Action = \"Action\",\n}\n\nexport interface PropertyModel {\n odataName: string;\n name: string;\n odataType: string;\n fqType: string;\n type: string;\n typeModule?: string;\n qObject?: string;\n qPath: string;\n qParam?: string;\n required: boolean;\n isCollection: boolean;\n dataType: DataTypes;\n converters?: Array<ValueConverterImport>;\n managed?: boolean;\n}\n\nexport interface ModelType extends ComplexType {\n idModelName: string;\n qIdFunctionName: string;\n generateId: boolean;\n keyNames: Array<string>;\n keys: Array<PropertyModel>;\n getKeyUnion(): string;\n}\n\nexport interface ComplexType {\n dataType: DataTypes;\n fqName: string;\n odataName: string;\n name: string;\n editableName: string;\n qName: string;\n props: Array<PropertyModel>;\n baseProps: Array<PropertyModel>;\n baseClasses: Array<string>;\n finalBaseClass: string | undefined;\n abstract: boolean;\n open: boolean;\n}\n\nexport interface EnumType {\n dataType: DataTypes;\n fqName: string;\n odataName: string;\n name: string;\n members: Array<string>;\n}\n\nexport interface OperationType {\n fqName: string;\n odataName: string;\n name: string;\n paramsModelName: string;\n qName: string;\n type: OperationTypes;\n parameters: Array<PropertyModel>;\n returnType?: ReturnTypeModel;\n usePost?: boolean;\n}\n\nexport interface ReturnTypeModel extends PropertyModel {}\n\nexport type EntityContainerModel = {\n entitySets: { [name: string]: EntitySetType };\n singletons: { [name: string]: SingletonType };\n functions: { [name: string]: FunctionImportType };\n actions: { [name: string]: ActionImportType };\n};\n\nexport interface SingletonType {\n fqName: string;\n odataName: string;\n name: string;\n entityType: ModelType;\n navPropBinding?: Array<NavPropBindingType>;\n}\n\nexport interface EntitySetType {\n fqName: string;\n odataName: string;\n name: string;\n entityType: ModelType;\n navPropBinding?: Array<NavPropBindingType>;\n}\n\nexport interface NavPropBindingType {\n path: string;\n target: string;\n}\n\nexport interface ActionImportType {\n fqName: string;\n odataName: string;\n name: string;\n operation: string;\n}\n\nexport interface FunctionImportType extends ActionImportType {\n entitySet: string;\n}\n"]}
@@ -38,6 +38,8 @@ export interface EntityType {
38
38
  $: {
39
39
  Name: string;
40
40
  BaseType?: string;
41
+ Abstract?: "true" | "false";
42
+ OpenType?: "true" | "false";
41
43
  };
42
44
  Key: Array<PropertyRef>;
43
45
  Property: Array<Property>;
@@ -1 +1 @@
1
- {"version":3,"file":"ODataEdmxModelBase.js","sourceRoot":"","sources":["../../../src/data-model/edmx/ODataEdmxModelBase.ts"],"names":[],"mappings":"","sourcesContent":["export interface ODataEdmxModelBase<VersionedSchema> {\r\n \"edmx:Edmx\": {\r\n $: {\r\n Version: string;\r\n \"xmlns:edmx\": string;\r\n };\r\n // \"edmx:Reference\": Array<any>;\r\n \"edmx:DataServices\": Array<DataService<VersionedSchema>>;\r\n };\r\n}\r\n\r\nexport interface DataService<VersionedSchema> {\r\n Schema: Array<VersionedSchema>;\r\n}\r\n\r\nexport interface Schema<ET extends EntityType, CT extends ComplexType> {\r\n $: {\r\n Namespace: string;\r\n xmlns: string;\r\n Alias?: string;\r\n };\r\n EntityType?: Array<ET>;\r\n ComplexType?: Array<CT>;\r\n EnumType?: Array<EnumType>;\r\n EntityContainer?: Array<any>;\r\n TypeDefinition?: Array<TypeDefinition>;\r\n}\r\n\r\nexport interface EntityContainer<ES = EntitySet> {\r\n $: {\r\n Name: string;\r\n };\r\n EntitySet?: Array<ES>;\r\n}\r\n\r\nexport interface EntitySet {\r\n $: {\r\n Name: string;\r\n EntityType: string;\r\n };\r\n}\r\n\r\nexport interface EntityType {\r\n $: {\r\n Name: string;\r\n BaseType?: string;\r\n };\r\n Key: Array<PropertyRef>;\r\n Property: Array<Property>;\r\n}\r\n\r\nexport interface ComplexType extends Omit<EntityType, \"Key\"> {}\r\n\r\nexport interface PropertyRef {\r\n PropertyRef: Array<{ $: { Name: string } }>;\r\n}\r\n\r\nexport interface Property {\r\n $: {\r\n Name: string;\r\n Type: string;\r\n Nullable?: \"true\" | \"false\";\r\n MaxLength?: number;\r\n Precision?: number;\r\n Scale?: number;\r\n };\r\n}\r\n\r\nexport interface EnumType {\r\n $: {\r\n Name: string;\r\n };\r\n Member: Array<Member>;\r\n}\r\n\r\nexport interface Member {\r\n $: {\r\n Name: string;\r\n Value: number;\r\n };\r\n}\r\n\r\nexport interface Parameter extends Property {\r\n Unicode?: boolean;\r\n}\r\n\r\nexport interface ReturnType {\r\n $: {\r\n Type: string;\r\n };\r\n}\r\n\r\nexport interface TypeDefinition {\r\n $: {\r\n Name: string;\r\n UnderlyingType: string;\r\n MaxLength?: number;\r\n Precision?: number;\r\n Scale?: number;\r\n };\r\n}\r\n"]}
1
+ {"version":3,"file":"ODataEdmxModelBase.js","sourceRoot":"","sources":["../../../src/data-model/edmx/ODataEdmxModelBase.ts"],"names":[],"mappings":"","sourcesContent":["export interface ODataEdmxModelBase<VersionedSchema> {\n \"edmx:Edmx\": {\n $: {\n Version: string;\n \"xmlns:edmx\": string;\n };\n // \"edmx:Reference\": Array<any>;\n \"edmx:DataServices\": Array<DataService<VersionedSchema>>;\n };\n}\n\nexport interface DataService<VersionedSchema> {\n Schema: Array<VersionedSchema>;\n}\n\nexport interface Schema<ET extends EntityType, CT extends ComplexType> {\n $: {\n Namespace: string;\n xmlns: string;\n Alias?: string;\n };\n EntityType?: Array<ET>;\n ComplexType?: Array<CT>;\n EnumType?: Array<EnumType>;\n EntityContainer?: Array<any>;\n TypeDefinition?: Array<TypeDefinition>;\n}\n\nexport interface EntityContainer<ES = EntitySet> {\n $: {\n Name: string;\n };\n EntitySet?: Array<ES>;\n}\n\nexport interface EntitySet {\n $: {\n Name: string;\n EntityType: string;\n };\n}\n\nexport interface EntityType {\n $: {\n Name: string;\n BaseType?: string;\n Abstract?: \"true\" | \"false\";\n OpenType?: \"true\" | \"false\";\n };\n Key: Array<PropertyRef>;\n Property: Array<Property>;\n}\n\nexport interface ComplexType extends Omit<EntityType, \"Key\"> {}\n\nexport interface PropertyRef {\n PropertyRef: Array<{ $: { Name: string } }>;\n}\n\nexport interface Property {\n $: {\n Name: string;\n Type: string;\n Nullable?: \"true\" | \"false\";\n MaxLength?: number;\n Precision?: number;\n Scale?: number;\n };\n}\n\nexport interface EnumType {\n $: {\n Name: string;\n };\n Member: Array<Member>;\n}\n\nexport interface Member {\n $: {\n Name: string;\n Value: number;\n };\n}\n\nexport interface Parameter extends Property {\n Unicode?: boolean;\n}\n\nexport interface ReturnType {\n $: {\n Type: string;\n };\n}\n\nexport interface TypeDefinition {\n $: {\n Name: string;\n UnderlyingType: string;\n MaxLength?: number;\n Precision?: number;\n Scale?: number;\n };\n}\n"]}
@@ -37,10 +37,10 @@ class ModelGenerator {
37
37
  generateModels() {
38
38
  this.dataModel.getEntityTypes().forEach((model) => {
39
39
  this.generateModel(model);
40
- if (!this.options.skipIdModels) {
40
+ if (!this.options.skipIdModels && model.generateId) {
41
41
  this.generateIdModel(model);
42
42
  }
43
- if (!this.options.skipEditableModels) {
43
+ if (!this.options.skipEditableModels && !model.abstract) {
44
44
  this.generateEditableModel(model);
45
45
  }
46
46
  if (!this.options.skipOperations) {
@@ -49,7 +49,7 @@ class ModelGenerator {
49
49
  });
50
50
  this.dataModel.getComplexTypes().forEach((model) => {
51
51
  this.generateModel(model);
52
- if (!this.options.skipEditableModels) {
52
+ if (!this.options.skipEditableModels && !model.abstract) {
53
53
  this.generateEditableModel(model);
54
54
  }
55
55
  });
@@ -124,9 +124,6 @@ class ModelGenerator {
124
124
  return prop.type + (prop.required ? "" : " | null") + suffix;
125
125
  }
126
126
  generateIdModel(model) {
127
- if (!model.generateId) {
128
- return;
129
- }
130
127
  const singleType = model.keys.length === 1 ? `${model.keys[0].type} | ` : "";
131
128
  const keyTypes = model.keys.map((keyProp) => `${keyProp.name}: ${this.getPropType(keyProp)}`).join(",");
132
129
  const type = `${singleType}{${keyTypes}}`;
@@ -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) {\n this.generateIdModel(model);\n }\n if (!this.options.skipEditableModels) {\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) {\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 if (!model.generateId) {\n return;\n }\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, 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"]}