@odata2ts/odata2ts 0.33.0 → 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.
Files changed (58) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/lib/FactoryFunctionModel.d.ts +3 -3
  3. package/lib/FactoryFunctionModel.js.map +1 -1
  4. package/lib/OptionModel.d.ts +9 -0
  5. package/lib/OptionModel.js.map +1 -1
  6. package/lib/app.js +18 -8
  7. package/lib/app.js.map +1 -1
  8. package/lib/data-model/DataModel.d.ts +12 -6
  9. package/lib/data-model/DataModel.js +10 -0
  10. package/lib/data-model/DataModel.js.map +1 -1
  11. package/lib/data-model/DataModelDigestion.js +37 -20
  12. package/lib/data-model/DataModelDigestion.js.map +1 -1
  13. package/lib/data-model/DataModelDigestionV4.js +0 -9
  14. package/lib/data-model/DataModelDigestionV4.js.map +1 -1
  15. package/lib/data-model/DataTypeModel.d.ts +17 -7
  16. package/lib/data-model/DataTypeModel.js.map +1 -1
  17. package/lib/data-model/NamingHelper.d.ts +1 -0
  18. package/lib/data-model/NamingHelper.js +4 -1
  19. package/lib/data-model/NamingHelper.js.map +1 -1
  20. package/lib/data-model/ServiceConfigHelper.js +2 -2
  21. package/lib/data-model/ServiceConfigHelper.js.map +1 -1
  22. package/lib/data-model/validation/NameClashValidator.d.ts +23 -0
  23. package/lib/data-model/validation/NameClashValidator.js +89 -0
  24. package/lib/data-model/validation/NameClashValidator.js.map +1 -0
  25. package/lib/data-model/validation/NameValidator.d.ts +6 -17
  26. package/lib/data-model/validation/NameValidator.js +0 -77
  27. package/lib/data-model/validation/NameValidator.js.map +1 -1
  28. package/lib/data-model/validation/NoopValidator.d.ts +12 -0
  29. package/lib/data-model/validation/NoopValidator.js +34 -0
  30. package/lib/data-model/validation/NoopValidator.js.map +1 -0
  31. package/lib/defaultConfig.js +1 -0
  32. package/lib/defaultConfig.js.map +1 -1
  33. package/lib/generator/ImportContainer.d.ts +44 -11
  34. package/lib/generator/ImportContainer.js +150 -47
  35. package/lib/generator/ImportContainer.js.map +1 -1
  36. package/lib/generator/ImportedNameValidator.d.ts +5 -0
  37. package/lib/generator/ImportedNameValidator.js +26 -0
  38. package/lib/generator/ImportedNameValidator.js.map +1 -0
  39. package/lib/generator/ModelGenerator.js +113 -72
  40. package/lib/generator/ModelGenerator.js.map +1 -1
  41. package/lib/generator/QueryObjectGenerator.js +134 -107
  42. package/lib/generator/QueryObjectGenerator.js.map +1 -1
  43. package/lib/generator/ServiceGenerator.d.ts +1 -1
  44. package/lib/generator/ServiceGenerator.js +160 -161
  45. package/lib/generator/ServiceGenerator.js.map +1 -1
  46. package/lib/generator/import/ImportObjects.d.ts +66 -0
  47. package/lib/generator/import/ImportObjects.js +83 -0
  48. package/lib/generator/import/ImportObjects.js.map +1 -0
  49. package/lib/project/FileHandler.d.ts +28 -0
  50. package/lib/project/FileHandler.js +66 -0
  51. package/lib/project/FileHandler.js.map +1 -0
  52. package/lib/project/ProjectManager.d.ts +44 -18
  53. package/lib/project/ProjectManager.js +155 -111
  54. package/lib/project/ProjectManager.js.map +1 -1
  55. package/lib/project/TsMorphHelper.d.ts +11 -0
  56. package/lib/project/TsMorphHelper.js +66 -0
  57. package/lib/project/TsMorphHelper.js.map +1 -0
  58. package/package.json +10 -8
@@ -1,79 +1,105 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateQueryObjects = void 0;
4
+ const tslib_1 = require("tslib");
4
5
  const odata_core_1 = require("@odata2ts/odata-core");
5
6
  const ts_morph_1 = require("ts-morph");
6
7
  const processors_1 = require("xml2js/lib/processors");
