@sap-ux/xml-odata-annotation-converter 0.1.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.
Files changed (59) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +55 -0
  3. package/dist/index.d.ts +3 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +23 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/parser/attribute-getters.d.ts +18 -0
  8. package/dist/parser/attribute-getters.d.ts.map +1 -0
  9. package/dist/parser/attribute-getters.js +28 -0
  10. package/dist/parser/attribute-getters.js.map +1 -0
  11. package/dist/parser/document.d.ts +11 -0
  12. package/dist/parser/document.d.ts.map +1 -0
  13. package/dist/parser/document.js +325 -0
  14. package/dist/parser/document.js.map +1 -0
  15. package/dist/parser/element-getters.d.ts +10 -0
  16. package/dist/parser/element-getters.d.ts.map +1 -0
  17. package/dist/parser/element-getters.js +15 -0
  18. package/dist/parser/element-getters.js.map +1 -0
  19. package/dist/parser/escaping.d.ts +8 -0
  20. package/dist/parser/escaping.d.ts.map +1 -0
  21. package/dist/parser/escaping.js +21 -0
  22. package/dist/parser/escaping.js.map +1 -0
  23. package/dist/parser/index.d.ts +4 -0
  24. package/dist/parser/index.d.ts.map +1 -0
  25. package/dist/parser/index.js +10 -0
  26. package/dist/parser/index.js.map +1 -0
  27. package/dist/parser/metadata.d.ts +11 -0
  28. package/dist/parser/metadata.d.ts.map +1 -0
  29. package/dist/parser/metadata.js +515 -0
  30. package/dist/parser/metadata.js.map +1 -0
  31. package/dist/parser/range.d.ts +37 -0
  32. package/dist/parser/range.d.ts.map +1 -0
  33. package/dist/parser/range.js +67 -0
  34. package/dist/parser/range.js.map +1 -0
  35. package/dist/printer/builders.d.ts +49 -0
  36. package/dist/printer/builders.d.ts.map +1 -0
  37. package/dist/printer/builders.js +138 -0
  38. package/dist/printer/builders.js.map +1 -0
  39. package/dist/printer/csdl-to-xml.d.ts +23 -0
  40. package/dist/printer/csdl-to-xml.d.ts.map +1 -0
  41. package/dist/printer/csdl-to-xml.js +160 -0
  42. package/dist/printer/csdl-to-xml.js.map +1 -0
  43. package/dist/printer/document-modifier.d.ts +6 -0
  44. package/dist/printer/document-modifier.d.ts.map +1 -0
  45. package/dist/printer/document-modifier.js +47 -0
  46. package/dist/printer/document-modifier.js.map +1 -0
  47. package/dist/printer/index.d.ts +5 -0
  48. package/dist/printer/index.d.ts.map +1 -0
  49. package/dist/printer/index.js +31 -0
  50. package/dist/printer/index.js.map +1 -0
  51. package/dist/printer/namespaces.d.ts +3 -0
  52. package/dist/printer/namespaces.d.ts.map +1 -0
  53. package/dist/printer/namespaces.js +6 -0
  54. package/dist/printer/namespaces.js.map +1 -0
  55. package/dist/printer/serializer-edmx.d.ts +46 -0
  56. package/dist/printer/serializer-edmx.d.ts.map +1 -0
  57. package/dist/printer/serializer-edmx.js +214 -0
  58. package/dist/printer/serializer-edmx.js.map +1 -0
  59. package/package.json +59 -0
@@ -0,0 +1,515 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.convertMetadataDocument = void 0;
4
+ const odata_annotation_core_1 = require("@sap-ux/odata-annotation-core");
5
+ const attribute_getters_1 = require("./attribute-getters");
6
+ const range_1 = require("./range");
7
+ const element_getters_1 = require("./element-getters");
8
+ const EDMX_METADATA_ELEMENT_NAMES = new Set([
9
+ "Schema" /* Edm.Schema */,
10
+ "EntityType" /* Edm.EntityType */,
11
+ "ComplexType" /* Edm.ComplexType */,
12
+ "Property" /* Edm.Property */,
13
+ "NavigationProperty" /* Edm.NavigationProperty */,
14
+ "EntityContainer" /* Edm.EntityContainer */,
15
+ "EntitySet" /* Edm.EntitySet */,
16
+ "Singleton" /* Edm.Singleton */,
17
+ "Function" /* Edm.Function */,
18
+ "Action" /* Edm.Action */,
19
+ "FunctionImport" /* Edm.FunctionImport */,
20
+ "ActionImport" /* Edm.ActionImport */,
21
+ "Parameter" /* Edm.Parameter */,
22
+ "ReturnType" /* Edm.ReturnType */
23
+ ]);
24
+ const ENTITY_TYPE_NAMES = new Set(["EntityType" /* Edm.EntityType */, "Singleton" /* Edm.Singleton */, "EntitySet" /* Edm.EntitySet */, "NavigationProperty" /* Edm.NavigationProperty */]);
25
+ const STRUCTURED_TYPE_NAMES = new Set([
26
+ "Singleton" /* Edm.Singleton */,
27
+ "EntitySet" /* Edm.EntitySet */,
28
+ "NavigationProperty" /* Edm.NavigationProperty */,
29
+ "ActionImport" /* Edm.ActionImport */,
30
+ "FunctionImport" /* Edm.FunctionImport */
31
+ ]);
32
+ const METADATA_ROOT_TYPE_NAMES = new Set([
33
+ "EntityType" /* Edm.EntityType */,
34
+ "ComplexType" /* Edm.ComplexType */,
35
+ "Function" /* Edm.Function */,
36
+ "Action" /* Edm.Action */,
37
+ "EntityContainer" /* Edm.EntityContainer */
38
+ ]);
39
+ const PARAMETER_TYPE_NAMES = new Set(["Property" /* Edm.Property */, "ReturnType" /* Edm.ReturnType */, "Parameter" /* Edm.Parameter */]);
40
+ const EDM_ENTITY_TYPE = 'Edm.EntityType';
41
+ const EDM_COMPLEX_TYPE = 'EDM_COMPLEX_TYPE';
42
+ /**
43
+ * Traverses the XML document and collects metadata element definitions.
44
+ *
45
+ * @param uri Uri of the document.
46
+ * @param document XML document containing metadata.
47
+ * @returns an array of MetadataElements extracted from the XML document.
48
+ */
49
+ function convertMetadataDocument(uri, document) {
50
+ const root = document.rootElement;
51
+ if (!root) {
52
+ return [];
53
+ }
54
+ const aliasMap = getNamespaceMap(root);
55
+ const dataServices = (0, element_getters_1.getElementsWithName)("DataServices" /* Edmx.DataServices */, root);
56
+ const schemas = dataServices.length ? (0, element_getters_1.getElementsWithName)("Schema" /* Edm.Schema */, dataServices[0]) : [];
57
+ const metadataElements = [];
58
+ for (const schema of schemas) {
59
+ convertSchema(schema, aliasMap, uri, metadataElements);
60
+ }
61
+ return metadataElements;
62
+ }
63
+ exports.convertMetadataDocument = convertMetadataDocument;
64
+ /**
65
+ * Collects metadata element definitions from given schema.
66
+ *
67
+ * @param schema schema element
68
+ * @param aliasMap alias map
69
+ * @param uri Uri of the document
70
+ * @param metadataElements metadata element collector array
71
+ */
72
+ function convertSchema(schema, aliasMap, uri, metadataElements) {
73
+ var _a, _b;
74
+ const namespace = (_a = (0, attribute_getters_1.getElementAttributeByName)('Namespace', schema)) === null || _a === void 0 ? void 0 : _a.value;
75
+ if (!namespace) {
76
+ return;
77
+ }
78
+ const typeMap = {};
79
+ // loop over all direct schema children and collect type information
80
+ const currentNamespace = (0, attribute_getters_1.getAttributeValue)('Namespace', schema);
81
+ for (const element of schema.subElements) {
82
+ const name = (0, attribute_getters_1.getAttributeValue)('Name', element);
83
+ let type = '';
84
+ switch (element.name) {
85
+ case "TypeDefinition" /* Edm.TypeDefinition */:
86
+ case "EnumType" /* Edm.EnumType */:
87
+ type = (0, attribute_getters_1.getAttributeValue)('UnderlyingType', element) || 'Edm.Int32';
88
+ break;
89
+ case "EntityType" /* Edm.EntityType */:
90
+ type = EDM_ENTITY_TYPE;
91
+ break;
92
+ case "ComplexType" /* Edm.ComplexType */:
93
+ type = EDM_COMPLEX_TYPE;
94
+ break;
95
+ }
96
+ if (name && type) {
97
+ typeMap[currentNamespace + '.' + name] = type;
98
+ }
99
+ }
100
+ const associationMap = {};
101
+ const associations = (_b = (0, element_getters_1.getElementsWithName)('Association', schema)) !== null && _b !== void 0 ? _b : [];
102
+ for (const association of associations) {
103
+ const name = (0, attribute_getters_1.getAttributeValue)('Name', association);
104
+ if (name) {
105
+ associationMap[name] = createAssociation((0, element_getters_1.getElementsWithName)('End', association), aliasMap, namespace);
106
+ }
107
+ }
108
+ const context = {
109
+ namespace,
110
+ typeMap,
111
+ aliasMap,
112
+ associationMap,
113
+ parentPath: '',
114
+ uri: uri
115
+ };
116
+ for (const child of schema.subElements) {
117
+ const element = convertMetadataElement(context, child);
118
+ if (element) {
119
+ metadataElements.push(element);
120
+ }
121
+ }
122
+ }
123
+ /**
124
+ *
125
+ * @param context Conversion context
126
+ * @param element Source XML element
127
+ * @returns matching MetadataElement if it exists for the given XML element
128
+ */
129
+ function convertMetadataElement(context, element) {
130
+ var _a;
131
+ if (!element.name || !EDMX_METADATA_ELEMENT_NAMES.has(element.name)) {
132
+ return undefined;
133
+ }
134
+ const metadataElement = createMetadataNode(context, element);
135
+ if (metadataElement) {
136
+ const sortedContentNodes = [...element.subElements].sort((a, b) => a.position.startOffset - b.position.endOffset);
137
+ if (!metadataElement.content) {
138
+ metadataElement.content = [];
139
+ }
140
+ for (const child of sortedContentNodes) {
141
+ const childElement = convertMetadataElement(Object.assign(Object.assign({}, context), { parentPath: context.parentPath !== ''
142
+ ? `${context.parentPath}/${metadataElement.name}`
143
+ : metadataElement.name }), child);
144
+ if (childElement) {
145
+ (_a = metadataElement.content) === null || _a === void 0 ? void 0 : _a.push(childElement);
146
+ }
147
+ }
148
+ }
149
+ return metadataElement;
150
+ }
151
+ /**
152
+ *
153
+ * @param context Conversion context
154
+ * @param element Source XML element
155
+ * @returns matching MetadataElement if it exists for the given XML element
156
+ */
157
+ function createMetadataNode(context, element) {
158
+ let typeAttrName;
159
+ switch (element.name) {
160
+ case "EntitySet" /* Edm.EntitySet */:
161
+ typeAttrName = 'EntityType';
162
+ break;
163
+ case "FunctionImport" /* Edm.FunctionImport */:
164
+ typeAttrName = 'Function'; // to make FunctionImport reference the Function
165
+ break;
166
+ case "ActionImport" /* Edm.ActionImport */:
167
+ typeAttrName = 'Action'; // to make ActionImport reference the Action
168
+ break;
169
+ default:
170
+ typeAttrName = 'Type';
171
+ }
172
+ let type = attributeValueToFullyQualifiedName(typeAttrName, context.aliasMap, context.namespace, element);
173
+ if (!type) {
174
+ if (element.name === "FunctionImport" /* Edm.FunctionImport */) {
175
+ // OData V2: FunctionImport
176
+ type = (0, attribute_getters_1.getAttributeValue)('ReturnType', element);
177
+ }
178
+ else if (element.name === "NavigationProperty" /* Edm.NavigationProperty */) {
179
+ // OData V2: use association information to determine Type
180
+ type = getTypeForNavigationProperty(context, element);
181
+ }
182
+ }
183
+ const forAction = element.name === "Action" /* Edm.Action */ || element.name === "Function" /* Edm.Function */;
184
+ return createMetadataElementNodeForType(context, element, type, forAction);
185
+ }
186
+ /**
187
+ * Calculates type for navigation property based on association information.
188
+ *
189
+ * @param context context
190
+ * @param element nav property XML element
191
+ * @returns type or undefined
192
+ */
193
+ function getTypeForNavigationProperty(context, element) {
194
+ const relationship = attributeValueToFullyQualifiedName('Relationship', context.aliasMap, context.namespace, element);
195
+ if (!relationship) {
196
+ return undefined;
197
+ }
198
+ const associationName = relationship.split('.').pop();
199
+ if (!associationName) {
200
+ return undefined;
201
+ }
202
+ const association = context.associationMap[associationName];
203
+ if (!association) {
204
+ return undefined;
205
+ }
206
+ const toRole = attributeValueToFullyQualifiedName('ToRole', context.aliasMap, context.namespace, element);
207
+ if (!toRole) {
208
+ return undefined;
209
+ }
210
+ const role = association[toRole];
211
+ if (role === null || role === void 0 ? void 0 : role.type) {
212
+ return role.multiplicity === '*' ? `Collection(${role.type})` : role.type;
213
+ }
214
+ return undefined;
215
+ }
216
+ /**
217
+ * @param context Conversion context
218
+ * @param element Source XML element
219
+ * @param type Fully qualified type name
220
+ * @param forAction Indicates if overloads should be checked
221
+ * @returns matching MetadataElement if it exists for the given XML element
222
+ */
223
+ function createMetadataElementNodeForType(context, element, type, forAction = false) {
224
+ var _a, _b, _c;
225
+ if (element.name === null) {
226
+ return undefined;
227
+ }
228
+ // build metadata element
229
+ const metadataElementProperties = {
230
+ isAnnotatable: true,
231
+ kind: element.name,
232
+ name: getMetadataElementName(context, element, forAction),
233
+ isCollectionValued: !!(type === null || type === void 0 ? void 0 : type.startsWith('Collection(')) || element.name === "EntitySet" /* Edm.EntitySet */,
234
+ isComplexType: element.name === "ComplexType" /* Edm.ComplexType */,
235
+ isEntityType: ENTITY_TYPE_NAMES.has((_a = element.name) !== null && _a !== void 0 ? _a : '')
236
+ };
237
+ if (element.name === "EntityType" /* Edm.EntityType */) {
238
+ const keys = getKeys(element);
239
+ if (keys === null || keys === void 0 ? void 0 : keys.length) {
240
+ metadataElementProperties.keys = keys;
241
+ }
242
+ }
243
+ // adjust metadata element based on type information
244
+ const functionImportV2Nodes = (_b = adjustMetadataElement(context, element, type, metadataElementProperties)) !== null && _b !== void 0 ? _b : [];
245
+ const v2ActionFor = attributeValueToFullyQualifiedName('sap:action-for', context.aliasMap, context.namespace, element);
246
+ if ("FunctionImport" /* Edm.FunctionImport */ === element.name && v2ActionFor) {
247
+ // generate binding parameter sub node with name '_it'
248
+ const bindingParameterProperties = {
249
+ isAnnotatable: false,
250
+ kind: "Parameter" /* Edm.Parameter */,
251
+ name: '_it',
252
+ isCollectionValued: false,
253
+ isComplexType: false,
254
+ isEntityType: true,
255
+ structuredType: v2ActionFor
256
+ };
257
+ const attributePosition = (_c = (0, attribute_getters_1.getElementAttributeByName)('sap:action-for', element)) === null || _c === void 0 ? void 0 : _c.position;
258
+ const bindingParameterRange = (0, range_1.transformElementRange)(attributePosition !== null && attributePosition !== void 0 ? attributePosition : element.position, element);
259
+ functionImportV2Nodes.push(Object.assign({ path: `${context.parentPath}/${metadataElementProperties.name}/${bindingParameterProperties.name}`, location: bindingParameterRange ? odata_annotation_core_1.Location.create(context.uri, bindingParameterRange) : undefined, content: [] }, bindingParameterProperties));
260
+ }
261
+ const range = (0, range_1.transformElementRange)(element.position, element);
262
+ return Object.assign({ path: context.parentPath
263
+ ? `${context.parentPath}/${metadataElementProperties.name}`
264
+ : metadataElementProperties.name, location: range ? odata_annotation_core_1.Location.create(context.uri, range) : undefined, content: functionImportV2Nodes }, metadataElementProperties);
265
+ }
266
+ /**
267
+ * Creates metadata element name.
268
+ *
269
+ * @param context context
270
+ * @param element XML element
271
+ * @param forAction boolen flag indicating processing of action element
272
+ * @returns metadata element name
273
+ */
274
+ function getMetadataElementName(context, element, forAction) {
275
+ var _a;
276
+ // determine metadata element name
277
+ let metadataElementName = (0, attribute_getters_1.getAttributeValue)('Name', element);
278
+ if (forAction) {
279
+ if (element.name === "Action" /* Edm.Action */ && (0, attribute_getters_1.getAttributeValue)('IsBound', element) !== 'true') {
280
+ metadataElementName += '()'; // unbound actions do not support overloading
281
+ }
282
+ else {
283
+ metadataElementName = getOverloadName(context, element);
284
+ }
285
+ }
286
+ if (METADATA_ROOT_TYPE_NAMES.has((_a = element.name) !== null && _a !== void 0 ? _a : '') && context.namespace) {
287
+ metadataElementName = context.namespace + '.' + metadataElementName;
288
+ }
289
+ else if (element.name === "ReturnType" /* Edm.ReturnType */) {
290
+ metadataElementName = '$ReturnType';
291
+ }
292
+ return metadataElementName;
293
+ }
294
+ /**
295
+ * Returns primitive type name based on current type and element name.
296
+ *
297
+ * @param typeName type name
298
+ * @param baseTypeName base type name
299
+ * @param elementName element name
300
+ * @returns primitive type name
301
+ */
302
+ function getPrimitiveTypeName(typeName, baseTypeName, elementName) {
303
+ let edmPrimitiveType = '';
304
+ if (typeName.startsWith('Edm.')) {
305
+ edmPrimitiveType = typeName; // original types namespace is Edm
306
+ }
307
+ else if (baseTypeName !== EDM_COMPLEX_TYPE &&
308
+ baseTypeName !== EDM_ENTITY_TYPE &&
309
+ elementName !== "FunctionImport" /* Edm.FunctionImport */ &&
310
+ elementName !== "ActionImport" /* Edm.ActionImport */) {
311
+ // original type is defined in metadata but based on a primitive type
312
+ edmPrimitiveType = baseTypeName;
313
+ }
314
+ return edmPrimitiveType;
315
+ }
316
+ /**
317
+ * Adjusts medatata element properties and returns V2 function import md nodes (in case of FunctionImport element) or empty array.
318
+ *
319
+ * @param context context
320
+ * @param element element
321
+ * @param type type
322
+ * @param metadataElementProperties md element properties
323
+ * @returns V2 function import md nodes
324
+ */
325
+ function adjustMetadataElement(context, element, type, metadataElementProperties) {
326
+ var _a;
327
+ /**
328
+ * Converts to singular type name.
329
+ *
330
+ * @param fqTypeName Fully qualified name for a type.
331
+ * @returns singular type name.
332
+ */
333
+ function getTypeName(fqTypeName) {
334
+ // links always go to entityTypes/complexTypes/functions or actions, which are defined as direct container children
335
+ // --> use fully qualified name as path with single segment (strip Collection())
336
+ return fqTypeName.startsWith('Collection(') ? fqTypeName.slice(11, -1) : fqTypeName;
337
+ }
338
+ if (!type) {
339
+ return undefined;
340
+ }
341
+ const typeName = getTypeName(type);
342
+ const baseTypeName = context.typeMap[typeName] || typeName;
343
+ // primitive type name
344
+ const edmPrimitiveType = getPrimitiveTypeName(typeName, baseTypeName, element.name);
345
+ if (edmPrimitiveType && element.name !== "FunctionImport" /* Edm.FunctionImport */) {
346
+ metadataElementProperties.edmPrimitiveType = edmPrimitiveType;
347
+ }
348
+ // structured type name
349
+ handleStructuredTypeElement(element, typeName, baseTypeName, metadataElementProperties);
350
+ // function import
351
+ if ("FunctionImport" /* Edm.FunctionImport */ === element.name && (0, attribute_getters_1.getAttributeValue)('ReturnType', element)) {
352
+ const functionImportV2Nodes = [];
353
+ const returnTypeProperties = getReturnTypeProperties(baseTypeName, type, typeName, edmPrimitiveType);
354
+ const attributePosition = (_a = (0, attribute_getters_1.getElementAttributeByName)('ReturnType', element)) === null || _a === void 0 ? void 0 : _a.position;
355
+ const returnRange = (0, range_1.transformElementRange)(attributePosition !== null && attributePosition !== void 0 ? attributePosition : element.position, element);
356
+ functionImportV2Nodes.push(Object.assign({ path: `${context.parentPath}/${metadataElementProperties.name}/${returnTypeProperties.name}`, location: returnRange ? odata_annotation_core_1.Location.create(context.uri, returnRange) : undefined, content: [] }, returnTypeProperties));
357
+ return functionImportV2Nodes;
358
+ }
359
+ return undefined;
360
+ }
361
+ /**
362
+ *
363
+ * @param element
364
+ * @param typeName
365
+ * @param baseTypeName
366
+ * @param metadataElementProperties
367
+ */
368
+ function handleStructuredTypeElement(element, typeName, baseTypeName, metadataElementProperties) {
369
+ var _a, _b;
370
+ if (STRUCTURED_TYPE_NAMES.has((_a = element.name) !== null && _a !== void 0 ? _a : '') &&
371
+ !(0, attribute_getters_1.getAttributeValue)('ReturnType', element) // exclude V2 FunctionImports
372
+ ) {
373
+ // type name contains reference to entityType, function or action
374
+ metadataElementProperties.structuredType = typeName;
375
+ }
376
+ else if (PARAMETER_TYPE_NAMES.has((_b = element.name) !== null && _b !== void 0 ? _b : '')) {
377
+ // handle property, parameter or returnType based on entity or complex type
378
+ if (baseTypeName === EDM_COMPLEX_TYPE) {
379
+ metadataElementProperties.isComplexType = true;
380
+ metadataElementProperties.structuredType = typeName;
381
+ }
382
+ else if (baseTypeName === EDM_ENTITY_TYPE) {
383
+ metadataElementProperties.isEntityType = true;
384
+ metadataElementProperties.structuredType = typeName;
385
+ }
386
+ }
387
+ }
388
+ /**
389
+ *
390
+ * @param baseTypeName
391
+ * @param type
392
+ * @param typeName
393
+ * @param edmPrimitiveType
394
+ * @returns
395
+ */
396
+ function getReturnTypeProperties(baseTypeName, type, typeName, edmPrimitiveType) {
397
+ // FunctionImport in Data V2: type contains ReturnType attribute - build sub node for it
398
+ const returnTypeProperties = {
399
+ isAnnotatable: true,
400
+ kind: "ReturnType" /* Edm.ReturnType */,
401
+ name: '$ReturnType',
402
+ isCollectionValued: type.startsWith('Collection('),
403
+ isComplexType: baseTypeName === EDM_COMPLEX_TYPE,
404
+ isEntityType: baseTypeName === EDM_ENTITY_TYPE
405
+ };
406
+ if (edmPrimitiveType) {
407
+ returnTypeProperties.edmPrimitiveType = edmPrimitiveType;
408
+ }
409
+ if ([EDM_ENTITY_TYPE, EDM_COMPLEX_TYPE].includes(baseTypeName)) {
410
+ returnTypeProperties.structuredType = typeName;
411
+ }
412
+ return returnTypeProperties;
413
+ }
414
+ /**
415
+ * Returns overload name.
416
+ *
417
+ * @param context Conversion context
418
+ * @param element Source XML element
419
+ * @returns matching MetadataElement if it exists for the given XML element
420
+ */
421
+ function getOverloadName(context, element) {
422
+ // generate overload name MyFunction(MySchema.MyBindingParamType,First.NonBinding.ParamType)
423
+ const name = (0, attribute_getters_1.getAttributeValue)('Name', element);
424
+ let parameterSubElements = element.subElements.filter((subElement) => subElement.name === "Parameter" /* Edm.Parameter */);
425
+ if (element.name === "Action" /* Edm.Action */) {
426
+ parameterSubElements = parameterSubElements.slice(0, 1);
427
+ }
428
+ const parameterTypes = parameterSubElements.map((parameterElement) => attributeValueToFullyQualifiedName('Type', context.aliasMap, context.namespace, parameterElement));
429
+ return name + '(' + parameterTypes.join(',') + ')';
430
+ }
431
+ /**
432
+ * Return names of child key elements.
433
+ *
434
+ * @param element Source XML element
435
+ * @returns an array of PropertyRef names
436
+ */
437
+ function getKeys(element) {
438
+ // find all PropertyRef sub elements of Key sub element and collect their Name attribute
439
+ // (there should be at most a single 'Key' sub element)
440
+ let keys = [];
441
+ const keyElements = (element.subElements || []).filter((subElement) => subElement.name === 'Key');
442
+ if (keyElements === null || keyElements === void 0 ? void 0 : keyElements.length) {
443
+ keys = keyElements[0].subElements
444
+ .filter((subElement) => subElement.name === 'PropertyRef')
445
+ .map((propRefElement) => (0, attribute_getters_1.getAttributeValue)('Name', propRefElement));
446
+ }
447
+ return keys;
448
+ }
449
+ /**
450
+ * Parses and converts attribute value to fully qualified name.
451
+ *
452
+ * @param attributeName
453
+ * @param namespaceMap
454
+ * @param currentNamespace
455
+ * @param element
456
+ * @returns fully qualified name or undefined
457
+ */
458
+ function attributeValueToFullyQualifiedName(attributeName, namespaceMap, currentNamespace, element) {
459
+ const attributeValue = (0, attribute_getters_1.getAttributeValue)(attributeName, element);
460
+ if (attributeValue === '') {
461
+ return undefined;
462
+ }
463
+ const parsedIdentifier = (0, odata_annotation_core_1.parseIdentifier)(attributeValue);
464
+ const fullyQualifiedName = (0, odata_annotation_core_1.toFullyQualifiedName)(namespaceMap, currentNamespace, parsedIdentifier);
465
+ return fullyQualifiedName !== null && fullyQualifiedName !== void 0 ? fullyQualifiedName : attributeValue;
466
+ }
467
+ /**
468
+ * Creates namespace map from given container XML element.
469
+ *
470
+ * @param element container XML element
471
+ * @returns namespace map
472
+ */
473
+ function getNamespaceMap(element) {
474
+ var _a, _b;
475
+ const references = (0, element_getters_1.getElementsWithName)('Reference', element);
476
+ const dataServices = (0, element_getters_1.getElementsWithName)('DataServices', element);
477
+ const schemas = dataServices.length ? (0, element_getters_1.getElementsWithName)('Schema', dataServices[0]) : [];
478
+ const aliasMap = {};
479
+ const includes = references.reduce((acc, reference) => [...acc, ...(0, element_getters_1.getElementsWithName)('Include', reference)], []);
480
+ for (const namespaceElement of [...includes, ...schemas]) {
481
+ const namespace = (_a = (0, attribute_getters_1.getElementAttributeByName)('Namespace', namespaceElement)) === null || _a === void 0 ? void 0 : _a.value;
482
+ const alias = (_b = (0, attribute_getters_1.getElementAttributeByName)('Alias', namespaceElement)) === null || _b === void 0 ? void 0 : _b.value;
483
+ if (namespace) {
484
+ aliasMap[namespace] = namespace;
485
+ if (alias) {
486
+ aliasMap[alias] = namespace;
487
+ }
488
+ }
489
+ }
490
+ return aliasMap;
491
+ }
492
+ /**
493
+ * Creates association data object from given association ends XML elements.
494
+ *
495
+ * @param ends XML elements representing association ends
496
+ * @param aliasMap alias map
497
+ * @param currentNamespace namespace
498
+ * @returns association data object
499
+ */
500
+ function createAssociation(ends, aliasMap, currentNamespace) {
501
+ const association = {};
502
+ for (const end of ends) {
503
+ const role = attributeValueToFullyQualifiedName('Role', aliasMap, currentNamespace, end);
504
+ const type = attributeValueToFullyQualifiedName('Type', aliasMap, currentNamespace, end);
505
+ const multiplicity = (0, attribute_getters_1.getAttributeValue)('Multiplicity', end);
506
+ if (role && type && multiplicity) {
507
+ association[role] = {
508
+ type,
509
+ multiplicity
510
+ };
511
+ }
512
+ }
513
+ return association;
514
+ }
515
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/parser/metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { XMLElement, SourcePosition } from '@xml-tools/ast';
2
+ import { Range } from '@sap-ux/odata-annotation-core';
3
+ /**
4
+ * Converts @xml-tools/ast ranges where lines and columns start with 1.
5
+ *
6
+ * @param position @xml-tools/ast range.
7
+ * @returns Range where lines and columns start with 0.
8
+ */
9
+ export declare function transformRange(position: SourcePosition | undefined): Range | undefined;
10
+ /**
11
+ * Converts @xml-tools/ast ranges where lines and columns start with 1.
12
+ * This can only be used with XML element, but it offers more accurate range in case of syntax errors.
13
+ *
14
+ * @param position @xml-tools/ast range.
15
+ * @param element XML element for which the range belongs. Using different position may lead to unexpected behavior.
16
+ * @returns Range where lines and columns start with 0.
17
+ */
18
+ export declare function transformElementRange(position: SourcePosition | undefined, element: XMLElement): Range | undefined;
19
+ /**
20
+ * Creates a range between two SourcePositions.
21
+ *
22
+ * @param begin SourcePosition from which the end will be used
23
+ * @param end SourcePosition from which the start will be used
24
+ * @returns Range between the begin and end positions
25
+ */
26
+ export declare function getGapRangeBetween(begin: SourcePosition | undefined, end: SourcePosition | undefined): Range | undefined;
27
+ /**
28
+ * Mutates range by the given parameters.
29
+ *
30
+ * @param range Range object that will be changed.
31
+ * @param startColAdjust Number which will be added to the start positions column.
32
+ * @param endColAdjust Number which will be added to the end position column.
33
+ * @param startLineAdjust Number which will be added to the start position line.
34
+ * @param endLineAdjust Number which will be added to the end position line.
35
+ */
36
+ export declare function adjustRange(range: Range, startColAdjust: number, endColAdjust: number, startLineAdjust?: number, endLineAdjust?: number): void;
37
+ //# sourceMappingURL=range.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"range.d.ts","sourceRoot":"","sources":["../../src/parser/range.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAEtD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,SAAS,GAAG,KAAK,GAAG,SAAS,CAItF;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,cAAc,GAAG,SAAS,EAAE,OAAO,EAAE,UAAU,GAAG,KAAK,GAAG,SAAS,CAQlH;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAC9B,KAAK,EAAE,cAAc,GAAG,SAAS,EACjC,GAAG,EAAE,cAAc,GAAG,SAAS,GAChC,KAAK,GAAG,SAAS,CAKnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACvB,KAAK,EAAE,KAAK,EACZ,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,EACpB,eAAe,SAAI,EACnB,aAAa,SAAI,GAClB,IAAI,CAON"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.adjustRange = exports.getGapRangeBetween = exports.transformElementRange = exports.transformRange = void 0;
4
+ const odata_annotation_core_1 = require("@sap-ux/odata-annotation-core");
5
+ /**
6
+ * Converts @xml-tools/ast ranges where lines and columns start with 1.
7
+ *
8
+ * @param position @xml-tools/ast range.
9
+ * @returns Range where lines and columns start with 0.
10
+ */
11
+ function transformRange(position) {
12
+ return position
13
+ ? odata_annotation_core_1.Range.create(position.startLine - 1, position.startColumn - 1, position.endLine - 1, position.endColumn)
14
+ : undefined;
15
+ }
16
+ exports.transformRange = transformRange;
17
+ /**
18
+ * Converts @xml-tools/ast ranges where lines and columns start with 1.
19
+ * This can only be used with XML element, but it offers more accurate range in case of syntax errors.
20
+ *
21
+ * @param position @xml-tools/ast range.
22
+ * @param element XML element for which the range belongs. Using different position may lead to unexpected behavior.
23
+ * @returns Range where lines and columns start with 0.
24
+ */
25
+ function transformElementRange(position, element) {
26
+ const range = transformRange(position);
27
+ if (range && element.syntax.guessedAttributesRange) {
28
+ // guessed attribute range only has offset and we do not know how to resolve them here.
29
+ // heuristic to support code completion for attribute names that are in a tag, which is not closed
30
+ range.end.character++;
31
+ }
32
+ return range;
33
+ }
34
+ exports.transformElementRange = transformElementRange;
35
+ /**
36
+ * Creates a range between two SourcePositions.
37
+ *
38
+ * @param begin SourcePosition from which the end will be used
39
+ * @param end SourcePosition from which the start will be used
40
+ * @returns Range between the begin and end positions
41
+ */
42
+ function getGapRangeBetween(begin, end) {
43
+ if (begin && end) {
44
+ return odata_annotation_core_1.Range.create(begin.endLine - 1, begin.endColumn, end.startLine - 1, end.startColumn - 3);
45
+ }
46
+ return undefined;
47
+ }
48
+ exports.getGapRangeBetween = getGapRangeBetween;
49
+ /**
50
+ * Mutates range by the given parameters.
51
+ *
52
+ * @param range Range object that will be changed.
53
+ * @param startColAdjust Number which will be added to the start positions column.
54
+ * @param endColAdjust Number which will be added to the end position column.
55
+ * @param startLineAdjust Number which will be added to the start position line.
56
+ * @param endLineAdjust Number which will be added to the end position line.
57
+ */
58
+ function adjustRange(range, startColAdjust, endColAdjust, startLineAdjust = 0, endLineAdjust = 0) {
59
+ if (range) {
60
+ range.start.line += startLineAdjust;
61
+ range.start.character += startColAdjust;
62
+ range.end.line += endLineAdjust;
63
+ range.end.character += endColAdjust;
64
+ }
65
+ }
66
+ exports.adjustRange = adjustRange;
67
+ //# sourceMappingURL=range.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"range.js","sourceRoot":"","sources":["../../src/parser/range.ts"],"names":[],"mappings":";;;AACA,yEAAsD;AAEtD;;;;;GAKG;AACH,SAAgB,cAAc,CAAC,QAAoC;IAC/D,OAAO,QAAQ;QACX,CAAC,CAAC,6BAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,GAAG,CAAC,EAAE,QAAQ,CAAC,WAAW,GAAG,CAAC,EAAE,QAAQ,CAAC,OAAO,GAAG,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC;QAC1G,CAAC,CAAC,SAAS,CAAC;AACpB,CAAC;AAJD,wCAIC;AAED;;;;;;;GAOG;AACH,SAAgB,qBAAqB,CAAC,QAAoC,EAAE,OAAmB;IAC3F,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,sBAAsB,EAAE;QAChD,uFAAuF;QACvF,kGAAkG;QAClG,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;KACzB;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AARD,sDAQC;AAED;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAC9B,KAAiC,EACjC,GAA+B;IAE/B,IAAI,KAAK,IAAI,GAAG,EAAE;QACd,OAAO,6BAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,SAAS,GAAG,CAAC,EAAE,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;KACnG;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AARD,gDAQC;AAED;;;;;;;;GAQG;AACH,SAAgB,WAAW,CACvB,KAAY,EACZ,cAAsB,EACtB,YAAoB,EACpB,eAAe,GAAG,CAAC,EACnB,aAAa,GAAG,CAAC;IAEjB,IAAI,KAAK,EAAE;QACP,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,eAAe,CAAC;QACpC,KAAK,CAAC,KAAK,CAAC,SAAS,IAAI,cAAc,CAAC;QACxC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,aAAa,CAAC;QAChC,KAAK,CAAC,GAAG,CAAC,SAAS,IAAI,YAAY,CAAC;KACvC;AACL,CAAC;AAbD,kCAaC"}