7
- const ImportContainer_1 = require("./ImportContainer");
8
- const generateQueryObjects = (dataModel, sourceFile, version, options, namingHelper) => {
9
- const generator = new QueryObjectGenerator(dataModel, sourceFile, version, options, namingHelper);
8
+ const ImportObjects_1 = require("./import/ImportObjects");
9
+ const generateQueryObjects = (project, dataModel, version, options, namingHelper) => {
10
+ const generator = new QueryObjectGenerator(project, dataModel, version, options, namingHelper);
10
11
  return generator.generate();
11
12
  };
12
13
  exports.generateQueryObjects = generateQueryObjects;
13
14
  class QueryObjectGenerator {
14
- constructor(dataModel, sourceFile, version, options, namingHelper) {
15
+ constructor(project, dataModel, version, options, namingHelper) {
16
+ this.project = project;
15
17
  this.dataModel = dataModel;
16
- this.sourceFile = sourceFile;
17
18
  this.version = version;
18
19
  this.options = options;
19
20
  this.namingHelper = namingHelper;
20
21
  }
21
22
  generate() {
22
- const importContainer = new ImportContainer_1.ImportContainer(this.namingHelper.getFileNames());
23
- this.generateModels(importContainer);
24
- if (!this.options.skipOperations) {
25
- this.generateUnboundOperations(importContainer);
26
- }
27
- this.sourceFile.addImportDeclarations(importContainer.getImportDeclarations(false));
23
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
24
+ this.project.initQObjects();
25
+ // process EntityType & ComplexType
26
+ const promises = [...this.generateEntityTypes(), ...this.generateComplexTypes()];
27
+ if (!this.options.skipOperations) {
28
+ // process unbound operations
29
+ promises.push(this.generateUnboundOperations());
30
+ }
31
+ yield Promise.all(promises);
32
+ return this.project.finalizeQObjects();
33
+ });
28
34
  }
29
- generateModels(importContainer) {
30
- this.dataModel.getEntityTypes().forEach((model) => {
31
- this.generateModel(model, importContainer);
35
+ generateEntityTypes() {
36
+ return this.dataModel.getEntityTypes().map((model) => {
37
+ const file = this.project.createOrGetQObjectFile(model.folderPath, model.qName, [
38
+ model.qName,
39
+ (0, processors_1.firstCharLowerCase)(model.qName),
40
+ model.id.qName,
41
+ ]);
42
+ // q object
43
+ this.generateModel(file, model);
44
+ // qId function
32
45
  if (!this.options.skipIdModels && model.generateId) {
33
- this.generateIdFunction(model, importContainer);
46
+ this.generateIdFunction(file, model);
34
47
  }
48
+ // bound q operations
35
49
  if (!this.options.skipOperations) {
36
- this.generateBoundOperations(model.fqName, importContainer);
50
+ [
51
+ ...this.dataModel.getEntityTypeOperations(model.fqName),
52
+ ...this.dataModel.getEntitySetOperations(model.fqName),
53
+ ].forEach((operation) => {
54
+ this.generateOperation(file, operation, model.fqName);
55
+ });
37
56
  }
57
+ return this.project.finalizeFile(file);
38
58
  });
39
- this.dataModel.getComplexTypes().forEach((model) => {
40
- this.generateModel(model, importContainer);
59
+ }
60
+ generateComplexTypes() {
61
+ return this.dataModel.getComplexTypes().map((model) => {
62
+ const file = this.project.createOrGetQObjectFile(model.folderPath, model.qName, [
63
+ model.qName,
64
+ (0, processors_1.firstCharLowerCase)(model.qName),
65
+ ]);
66
+ this.generateModel(file, model);
67
+ return this.project.finalizeFile(file);
41
68
  });
42
- if (this.dataModel.getEntityTypes().length || this.dataModel.getComplexTypes().length) {
43
- importContainer.addFromQObject("QueryObject");
44
- }
45
69
  }
46
- generateModel(model, importContainer) {
47
- let extendsClause = "QueryObject";
70
+ generateModel(file, model) {
71
+ const imports = file.getImports();
72
+ let extendsClause;
48
73
  if (model.baseClasses.length) {
49
74
  const baseClass = model.baseClasses[0];
50
- const baseModel = this.dataModel.getEntityType(baseClass) || this.dataModel.getComplexType(baseClass);
75
+ const baseModel = this.dataModel.getModel(baseClass);
51
76
  if (!baseModel) {
52
77
  throw new Error(`Entity or complex type "${baseClass}" from baseClass attribute not found!`);
53
78
  }
54
- extendsClause = baseModel.qName;
79
+ extendsClause = imports.addGeneratedQObject(baseClass, baseModel.qName);
55
80
  }
56
- this.sourceFile.addClass({
81
+ else {
82
+ [extendsClause] = imports.addQObject(ImportObjects_1.QueryObjectImports.QueryObject);
83
+ }
84
+ file.getFile().addClass({
57
85
  name: model.qName,
58
86
  isExported: true,
59
87
  extends: extendsClause,
60
- isAbstract: model.abstract,
61
- properties: this.generateQueryObjectProps(model.props, importContainer),
88
+ // isAbstract: model.abstract,
89
+ properties: this.generateQueryObjectProps(file.getImports(), model.props),
90
+ });
91
+ file.getFile().addVariableStatement({
92
+ declarationKind: ts_morph_1.VariableDeclarationKind.Const,
93
+ isExported: true,
94
+ declarations: [
95
+ {
96
+ name: (0, processors_1.firstCharLowerCase)(model.qName),
97
+ initializer: `new ${model.qName}()`,
98
+ },
99
+ ],
62
100
  });
63
- if (!model.abstract) {
64
- this.sourceFile.addVariableStatement({
65
- declarationKind: ts_morph_1.VariableDeclarationKind.Const,
66
- isExported: true,
67
- declarations: [
68
- {
69
- name: (0, processors_1.firstCharLowerCase)(model.qName),
70
- initializer: `new ${model.qName}()`,
71
- },
72
- ],
73
- });
74
- }
75
101
  }
76
- generateQueryObjectProps(props, importContainer) {
102
+ generateQueryObjectProps(importContainer, props) {
77
103
  return props.map((prop) => {
78
104
  const { odataName } = prop;
79
105
  const name = this.namingHelper.getQPropName(prop.name);
@@ -81,27 +107,24 @@ class QueryObjectGenerator {
81
107
  let qPathInit;
82
108
  // factor in collections
83
109
  if (prop.isCollection) {
84
- const cType = `Q${isModelType ? "Entity" : ""}CollectionPath`;
85
- const qObject = prop.qObject;
86
- if (!qObject) {
87
- throw new Error("QObject for collection is missing!");
88
- }
89
- qPathInit = `new ${cType}(this.withPrefix("${odataName}"), () => ${qObject})`;
90
- importContainer.addFromQObject(cType);
91
- if (!isModelType) {
92
- importContainer.addFromQObject(qObject);
93
- }
110
+ const cType = isModelType ? ImportObjects_1.QueryObjectImports.QEntityCollectionPath : ImportObjects_1.QueryObjectImports.QCollectionPath;
111
+ const collectionType = importContainer.addQObject(cType);
112
+ const qObject = isModelType
113
+ ? importContainer.addGeneratedQObject(prop.fqType, prop.qObject)
114
+ : importContainer.addFromQObject(prop.qObject)[0];
115
+ qPathInit = `new ${collectionType}(this.withPrefix("${odataName}"), () => ${qObject})`;
94
116
  }
95
117
  else {
118
+ // add import for data type
119
+ const qPath = importContainer.addFromQObject(prop.qPath);
96
120
  if (isModelType) {
97
- qPathInit = `new ${prop.qPath}(this.withPrefix("${odataName}"), () => ${prop.qObject})`;
121
+ const qObject = importContainer.addGeneratedQObject(prop.fqType, prop.qObject);
122
+ qPathInit = `new ${qPath}(this.withPrefix("${odataName}"), () => ${qObject})`;
98
123
  }
99
124
  else {
100
- let converterStmt = this.generateConverterStmt(prop.converters, importContainer);
101
- qPathInit = `new ${prop.qPath}(this.withPrefix("${odataName}")${converterStmt ? `, ${converterStmt}` : ""})`;
125
+ let converterStmt = this.generateConverterStmt(importContainer, prop.converters);
126
+ qPathInit = `new ${qPath}(this.withPrefix("${odataName}")${converterStmt ? `, ${converterStmt}` : ""})`;
102
127
  }
103
- // add import for data type
104
- importContainer.addFromQObject(prop.qPath);
105
128
  }
106
129
  return {
107
130
  name,
@@ -111,36 +134,36 @@ class QueryObjectGenerator {
111
134
  };
112
135
  });
113
136
  }
114
- generateConverterStmt(converters, importContainer) {
137
+ generateConverterStmt(importContainer, converters) {
115
138
  if (!(converters === null || converters === void 0 ? void 0 : converters.length)) {
116
- return;
139
+ return undefined;
117
140
  }
118
- converters.forEach((converter) => {
119
- importContainer.addCustomType(converter.package, converter.converterId);
141
+ const converterIds = converters.map((converter) => {
142
+ return importContainer.addCustomType(converter.package, converter.converterId);
120
143
  });
121
- if (converters.length === 1) {
122
- return converters[0].converterId;
144
+ if (converterIds.length === 1) {
145
+ return converterIds[0];
123
146
  }
124
147
  else {
125
- importContainer.addCustomType("@odata2ts/converter-runtime", "createChain");
126
- const [first, second, ...moreConverters] = converters;
127
- return moreConverters.reduce((stmt, conv) => `${stmt}.chain(${conv.converterId})`, `createChain(${first.converterId}, ${second.converterId})`);
148
+ const createChain = importContainer.addCustomType("@odata2ts/converter-runtime", "createChain");
149
+ const [first, second, ...moreConverters] = converterIds;
150
+ return moreConverters.reduce((stmt, convId) => `${stmt}.chain(${convId})`, `${createChain}(${first}, ${second})`);
128
151
  }
129
152
  }
130
- generateIdFunction(model, importContainer) {
131
- const qFunc = "QId";
132
- importContainer.addFromQObject(qFunc);
133
- importContainer.addGeneratedModel(model.idModelName);
134
- this.sourceFile.addClass({
135
- name: model.qIdFunctionName,
153
+ generateIdFunction(file, model) {
154
+ const importContainer = file.getImports();
155
+ const qFunc = importContainer.addQObject(ImportObjects_1.QueryObjectImports.QId);
156
+ const idModelName = importContainer.addGeneratedModel(model.fqName, model.id.modelName);
157
+ file.getFile().addClass({
158
+ name: model.id.qName,
136
159
  isExported: true,
137
- extends: `${qFunc}<${model.idModelName}>`,
160
+ extends: `${qFunc}<${idModelName}>`,
138
161
  properties: [
139
162
  {
140
163
  name: "params",
141
164
  scope: ts_morph_1.Scope.Private,
142
165
  isReadonly: true,
143
- initializer: this.getParamInitString(model.keys, importContainer),
166
+ initializer: this.getParamInitString(importContainer, model.keys),
144
167
  },
145
168
  ],
146
169
  methods: [
@@ -151,76 +174,80 @@ class QueryObjectGenerator {
151
174
  ],
152
175
  });
153
176
  }
154
- getParamInitString(props, importContainer) {
177
+ getParamInitString(importContainer, props) {
155
178
  return `[${props
156
179
  .map((prop) => {
157
180
  var _a;
158
- const isComplexParam = prop.dataType === "ModelType" /* DataTypes.ModelType */ || prop.dataType === "ComplexType" /* DataTypes.ComplexType */;
159
- if (prop.qParam) {
160
- importContainer.addFromQObject(prop.qParam);
181
+ let complexQParam = "";
182
+ if (prop.dataType === "ModelType" /* DataTypes.ModelType */ || prop.dataType === "ComplexType" /* DataTypes.ComplexType */) {
183
+ const importedQObject = importContainer.addGeneratedQObject(prop.fqType, prop.qObject);
184
+ complexQParam = `, new ${importedQObject}()`;
161
185
  }
186
+ const qParam = importContainer.addFromQObject(prop.qParam);
162
187
  const isMappedNameNecessary = prop.odataName !== prop.name;
163
188
  const mappedName = isMappedNameNecessary ? `"${prop.name}"` : ((_a = prop.converters) === null || _a === void 0 ? void 0 : _a.length) ? "undefined" : undefined;
164
- const converterStmt = this.generateConverterStmt(prop.converters, importContainer);
189
+ const converterStmt = this.generateConverterStmt(importContainer, prop.converters);
165
190
  const mappedNameParam = mappedName ? `, ${mappedName}` : "";
166
- const complexQParam = isComplexParam ? `, new ${prop.qObject}()` : "";
167
191
  const converterParam = converterStmt ? `, ${converterStmt}` : "";
168
- return `new ${prop.qParam}("${prop.odataName}"${complexQParam}${mappedNameParam}${converterParam})`;
192
+ return `new ${qParam}("${prop.odataName}"${complexQParam}${mappedNameParam}${converterParam})`;
169
193
  })
170
194
  .join(",")}]`;
171
195
  }
172
- generateUnboundOperations(importContainer) {
173
- this.dataModel.getUnboundOperationTypes().forEach((operation) => {
174
- this.generateOperation(operation, importContainer);
175
- });
176
- }
177
- generateBoundOperations(fqEntityName, importContainer) {
178
- [
179
- ...this.dataModel.getEntityTypeOperations(fqEntityName),
180
- ...this.dataModel.getEntitySetOperations(fqEntityName),
181
- ].forEach((operation) => {
182
- this.generateOperation(operation, importContainer);
196
+ generateUnboundOperations() {
197
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
198
+ const unboundOps = this.dataModel.getUnboundOperationTypes();
199
+ const reservedNames = unboundOps.map((op) => op.qName);
200
+ const file = this.project.createOrGetMainQObjectFile(reservedNames);
201
+ unboundOps.forEach((operation) => {
202
+ this.generateOperation(file, operation, "");
203
+ });
183
204
  });
184
205
  }
185
- generateOperation(operation, importContainer) {
206
+ generateOperation(file, operation, baseFqName) {
186
207
  var _a;
208
+ const imports = file.getImports();
187
209
  const isV2 = this.version === odata_core_1.ODataVersions.V2;
188
- const qOperation = operation.type === "Action" /* OperationTypes.Action */ ? "QAction" : "QFunction";
189
210
  const returnType = operation.returnType;
190
- let returnTypeOpStmt = "";
191
211
  const hasParams = operation.parameters.length > 0;
192
- importContainer.addFromQObject(qOperation);
193
- if (hasParams) {
194
- importContainer.addGeneratedModel(operation.paramsModelName);
195
- }
212
+ // imports
213
+ const qOp = operation.type === "Action" /* OperationTypes.Action */ ? ImportObjects_1.QueryObjectImports.QAction : ImportObjects_1.QueryObjectImports.QFunction;
214
+ const qOperation = imports.addQObject(qOp);
215
+ const paramModelName = operation.parameters.length
216
+ ? imports.addGeneratedModel(baseFqName, operation.paramsModelName)
217
+ : undefined;
218
+ let returnTypeOpStmt = "";
196
219
  if (returnType) {
220
+ const collectionSuffix = returnType.isCollection ? "_COLLECTION" : "";
197
221
  if (returnType.dataType === "ComplexType" /* DataTypes.ComplexType */ || returnType.dataType === "ModelType" /* DataTypes.ModelType */) {
198
222
  if (returnType.qObject) {
199
- importContainer.addFromQObject("OperationReturnType", "ReturnTypes", "QComplexParam");
200
- returnTypeOpStmt = `new OperationReturnType(ReturnTypes.COMPLEX${returnType.isCollection ? "_COLLECTION" : ""}, new QComplexParam("NONE", new ${returnType.qObject}))`;
223
+ const [opRt, rts, qComplexParam] = imports.addQObject(ImportObjects_1.QueryObjectImports.OperationReturnType, ImportObjects_1.QueryObjectImports.ReturnTypes, ImportObjects_1.QueryObjectImports.QComplexParam);
224
+ const returnQName = imports.addGeneratedQObject(returnType.fqType, returnType.qObject);
225
+ returnTypeOpStmt = `new ${opRt}(${rts}.COMPLEX${collectionSuffix}, new ${qComplexParam}("NONE", new ${returnQName}))`;
201
226
  }
202
227
  }
203
228
  // currently, it only makes sense to add the OperationReturnType if a converter is present
204
229
  else if (returnType.converters && returnType.qParam) {
205
- importContainer.addFromQObject("OperationReturnType", "ReturnTypes", returnType.qParam);
206
- const rtKind = "ReturnTypes.VALUE" + (returnType.isCollection ? "_COLLECTION" : "");
230
+ const [rtClass, rtTypes] = imports.addQObject(ImportObjects_1.QueryObjectImports.OperationReturnType, ImportObjects_1.QueryObjectImports.ReturnTypes);
231
+ const [qParam] = imports.addFromQObject(returnType.qParam);
232
+ // TODO: some constants with string concat
233
+ const rtKind = `${rtTypes}.VALUE${collectionSuffix}`;
207
234
  const converterParam = returnType.converters
208
- ? ", " + this.generateConverterStmt(returnType.converters, importContainer)
235
+ ? ", " + this.generateConverterStmt(imports, returnType.converters)
209
236
  : "";
210
- returnTypeOpStmt = `new OperationReturnType(${rtKind}, new ${returnType.qParam}("NONE", undefined${converterParam}))`;
237
+ returnTypeOpStmt = `new ${rtClass}(${rtKind}, new ${qParam}("NONE", undefined${converterParam}))`;
211
238
  }
212
239
  }
213
- this.sourceFile.addClass({
240
+ file.getFile().addClass({
214
241
  name: operation.qName,
215
242
  isExported: true,
216
- extends: qOperation + (hasParams ? `<${operation.paramsModelName}>` : ""),
243
+ extends: qOperation + (hasParams ? `<${paramModelName}>` : ""),
217
244
  properties: [
218
245
  {
219
246
  name: "params",
220
247
  scope: ts_morph_1.Scope.Private,
221
248
  isReadonly: true,
222
249
  type: ((_a = operation.parameters) === null || _a === void 0 ? void 0 : _a.length) ? undefined : "[]",
223
- initializer: this.getParamInitString(operation.parameters, importContainer),
250
+ initializer: this.getParamInitString(imports, operation.parameters),
224
251
  },
225
252
  ],
226
253
  ctors: [
@@ -1 +1 @@
1
- {"version":3,"file":"QueryObjectGenerator.js","sourceRoot":"","sources":["../../src/generator/QueryObjectGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["import { ValueConverterImport } from \"@odata2ts/converter-runtime\";\nimport { ODataVersions } from \"@odata2ts/odata-core\";\nimport { OptionalKind, PropertyDeclarationStructure, Scope, SourceFile, VariableDeclarationKind } from \"ts-morph\";\nimport { firstCharLowerCase } from \"xml2js/lib/processors\";\n\nimport { DataModel } from \"../data-model/DataModel\";\nimport {\n ComplexType,\n DataTypes,\n ModelType,\n OperationType,\n OperationTypes,\n PropertyModel,\n} from \"../data-model/DataTypeModel\";\nimport { NamingHelper } from \"../data-model/NamingHelper\";\nimport { EntityBasedGeneratorFunction, GeneratorFunctionOptions } from \"../FactoryFunctionModel\";\nimport { ImportContainer } from \"./ImportContainer\";\n\nexport const generateQueryObjects: EntityBasedGeneratorFunction = (\n dataModel,\n sourceFile,\n version,\n options,\n namingHelper\n) => {\n const generator = new QueryObjectGenerator(dataModel, sourceFile, version, options, namingHelper);\n return generator.generate();\n};\n\nclass QueryObjectGenerator {\n constructor(\n private dataModel: DataModel,\n private sourceFile: SourceFile,\n private version: ODataVersions,\n private options: GeneratorFunctionOptions,\n private namingHelper: NamingHelper\n ) {}\n\n public generate(): void {\n const importContainer = new ImportContainer(this.namingHelper.getFileNames());\n\n this.generateModels(importContainer);\n if (!this.options.skipOperations) {\n this.generateUnboundOperations(importContainer);\n }\n\n this.sourceFile.addImportDeclarations(importContainer.getImportDeclarations(false));\n }\n\n private generateModels(importContainer: ImportContainer) {\n this.dataModel.getEntityTypes().forEach((model) => {\n this.generateModel(model, importContainer);\n if (!this.options.skipIdModels && model.generateId) {\n this.generateIdFunction(model, importContainer);\n }\n if (!this.options.skipOperations) {\n this.generateBoundOperations(model.fqName, importContainer);\n }\n });\n this.dataModel.getComplexTypes().forEach((model) => {\n this.generateModel(model, importContainer);\n });\n\n if (this.dataModel.getEntityTypes().length || this.dataModel.getComplexTypes().length) {\n importContainer.addFromQObject(\"QueryObject\");\n }\n }\n\n private generateModel(model: ComplexType, importContainer: ImportContainer) {\n let extendsClause = \"QueryObject\";\n if (model.baseClasses.length) {\n const baseClass = model.baseClasses[0];\n const baseModel = this.dataModel.getEntityType(baseClass) || this.dataModel.getComplexType(baseClass);\n if (!baseModel) {\n throw new Error(`Entity or complex type \"${baseClass}\" from baseClass attribute not found!`);\n }\n\n extendsClause = baseModel.qName;\n }\n\n this.sourceFile.addClass({\n name: model.qName,\n isExported: true,\n extends: extendsClause,\n isAbstract: model.abstract,\n properties: this.generateQueryObjectProps(model.props, importContainer),\n });\n\n if (!model.abstract) {\n this.sourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n isExported: true,\n declarations: [\n {\n name: firstCharLowerCase(model.qName),\n initializer: `new ${model.qName}()`,\n },\n ],\n });\n }\n }\n\n private generateQueryObjectProps(\n props: Array<PropertyModel>,\n importContainer: ImportContainer\n ): Array<OptionalKind<PropertyDeclarationStructure>> {\n return props.map((prop) => {\n const { odataName } = prop;\n const name = this.namingHelper.getQPropName(prop.name);\n const isModelType = prop.dataType === DataTypes.ModelType || prop.dataType === DataTypes.ComplexType;\n let qPathInit: string;\n\n // factor in collections\n if (prop.isCollection) {\n const cType = `Q${isModelType ? \"Entity\" : \"\"}CollectionPath`;\n const qObject = prop.qObject;\n\n if (!qObject) {\n throw new Error(\"QObject for collection is missing!\");\n }\n\n qPathInit = `new ${cType}(this.withPrefix(\"${odataName}\"), () => ${qObject})`;\n\n importContainer.addFromQObject(cType);\n if (!isModelType) {\n importContainer.addFromQObject(qObject);\n }\n } else {\n if (isModelType) {\n qPathInit = `new ${prop.qPath}(this.withPrefix(\"${odataName}\"), () => ${prop.qObject!})`;\n } else {\n let converterStmt = this.generateConverterStmt(prop.converters, importContainer);\n qPathInit = `new ${prop.qPath}(this.withPrefix(\"${odataName}\")${converterStmt ? `, ${converterStmt}` : \"\"})`;\n }\n // add import for data type\n importContainer.addFromQObject(prop.qPath);\n }\n\n return {\n name,\n scope: Scope.Public,\n isReadonly: true,\n initializer: qPathInit,\n } as OptionalKind<PropertyDeclarationStructure>;\n });\n }\n\n private generateConverterStmt(converters: Array<ValueConverterImport> | undefined, importContainer: ImportContainer) {\n if (!converters?.length) {\n return;\n }\n converters.forEach((converter) => {\n importContainer.addCustomType(converter.package, converter.converterId);\n });\n\n if (converters.length === 1) {\n return converters[0].converterId;\n } else {\n importContainer.addCustomType(\"@odata2ts/converter-runtime\", \"createChain\");\n\n const [first, second, ...moreConverters] = converters;\n return moreConverters.reduce(\n (stmt, conv) => `${stmt}.chain(${conv.converterId})`,\n `createChain(${first.converterId}, ${second.converterId})`\n );\n }\n }\n\n private generateIdFunction(model: ModelType, importContainer: ImportContainer) {\n const qFunc = \"QId\";\n importContainer.addFromQObject(qFunc);\n importContainer.addGeneratedModel(model.idModelName);\n\n this.sourceFile.addClass({\n name: model.qIdFunctionName,\n isExported: true,\n extends: `${qFunc}<${model.idModelName}>`,\n properties: [\n {\n name: \"params\",\n scope: Scope.Private,\n isReadonly: true,\n initializer: this.getParamInitString(model.keys, importContainer),\n },\n ],\n methods: [\n {\n name: \"getParams\",\n statements: [\"return this.params\"],\n },\n ],\n });\n }\n\n private getParamInitString(props: Array<PropertyModel>, importContainer: ImportContainer) {\n return `[${props\n .map((prop) => {\n const isComplexParam = prop.dataType === DataTypes.ModelType || prop.dataType === DataTypes.ComplexType;\n if (prop.qParam) {\n importContainer.addFromQObject(prop.qParam);\n }\n const isMappedNameNecessary = prop.odataName !== prop.name;\n const mappedName = isMappedNameNecessary ? `\"${prop.name}\"` : prop.converters?.length ? \"undefined\" : undefined;\n const converterStmt = this.generateConverterStmt(prop.converters, importContainer);\n const mappedNameParam = mappedName ? `, ${mappedName}` : \"\";\n const complexQParam = isComplexParam ? `, new ${prop.qObject}()` : \"\";\n const converterParam = converterStmt ? `, ${converterStmt}` : \"\";\n return `new ${prop.qParam}(\"${prop.odataName}\"${complexQParam}${mappedNameParam}${converterParam})`;\n })\n .join(\",\")}]`;\n }\n\n private generateUnboundOperations(importContainer: ImportContainer) {\n this.dataModel.getUnboundOperationTypes().forEach((operation) => {\n this.generateOperation(operation, importContainer);\n });\n }\n\n private generateBoundOperations(fqEntityName: string, importContainer: ImportContainer) {\n [\n ...this.dataModel.getEntityTypeOperations(fqEntityName),\n ...this.dataModel.getEntitySetOperations(fqEntityName),\n ].forEach((operation) => {\n this.generateOperation(operation, importContainer);\n });\n }\n\n private generateOperation(operation: OperationType, importContainer: ImportContainer) {\n const isV2 = this.version === ODataVersions.V2;\n const qOperation = operation.type === OperationTypes.Action ? \"QAction\" : \"QFunction\";\n const returnType = operation.returnType;\n let returnTypeOpStmt: string = \"\";\n const hasParams = operation.parameters.length > 0;\n importContainer.addFromQObject(qOperation);\n if (hasParams) {\n importContainer.addGeneratedModel(operation.paramsModelName);\n }\n if (returnType) {\n if (returnType.dataType === DataTypes.ComplexType || returnType.dataType === DataTypes.ModelType) {\n if (returnType.qObject) {\n importContainer.addFromQObject(\"OperationReturnType\", \"ReturnTypes\", \"QComplexParam\");\n returnTypeOpStmt = `new OperationReturnType(ReturnTypes.COMPLEX${\n returnType.isCollection ? \"_COLLECTION\" : \"\"\n }, new QComplexParam(\"NONE\", new ${returnType.qObject}))`;\n }\n }\n // currently, it only makes sense to add the OperationReturnType if a converter is present\n else if (returnType.converters && returnType.qParam) {\n importContainer.addFromQObject(\"OperationReturnType\", \"ReturnTypes\", returnType.qParam);\n const rtKind = \"ReturnTypes.VALUE\" + (returnType.isCollection ? \"_COLLECTION\" : \"\");\n const converterParam = returnType.converters\n ? \", \" + this.generateConverterStmt(returnType.converters, importContainer)\n : \"\";\n returnTypeOpStmt = `new OperationReturnType(${rtKind}, new ${returnType.qParam}(\"NONE\", undefined${converterParam}))`;\n }\n }\n\n this.sourceFile.addClass({\n name: operation.qName,\n isExported: true,\n extends: qOperation + (hasParams ? `<${operation.paramsModelName}>` : \"\"),\n properties: [\n {\n name: \"params\",\n scope: Scope.Private,\n isReadonly: true,\n type: operation.parameters?.length ? undefined : \"[]\",\n initializer: this.getParamInitString(operation.parameters, importContainer),\n },\n ],\n ctors: [\n {\n statements: [\n `super(\"${operation.odataName}\"${returnTypeOpStmt ? \", \" + returnTypeOpStmt : isV2 ? \", undefined\" : \"\"}${\n isV2 ? \", { v2Mode: true }\" : \"\"\n })`,\n ],\n },\n ],\n methods: [\n {\n name: \"getParams\",\n statements: [\"return this.params\"],\n },\n // functions without params: add an overriding buildUrl() to not force users to have to pass undefined as param\n ...(operation.type === OperationTypes.Function && !hasParams\n ? [\n {\n name: \"buildUrl\",\n statements: [\"return super.buildUrl(undefined)\"],\n },\n ]\n : []),\n ],\n });\n }\n}\n"]}
1
+ {"version":3,"file":"QueryObjectGenerator.js","sourceRoot":"","sources":["../../src/generator/QueryObjectGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["import { ValueConverterImport } from \"@odata2ts/converter-runtime\";\nimport { ODataVersions } from \"@odata2ts/odata-core\";\nimport { OptionalKind, PropertyDeclarationStructure, Scope, VariableDeclarationKind } from \"ts-morph\";\nimport { firstCharLowerCase } from \"xml2js/lib/processors\";\n\nimport { DataModel } from \"../data-model/DataModel\";\nimport {\n ComplexType,\n DataTypes,\n EntityType,\n OperationType,\n OperationTypes,\n PropertyModel,\n} 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 { QueryObjectImports } from \"./import/ImportObjects\";\nimport { ImportContainer } from \"./ImportContainer\";\n\nexport const generateQueryObjects: EntityBasedGeneratorFunction = (\n project,\n dataModel,\n version,\n options,\n namingHelper\n) => {\n const generator = new QueryObjectGenerator(project, dataModel, version, options, namingHelper);\n return generator.generate();\n};\n\nclass QueryObjectGenerator {\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.initQObjects();\n\n // process EntityType & ComplexType\n const promises: Array<Promise<void>> = [...this.generateEntityTypes(), ...this.generateComplexTypes()];\n if (!this.options.skipOperations) {\n // process unbound operations\n promises.push(this.generateUnboundOperations());\n }\n\n await Promise.all(promises);\n\n return this.project.finalizeQObjects();\n }\n\n private generateEntityTypes() {\n return this.dataModel.getEntityTypes().map((model) => {\n const file = this.project.createOrGetQObjectFile(model.folderPath, model.qName, [\n model.qName,\n firstCharLowerCase(model.qName),\n model.id.qName,\n ]);\n\n // q object\n this.generateModel(file, model);\n\n // qId function\n if (!this.options.skipIdModels && model.generateId) {\n this.generateIdFunction(file, model);\n }\n\n // bound q operations\n if (!this.options.skipOperations) {\n [\n ...this.dataModel.getEntityTypeOperations(model.fqName),\n ...this.dataModel.getEntitySetOperations(model.fqName),\n ].forEach((operation) => {\n this.generateOperation(file, operation, model.fqName);\n });\n }\n\n return this.project.finalizeFile(file);\n });\n }\n\n private generateComplexTypes() {\n return this.dataModel.getComplexTypes().map((model) => {\n const file = this.project.createOrGetQObjectFile(model.folderPath, model.qName, [\n model.qName,\n firstCharLowerCase(model.qName),\n ]);\n\n this.generateModel(file, model);\n\n return this.project.finalizeFile(file);\n });\n }\n\n private generateModel(file: FileHandler, model: ComplexType) {\n const imports = file.getImports();\n\n let extendsClause: string;\n if (model.baseClasses.length) {\n const baseClass = model.baseClasses[0];\n const baseModel = this.dataModel.getModel(baseClass) as ComplexType;\n if (!baseModel) {\n throw new Error(`Entity or complex type \"${baseClass}\" from baseClass attribute not found!`);\n }\n extendsClause = imports.addGeneratedQObject(baseClass, baseModel.qName);\n } else {\n [extendsClause] = imports.addQObject(QueryObjectImports.QueryObject);\n }\n\n file.getFile().addClass({\n name: model.qName,\n isExported: true,\n extends: extendsClause,\n // isAbstract: model.abstract,\n properties: this.generateQueryObjectProps(file.getImports(), model.props),\n });\n\n file.getFile().addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n isExported: true,\n declarations: [\n {\n name: firstCharLowerCase(model.qName),\n initializer: `new ${model.qName}()`,\n },\n ],\n });\n }\n\n private generateQueryObjectProps(\n importContainer: ImportContainer,\n props: Array<PropertyModel>\n ): Array<OptionalKind<PropertyDeclarationStructure>> {\n return props.map((prop) => {\n const { odataName } = prop;\n const name = this.namingHelper.getQPropName(prop.name);\n const isModelType = prop.dataType === DataTypes.ModelType || prop.dataType === DataTypes.ComplexType;\n let qPathInit: string;\n\n // factor in collections\n if (prop.isCollection) {\n const cType = isModelType ? QueryObjectImports.QEntityCollectionPath : QueryObjectImports.QCollectionPath;\n const collectionType = importContainer.addQObject(cType);\n const qObject = isModelType\n ? importContainer.addGeneratedQObject(prop.fqType, prop.qObject!)\n : importContainer.addFromQObject(prop.qObject!)[0];\n\n qPathInit = `new ${collectionType}(this.withPrefix(\"${odataName}\"), () => ${qObject})`;\n } else {\n // add import for data type\n const qPath = importContainer.addFromQObject(prop.qPath);\n if (isModelType) {\n const qObject = importContainer.addGeneratedQObject(prop.fqType, prop.qObject!);\n qPathInit = `new ${qPath}(this.withPrefix(\"${odataName}\"), () => ${qObject})`;\n } else {\n let converterStmt = this.generateConverterStmt(importContainer, prop.converters);\n qPathInit = `new ${qPath}(this.withPrefix(\"${odataName}\")${converterStmt ? `, ${converterStmt}` : \"\"})`;\n }\n }\n\n return {\n name,\n scope: Scope.Public,\n isReadonly: true,\n initializer: qPathInit,\n } as OptionalKind<PropertyDeclarationStructure>;\n });\n }\n\n private generateConverterStmt(importContainer: ImportContainer, converters: Array<ValueConverterImport> | undefined) {\n if (!converters?.length) {\n return undefined;\n }\n const converterIds = converters.map((converter) => {\n return importContainer.addCustomType(converter.package, converter.converterId);\n });\n\n if (converterIds.length === 1) {\n return converterIds[0];\n } else {\n const createChain = importContainer.addCustomType(\"@odata2ts/converter-runtime\", \"createChain\");\n\n const [first, second, ...moreConverters] = converterIds;\n return moreConverters.reduce((stmt, convId) => `${stmt}.chain(${convId})`, `${createChain}(${first}, ${second})`);\n }\n }\n\n private generateIdFunction(file: FileHandler, model: EntityType) {\n const importContainer = file.getImports();\n const qFunc = importContainer.addQObject(QueryObjectImports.QId);\n const idModelName = importContainer.addGeneratedModel(model.fqName, model.id.modelName);\n\n file.getFile().addClass({\n name: model.id.qName,\n isExported: true,\n extends: `${qFunc}<${idModelName}>`,\n properties: [\n {\n name: \"params\",\n scope: Scope.Private,\n isReadonly: true,\n initializer: this.getParamInitString(importContainer, model.keys),\n },\n ],\n methods: [\n {\n name: \"getParams\",\n statements: [\"return this.params\"],\n },\n ],\n });\n }\n\n private getParamInitString(importContainer: ImportContainer, props: Array<PropertyModel>) {\n return `[${props\n .map((prop) => {\n let complexQParam = \"\";\n if (prop.dataType === DataTypes.ModelType || prop.dataType === DataTypes.ComplexType) {\n const importedQObject = importContainer.addGeneratedQObject(prop.fqType, prop.qObject!);\n complexQParam = `, new ${importedQObject}()`;\n }\n\n const qParam = importContainer.addFromQObject(prop.qParam!);\n const isMappedNameNecessary = prop.odataName !== prop.name;\n const mappedName = isMappedNameNecessary ? `\"${prop.name}\"` : prop.converters?.length ? \"undefined\" : undefined;\n const converterStmt = this.generateConverterStmt(importContainer, prop.converters);\n const mappedNameParam = mappedName ? `, ${mappedName}` : \"\";\n const converterParam = converterStmt ? `, ${converterStmt}` : \"\";\n return `new ${qParam}(\"${prop.odataName}\"${complexQParam}${mappedNameParam}${converterParam})`;\n })\n .join(\",\")}]`;\n }\n\n private async generateUnboundOperations() {\n const unboundOps = this.dataModel.getUnboundOperationTypes();\n const reservedNames = unboundOps.map((op) => op.qName);\n const file = this.project.createOrGetMainQObjectFile(reservedNames);\n\n unboundOps.forEach((operation) => {\n this.generateOperation(file, operation, \"\");\n });\n }\n\n private generateOperation(file: FileHandler, operation: OperationType, baseFqName: string) {\n const imports = file.getImports();\n const isV2 = this.version === ODataVersions.V2;\n const returnType = operation.returnType;\n const hasParams = operation.parameters.length > 0;\n\n // imports\n const qOp = operation.type === OperationTypes.Action ? QueryObjectImports.QAction : QueryObjectImports.QFunction;\n const qOperation = imports.addQObject(qOp);\n const paramModelName = operation.parameters.length\n ? imports.addGeneratedModel(baseFqName, operation.paramsModelName)\n : undefined;\n\n let returnTypeOpStmt: string = \"\";\n if (returnType) {\n const collectionSuffix = returnType.isCollection ? \"_COLLECTION\" : \"\";\n if (returnType.dataType === DataTypes.ComplexType || returnType.dataType === DataTypes.ModelType) {\n if (returnType.qObject) {\n const [opRt, rts, qComplexParam] = imports.addQObject(\n QueryObjectImports.OperationReturnType,\n QueryObjectImports.ReturnTypes,\n QueryObjectImports.QComplexParam\n );\n const returnQName = imports.addGeneratedQObject(returnType.fqType, returnType.qObject);\n\n returnTypeOpStmt = `new ${opRt}(${rts}.COMPLEX${collectionSuffix}, new ${qComplexParam}(\"NONE\", new ${returnQName}))`;\n }\n }\n // currently, it only makes sense to add the OperationReturnType if a converter is present\n else if (returnType.converters && returnType.qParam) {\n const [rtClass, rtTypes] = imports.addQObject(\n QueryObjectImports.OperationReturnType,\n QueryObjectImports.ReturnTypes\n );\n const [qParam] = imports.addFromQObject(returnType.qParam);\n\n // TODO: some constants with string concat\n const rtKind = `${rtTypes}.VALUE${collectionSuffix}`;\n\n const converterParam = returnType.converters\n ? \", \" + this.generateConverterStmt(imports, returnType.converters)\n : \"\";\n returnTypeOpStmt = `new ${rtClass}(${rtKind}, new ${qParam}(\"NONE\", undefined${converterParam}))`;\n }\n }\n\n file.getFile().addClass({\n name: operation.qName,\n isExported: true,\n extends: qOperation + (hasParams ? `<${paramModelName}>` : \"\"),\n properties: [\n {\n name: \"params\",\n scope: Scope.Private,\n isReadonly: true,\n type: operation.parameters?.length ? undefined : \"[]\",\n initializer: this.getParamInitString(imports, operation.parameters),\n },\n ],\n ctors: [\n {\n statements: [\n `super(\"${operation.odataName}\"${returnTypeOpStmt ? \", \" + returnTypeOpStmt : isV2 ? \", undefined\" : \"\"}${\n isV2 ? \", { v2Mode: true }\" : \"\"\n })`,\n ],\n },\n ],\n methods: [\n {\n name: \"getParams\",\n statements: [\"return this.params\"],\n },\n // functions without params: add an overriding buildUrl() to not force users to have to pass undefined as param\n ...(operation.type === OperationTypes.Function && !hasParams\n ? [\n {\n name: \"buildUrl\",\n statements: [\"return super.buildUrl(undefined)\"],\n },\n ]\n : []),\n ],\n });\n }\n}\n"]}
@@ -8,4 +8,4 @@ export interface PropsAndOps extends Required<Pick<ClassDeclarationStructure, "p
8
8
  }
9
9
  export interface ServiceGeneratorOptions extends Pick<ConfigFileOptions, "enablePrimitivePropertyServices" | "v4BigNumberAsString"> {
10
10
  }
11
- export declare function generateServices(dataModel: DataModel, project: ProjectManager, version: ODataVersions, namingHelper: NamingHelper, options?: ServiceGeneratorOptions): Promise<void>;
11
+ export declare function generateServices(project: ProjectManager, dataModel: DataModel, version: ODataVersions, namingHelper: NamingHelper, options?: ServiceGeneratorOptions): Promise<void>;