@sap-ux/fiori-annotation-api 0.11.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/annotation-provider.d.ts +1 -1
- package/dist/annotation-provider.d.ts.map +1 -1
- package/dist/annotation-provider.js +30 -36
- package/dist/annotation-provider.js.map +1 -1
- package/dist/avt/annotations.js +53 -56
- package/dist/avt/annotations.js.map +1 -1
- package/dist/avt/expressions.js +3 -7
- package/dist/avt/expressions.js.map +1 -1
- package/dist/avt/find.d.ts +2 -2
- package/dist/avt/find.d.ts.map +1 -1
- package/dist/avt/find.js +16 -20
- package/dist/avt/find.js.map +1 -1
- package/dist/avt/index.d.ts +8 -8
- package/dist/avt/index.d.ts.map +1 -1
- package/dist/avt/index.js +7 -31
- package/dist/avt/index.js.map +1 -1
- package/dist/avt/metadata.js +1 -4
- package/dist/avt/metadata.js.map +1 -1
- package/dist/avt/pointer.d.ts +1 -1
- package/dist/avt/pointer.d.ts.map +1 -1
- package/dist/avt/pointer.js +12 -15
- package/dist/avt/pointer.js.map +1 -1
- package/dist/avt/to-internal.d.ts +1 -1
- package/dist/avt/to-internal.d.ts.map +1 -1
- package/dist/avt/to-internal.js +53 -65
- package/dist/avt/to-internal.js.map +1 -1
- package/dist/avt/types.js +1 -2
- package/dist/avt/utils.d.ts +2 -2
- package/dist/avt/utils.d.ts.map +1 -1
- package/dist/avt/utils.js +11 -20
- package/dist/avt/utils.js.map +1 -1
- package/dist/cds/adapter.d.ts +5 -5
- package/dist/cds/adapter.d.ts.map +1 -1
- package/dist/cds/adapter.js +184 -187
- package/dist/cds/adapter.js.map +1 -1
- package/dist/cds/cds-compiler-tokens.js +11 -21
- package/dist/cds/cds-compiler-tokens.js.map +1 -1
- package/dist/cds/change.d.ts +1 -1
- package/dist/cds/change.d.ts.map +1 -1
- package/dist/cds/change.js +63 -79
- package/dist/cds/change.js.map +1 -1
- package/dist/cds/comments.d.ts +1 -1
- package/dist/cds/comments.d.ts.map +1 -1
- package/dist/cds/comments.js +4 -7
- package/dist/cds/comments.js.map +1 -1
- package/dist/cds/deletion.d.ts +1 -1
- package/dist/cds/deletion.d.ts.map +1 -1
- package/dist/cds/deletion.js +74 -61
- package/dist/cds/deletion.js.map +1 -1
- package/dist/cds/document.d.ts +4 -4
- package/dist/cds/document.d.ts.map +1 -1
- package/dist/cds/document.js +20 -27
- package/dist/cds/document.js.map +1 -1
- package/dist/cds/indent.d.ts +2 -2
- package/dist/cds/indent.d.ts.map +1 -1
- package/dist/cds/indent.js +16 -20
- package/dist/cds/indent.js.map +1 -1
- package/dist/cds/index.d.ts +2 -2
- package/dist/cds/index.d.ts.map +1 -1
- package/dist/cds/index.js +4 -22
- package/dist/cds/index.js.map +1 -1
- package/dist/cds/pointer.d.ts +1 -1
- package/dist/cds/pointer.d.ts.map +1 -1
- package/dist/cds/pointer.js +38 -42
- package/dist/cds/pointer.js.map +1 -1
- package/dist/cds/preprocessor.d.ts +3 -3
- package/dist/cds/preprocessor.d.ts.map +1 -1
- package/dist/cds/preprocessor.js +91 -95
- package/dist/cds/preprocessor.js.map +1 -1
- package/dist/cds/references.d.ts +2 -2
- package/dist/cds/references.d.ts.map +1 -1
- package/dist/cds/references.js +49 -55
- package/dist/cds/references.js.map +1 -1
- package/dist/cds/service.d.ts +1 -1
- package/dist/cds/service.d.ts.map +1 -1
- package/dist/cds/service.js +6 -8
- package/dist/cds/service.js.map +1 -1
- package/dist/cds/utils.d.ts +2 -2
- package/dist/cds/utils.d.ts.map +1 -1
- package/dist/cds/utils.js +20 -24
- package/dist/cds/utils.js.map +1 -1
- package/dist/cds/writer.d.ts +6 -6
- package/dist/cds/writer.d.ts.map +1 -1
- package/dist/cds/writer.js +199 -202
- package/dist/cds/writer.js.map +1 -1
- package/dist/change-converter.d.ts +1 -1
- package/dist/change-converter.d.ts.map +1 -1
- package/dist/change-converter.js +124 -128
- package/dist/change-converter.js.map +1 -1
- package/dist/error.js +3 -7
- package/dist/error.js.map +1 -1
- package/dist/external-services.d.ts +1 -1
- package/dist/external-services.d.ts.map +1 -1
- package/dist/external-services.js +10 -13
- package/dist/external-services.js.map +1 -1
- package/dist/fiori-service.d.ts +4 -4
- package/dist/fiori-service.d.ts.map +1 -1
- package/dist/fiori-service.js +41 -45
- package/dist/fiori-service.js.map +1 -1
- package/dist/index.d.ts +9 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -31
- package/dist/index.js.map +1 -1
- package/dist/logger.js +2 -5
- package/dist/logger.js.map +1 -1
- package/dist/protected.d.ts +2 -2
- package/dist/protected.d.ts.map +1 -1
- package/dist/protected.js +2 -8
- package/dist/protected.js.map +1 -1
- package/dist/sap/builders.d.ts +1 -1
- package/dist/sap/builders.d.ts.map +1 -1
- package/dist/sap/builders.js +22 -30
- package/dist/sap/builders.js.map +1 -1
- package/dist/sap/collector.d.ts +1 -1
- package/dist/sap/collector.d.ts.map +1 -1
- package/dist/sap/collector.js +50 -53
- package/dist/sap/collector.js.map +1 -1
- package/dist/sap/converter.d.ts +1 -1
- package/dist/sap/converter.d.ts.map +1 -1
- package/dist/sap/converter.js +37 -42
- package/dist/sap/converter.js.map +1 -1
- package/dist/sap/index.d.ts +1 -1
- package/dist/sap/index.d.ts.map +1 -1
- package/dist/sap/index.js +1 -6
- package/dist/sap/index.js.map +1 -1
- package/dist/sap/types.js +5 -8
- package/dist/sap/types.js.map +1 -1
- package/dist/types/adapter.d.ts +3 -3
- package/dist/types/adapter.d.ts.map +1 -1
- package/dist/types/adapter.js +1 -2
- package/dist/types/change.js +11 -14
- package/dist/types/change.js.map +1 -1
- package/dist/types/index.d.ts +6 -6
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +3 -32
- package/dist/types/index.js.map +1 -1
- package/dist/types/internal-change.d.ts +1 -1
- package/dist/types/internal-change.d.ts.map +1 -1
- package/dist/types/internal-change.js +13 -16
- package/dist/types/internal-change.js.map +1 -1
- package/dist/types/project-info.js +1 -2
- package/dist/types/service.d.ts +1 -1
- package/dist/types/service.d.ts.map +1 -1
- package/dist/types/service.js +1 -2
- package/dist/types/text-file.js +1 -2
- package/dist/utils/constants.js +20 -22
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/indent.js +1 -4
- package/dist/utils/indent.js.map +1 -1
- package/dist/utils/index.d.ts +7 -7
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +7 -17
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/metadata.js +1 -4
- package/dist/utils/metadata.js.map +1 -1
- package/dist/utils/path.js +5 -8
- package/dist/utils/path.js.map +1 -1
- package/dist/utils/pointer.d.ts +1 -1
- package/dist/utils/pointer.d.ts.map +1 -1
- package/dist/utils/pointer.js +1 -4
- package/dist/utils/pointer.js.map +1 -1
- package/dist/utils/range.js +1 -4
- package/dist/utils/range.js.map +1 -1
- package/dist/utils/reference.d.ts +1 -1
- package/dist/utils/reference.d.ts.map +1 -1
- package/dist/utils/reference.js +1 -4
- package/dist/utils/reference.js.map +1 -1
- package/dist/vocabularies.js +1 -4
- package/dist/vocabularies.js.map +1 -1
- package/dist/xml/adapter.d.ts +2 -2
- package/dist/xml/adapter.d.ts.map +1 -1
- package/dist/xml/adapter.js +92 -96
- package/dist/xml/adapter.js.map +1 -1
- package/dist/xml/changes.d.ts +1 -1
- package/dist/xml/changes.d.ts.map +1 -1
- package/dist/xml/changes.js +11 -15
- package/dist/xml/changes.js.map +1 -1
- package/dist/xml/comments.js +3 -6
- package/dist/xml/comments.js.map +1 -1
- package/dist/xml/document.d.ts +1 -1
- package/dist/xml/document.d.ts.map +1 -1
- package/dist/xml/document.js +1 -2
- package/dist/xml/index.d.ts +2 -2
- package/dist/xml/index.d.ts.map +1 -1
- package/dist/xml/index.js +4 -9
- package/dist/xml/index.js.map +1 -1
- package/dist/xml/pointer.js +1 -4
- package/dist/xml/pointer.js.map +1 -1
- package/dist/xml/references.js +15 -18
- package/dist/xml/references.js.map +1 -1
- package/dist/xml/service.d.ts +1 -1
- package/dist/xml/service.d.ts.map +1 -1
- package/dist/xml/service.js +4 -7
- package/dist/xml/service.js.map +1 -1
- package/dist/xml/writer.d.ts +2 -2
- package/dist/xml/writer.d.ts.map +1 -1
- package/dist/xml/writer.js +100 -104
- package/dist/xml/writer.js.map +1 -1
- package/package.json +13 -11
package/dist/change-converter.js
CHANGED
|
@@ -1,17 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const types_1 = require("./types");
|
|
9
|
-
const utils_1 = require("./utils");
|
|
10
|
-
const error_1 = require("./error");
|
|
1
|
+
import { ELEMENT_TYPE, ATTRIBUTE_TYPE, createElementNode, createTextNode, Edm, createTarget, TEXT_TYPE, ANNOTATION_FILE_TYPE } from '@sap-ux/odata-annotation-core-types';
|
|
2
|
+
import { getAliasInformation, getAllNamespacesAndReferences, toAliasQualifiedName } from '@sap-ux/odata-annotation-core';
|
|
3
|
+
import { convertAnnotationToInternal, convertPointerInAnnotationToInternal, convertExpressionToInternal, convertPrimitiveValueToInternal, findAnnotationByReference, getAvtNodeFromPointer, convertCollectionToInternal, convertPropertyValueToInternal, convertRecordToInternal, findAnnotation } from './avt/index.js';
|
|
4
|
+
import { addAllVocabulariesToAliasInformation } from './vocabularies.js';
|
|
5
|
+
import { ChangeType, DELETE_ATTRIBUTE, DELETE_ELEMENT, ExpressionType, INSERT_ATTRIBUTE, INSERT_ELEMENT, INSERT_TARGET, UPDATE_ATTRIBUTE_VALUE, MOVE_ELEMENT, REPLACE_ATTRIBUTE, REPLACE_ELEMENT, REPLACE_ELEMENT_CONTENT, REPLACE_TEXT } from './types/index.js';
|
|
6
|
+
import { annotationReferenceToString, getGenericNodeFromPointer } from './utils/index.js';
|
|
7
|
+
import { ApiError, ApiErrorCode } from './error.js';
|
|
11
8
|
/**
|
|
12
9
|
* Converts changes to the internal change format.
|
|
13
10
|
*/
|
|
14
|
-
class ChangeConverter {
|
|
11
|
+
export class ChangeConverter {
|
|
15
12
|
serviceName;
|
|
16
13
|
vocabularyAPI;
|
|
17
14
|
metadataService;
|
|
@@ -50,22 +47,22 @@ class ChangeConverter {
|
|
|
50
47
|
for (const change of mergedChanges) {
|
|
51
48
|
const file = this.getFile(compiledService, change.uri);
|
|
52
49
|
const aliasInfoMod = this.getAliasInformation(file);
|
|
53
|
-
if (change.kind ===
|
|
50
|
+
if (change.kind === ChangeType.InsertAnnotation) {
|
|
54
51
|
this.insertAnnotation(compiledService, aliasInfoMod, change);
|
|
55
52
|
}
|
|
56
|
-
else if (change.kind ===
|
|
53
|
+
else if (change.kind === ChangeType.InsertEmbeddedAnnotation) {
|
|
57
54
|
this.insertEmbeddedAnnotation(file, fileMergeMaps, aliasInfoMod, change);
|
|
58
55
|
}
|
|
59
|
-
else if (change.kind ===
|
|
56
|
+
else if (change.kind === ChangeType.Insert) {
|
|
60
57
|
this.convertInsert(file, fileMergeMaps, aliasInfoMod, change);
|
|
61
58
|
}
|
|
62
|
-
else if (change.kind ===
|
|
59
|
+
else if (change.kind === ChangeType.Delete) {
|
|
63
60
|
this.convertDelete(file, fileMergeMaps, aliasInfoMod, change);
|
|
64
61
|
}
|
|
65
|
-
else if (change.kind ===
|
|
62
|
+
else if (change.kind === ChangeType.Update) {
|
|
66
63
|
this.convertUpdate(file, fileMergeMaps, aliasInfoMod, schemaProvider, change);
|
|
67
64
|
}
|
|
68
|
-
else if (change.kind ===
|
|
65
|
+
else if (change.kind === ChangeType.Move) {
|
|
69
66
|
this.convertMove(file, fileMergeMaps, aliasInfoMod, change);
|
|
70
67
|
}
|
|
71
68
|
}
|
|
@@ -77,7 +74,7 @@ class ChangeConverter {
|
|
|
77
74
|
if (!file) {
|
|
78
75
|
if (this.ignoreChangedFileInitialContent) {
|
|
79
76
|
return {
|
|
80
|
-
type:
|
|
77
|
+
type: ANNOTATION_FILE_TYPE,
|
|
81
78
|
uri,
|
|
82
79
|
references: [],
|
|
83
80
|
targets: []
|
|
@@ -89,8 +86,8 @@ class ChangeConverter {
|
|
|
89
86
|
}
|
|
90
87
|
insertAnnotation(compiledService, aliasInfo, change) {
|
|
91
88
|
const annotationFile = compiledService.annotationFiles.find((file) => file.uri === change.uri);
|
|
92
|
-
const targetName =
|
|
93
|
-
const targetIndex = annotationFile?.targets.findIndex((target) =>
|
|
89
|
+
const targetName = toAliasQualifiedName(change.content.target, aliasInfo);
|
|
90
|
+
const targetIndex = annotationFile?.targets.findIndex((target) => toAliasQualifiedName(target.name, aliasInfo) === targetName);
|
|
94
91
|
if (targetIndex === -1 || targetIndex === undefined) {
|
|
95
92
|
// no existing target found, we need to create one
|
|
96
93
|
const changesForUri = this.newTargetChanges.get(change.uri);
|
|
@@ -110,23 +107,23 @@ class ChangeConverter {
|
|
|
110
107
|
else {
|
|
111
108
|
// add annotation to existing target
|
|
112
109
|
const internal = {
|
|
113
|
-
type:
|
|
110
|
+
type: INSERT_ELEMENT,
|
|
114
111
|
uri: change.uri,
|
|
115
112
|
target: targetName,
|
|
116
113
|
pointer: `/targets/${targetIndex}`,
|
|
117
|
-
element:
|
|
114
|
+
element: convertAnnotationToInternal(change.content.value, aliasInfo)
|
|
118
115
|
};
|
|
119
116
|
this.annotationFileChanges.push(internal);
|
|
120
117
|
}
|
|
121
118
|
}
|
|
122
119
|
insertEmbeddedAnnotation(file, fileMergeMaps, aliasInfo, change) {
|
|
123
120
|
const { reference, content } = change;
|
|
124
|
-
const { targetPointer, internalPointer } =
|
|
121
|
+
const { targetPointer, internalPointer } = findAnnotationByReference(aliasInfo, file, fileMergeMaps[change.uri], reference, change.pointer, this.splitAnnotationSupport);
|
|
125
122
|
const internal = {
|
|
126
|
-
type:
|
|
123
|
+
type: INSERT_ELEMENT,
|
|
127
124
|
uri: change.uri,
|
|
128
125
|
target: change.reference.target,
|
|
129
|
-
element:
|
|
126
|
+
element: convertAnnotationToInternal(content.value, aliasInfo),
|
|
130
127
|
pointer: targetPointer + internalPointer,
|
|
131
128
|
index: change.index
|
|
132
129
|
};
|
|
@@ -134,37 +131,37 @@ class ChangeConverter {
|
|
|
134
131
|
}
|
|
135
132
|
convertInsert(file, fileMergeMaps, aliasInfo, change) {
|
|
136
133
|
const { reference, content } = change;
|
|
137
|
-
const { element, targetPointer: pointer, internalPointer } =
|
|
138
|
-
const index = change.kind ===
|
|
134
|
+
const { element, targetPointer: pointer, internalPointer } = findAnnotationByReference(aliasInfo, file, fileMergeMaps[change.uri], reference, change.pointer, this.splitAnnotationSupport);
|
|
135
|
+
const index = change.kind === ChangeType.Insert ? change.index : undefined;
|
|
139
136
|
if (content.type === 'record') {
|
|
140
137
|
const internal = {
|
|
141
|
-
type:
|
|
138
|
+
type: INSERT_ELEMENT,
|
|
142
139
|
uri: change.uri,
|
|
143
140
|
target: change.reference.target,
|
|
144
141
|
pointer: pointer + internalPointer,
|
|
145
|
-
element:
|
|
142
|
+
element: convertRecordToInternal(aliasInfo, content.value),
|
|
146
143
|
index
|
|
147
144
|
};
|
|
148
145
|
this.annotationFileChanges.push(internal);
|
|
149
146
|
}
|
|
150
147
|
else if (content.type === 'property-value') {
|
|
151
148
|
const internal = {
|
|
152
|
-
type:
|
|
149
|
+
type: INSERT_ELEMENT,
|
|
153
150
|
uri: change.uri,
|
|
154
151
|
target: change.reference.target,
|
|
155
152
|
pointer: pointer + internalPointer,
|
|
156
|
-
element:
|
|
153
|
+
element: convertPropertyValueToInternal(aliasInfo, content.value),
|
|
157
154
|
index
|
|
158
155
|
};
|
|
159
156
|
this.annotationFileChanges.push(internal);
|
|
160
157
|
}
|
|
161
158
|
else if (content.type === 'collection') {
|
|
162
159
|
const internal = {
|
|
163
|
-
type:
|
|
160
|
+
type: INSERT_ELEMENT,
|
|
164
161
|
uri: change.uri,
|
|
165
162
|
target: change.reference.target,
|
|
166
163
|
pointer: pointer + internalPointer,
|
|
167
|
-
element:
|
|
164
|
+
element: convertCollectionToInternal(aliasInfo, content.value),
|
|
168
165
|
index
|
|
169
166
|
};
|
|
170
167
|
this.annotationFileChanges.push(internal);
|
|
@@ -177,12 +174,12 @@ class ChangeConverter {
|
|
|
177
174
|
}
|
|
178
175
|
}
|
|
179
176
|
convertInsertExpression(file, aliasInfoMod, pointer, change, content, index) {
|
|
180
|
-
const node =
|
|
181
|
-
if (node?.type ===
|
|
182
|
-
const expression =
|
|
177
|
+
const node = getGenericNodeFromPointer(file, pointer);
|
|
178
|
+
if (node?.type === ELEMENT_TYPE && node.name === Edm.Collection) {
|
|
179
|
+
const expression = convertExpressionToInternal(aliasInfoMod, content.value);
|
|
183
180
|
if (expression) {
|
|
184
181
|
const internal = {
|
|
185
|
-
type:
|
|
182
|
+
type: INSERT_ELEMENT,
|
|
186
183
|
uri: change.uri,
|
|
187
184
|
target: change.reference.target,
|
|
188
185
|
pointer: pointer,
|
|
@@ -193,12 +190,12 @@ class ChangeConverter {
|
|
|
193
190
|
}
|
|
194
191
|
}
|
|
195
192
|
else {
|
|
196
|
-
const container =
|
|
193
|
+
const container = convertExpressionToInternal(aliasInfoMod, content.value, createElementNode({ name: 'placeholder' }));
|
|
197
194
|
if (container) {
|
|
198
195
|
const expression = container.content[0];
|
|
199
|
-
if (expression?.type ===
|
|
196
|
+
if (expression?.type === ELEMENT_TYPE) {
|
|
200
197
|
const internal = {
|
|
201
|
-
type:
|
|
198
|
+
type: INSERT_ELEMENT,
|
|
202
199
|
uri: change.uri,
|
|
203
200
|
target: change.reference.target,
|
|
204
201
|
pointer: pointer,
|
|
@@ -211,7 +208,7 @@ class ChangeConverter {
|
|
|
211
208
|
else if (Object.keys(container.attributes).length > 0) {
|
|
212
209
|
const attribute = container.attributes[Object.keys(container.attributes)[0]];
|
|
213
210
|
const internal = {
|
|
214
|
-
type:
|
|
211
|
+
type: INSERT_ATTRIBUTE,
|
|
215
212
|
uri: change.uri,
|
|
216
213
|
pointer: pointer,
|
|
217
214
|
name: attribute.name,
|
|
@@ -224,15 +221,15 @@ class ChangeConverter {
|
|
|
224
221
|
}
|
|
225
222
|
}
|
|
226
223
|
convertInsertPrimitive(element, aliasInfoMod, pointer, internalPointer, change, content, index) {
|
|
227
|
-
if (content.expressionType ===
|
|
228
|
-
const attributePointer =
|
|
224
|
+
if (content.expressionType === ExpressionType.Unknown) {
|
|
225
|
+
const attributePointer = convertPointerInAnnotationToInternal(element,
|
|
229
226
|
// last segment is used to determine attribute name
|
|
230
227
|
change.pointer.split('/').slice(0, -1).join('/'));
|
|
231
228
|
const attributeName = getAttributeNameFromPointer(change.pointer);
|
|
232
229
|
if (attributeName) {
|
|
233
|
-
const value =
|
|
230
|
+
const value = convertPrimitiveValueToInternal(attributeName, content.value, aliasInfoMod);
|
|
234
231
|
const internal = {
|
|
235
|
-
type:
|
|
232
|
+
type: INSERT_ATTRIBUTE,
|
|
236
233
|
uri: change.uri,
|
|
237
234
|
pointer: pointer + attributePointer,
|
|
238
235
|
name: attributeName,
|
|
@@ -241,20 +238,20 @@ class ChangeConverter {
|
|
|
241
238
|
this.annotationFileChanges.push(internal);
|
|
242
239
|
}
|
|
243
240
|
}
|
|
244
|
-
else if (content.expressionType ===
|
|
241
|
+
else if (content.expressionType === ExpressionType.Null) {
|
|
245
242
|
const internal = {
|
|
246
|
-
type:
|
|
243
|
+
type: INSERT_ELEMENT,
|
|
247
244
|
uri: change.uri,
|
|
248
245
|
target: change.reference.target,
|
|
249
246
|
pointer: pointer + internalPointer,
|
|
250
|
-
element:
|
|
247
|
+
element: createElementNode({ name: Edm.Null }),
|
|
251
248
|
index
|
|
252
249
|
};
|
|
253
250
|
this.annotationFileChanges.push(internal);
|
|
254
251
|
}
|
|
255
252
|
else if (typeof content.expressionType === 'string') {
|
|
256
253
|
const internal = {
|
|
257
|
-
type:
|
|
254
|
+
type: INSERT_ATTRIBUTE,
|
|
258
255
|
uri: change.uri,
|
|
259
256
|
pointer: pointer + internalPointer,
|
|
260
257
|
name: content.expressionType,
|
|
@@ -265,7 +262,7 @@ class ChangeConverter {
|
|
|
265
262
|
}
|
|
266
263
|
convertDelete(file, fileMergeMaps, aliasInfo, change) {
|
|
267
264
|
const { reference } = change;
|
|
268
|
-
const { target, targetPointer: pointer, internalPointer } =
|
|
265
|
+
const { target, targetPointer: pointer, internalPointer } = findAnnotationByReference(aliasInfo, file, fileMergeMaps[change.uri], reference, change.pointer, this.splitAnnotationSupport);
|
|
269
266
|
// look for attribute pointer suffix e.g attributes/Qualifier/value
|
|
270
267
|
const suffix = internalPointer.split('/').slice(-3);
|
|
271
268
|
if (suffix[0] === 'attributes' && suffix.length === 3) {
|
|
@@ -273,7 +270,7 @@ class ChangeConverter {
|
|
|
273
270
|
const [, , property] = suffix;
|
|
274
271
|
if (property === 'value') {
|
|
275
272
|
const internal = {
|
|
276
|
-
type:
|
|
273
|
+
type: DELETE_ATTRIBUTE,
|
|
277
274
|
uri: change.uri,
|
|
278
275
|
pointer: pointer + internalPointer.split('/').slice(0, -1).join('/')
|
|
279
276
|
};
|
|
@@ -282,7 +279,7 @@ class ChangeConverter {
|
|
|
282
279
|
}
|
|
283
280
|
else if (change.pointer === '') {
|
|
284
281
|
const internal = {
|
|
285
|
-
type:
|
|
282
|
+
type: DELETE_ELEMENT,
|
|
286
283
|
target: target.name,
|
|
287
284
|
uri: change.uri,
|
|
288
285
|
pointer: pointer
|
|
@@ -291,7 +288,7 @@ class ChangeConverter {
|
|
|
291
288
|
}
|
|
292
289
|
else if (internalPointer !== '') {
|
|
293
290
|
const internal = {
|
|
294
|
-
type:
|
|
291
|
+
type: DELETE_ELEMENT,
|
|
295
292
|
uri: change.uri,
|
|
296
293
|
target: target.name,
|
|
297
294
|
pointer: pointer + internalPointer
|
|
@@ -302,7 +299,7 @@ class ChangeConverter {
|
|
|
302
299
|
convertUpdate(file, fileMergeMaps, aliasInfo, schemaProvider, change) {
|
|
303
300
|
const { reference, content } = change;
|
|
304
301
|
const valueType = this.getValueType(schemaProvider, change);
|
|
305
|
-
const { element, targetPointer: pointer, internalPointer } =
|
|
302
|
+
const { element, targetPointer: pointer, internalPointer } = findAnnotationByReference(aliasInfo, file, fileMergeMaps[change.uri], reference, change.pointer, this.splitAnnotationSupport, valueType);
|
|
306
303
|
if (internalPointer === '') {
|
|
307
304
|
// value does not exist, treat this as insert
|
|
308
305
|
this.convertInsert(file, fileMergeMaps, aliasInfo, change);
|
|
@@ -316,11 +313,11 @@ class ChangeConverter {
|
|
|
316
313
|
this.convertUpdateAttribute(aliasInfo, attributeName, property, pointer, internalPointer, change);
|
|
317
314
|
}
|
|
318
315
|
else if (content.type === 'expression' && content.value.type === 'Collection') {
|
|
319
|
-
const node =
|
|
320
|
-
const newElement =
|
|
321
|
-
if (node?.type ===
|
|
316
|
+
const node = getGenericNodeFromPointer(file, pointer + internalPointer);
|
|
317
|
+
const newElement = convertExpressionToInternal(aliasInfo, content.value);
|
|
318
|
+
if (node?.type === ELEMENT_TYPE && newElement) {
|
|
322
319
|
const internalChange = {
|
|
323
|
-
type:
|
|
320
|
+
type: REPLACE_ELEMENT,
|
|
324
321
|
uri: change.uri,
|
|
325
322
|
pointer: pointer + internalPointer,
|
|
326
323
|
newElement
|
|
@@ -332,7 +329,7 @@ class ChangeConverter {
|
|
|
332
329
|
this.convertUpdateExpression(file, aliasInfo, content, pointer + internalPointer, valueType, reference.target);
|
|
333
330
|
}
|
|
334
331
|
else if (content.type === 'primitive' && content.value !== undefined) {
|
|
335
|
-
const internalPointerForPrimitiveValues =
|
|
332
|
+
const internalPointerForPrimitiveValues = convertPointerInAnnotationToInternal(element, change.pointer, content.expressionType);
|
|
336
333
|
const replaceTextPointer = pointer + internalPointerForPrimitiveValues + '/text';
|
|
337
334
|
this.convertUpdatePrimitiveValue(file, aliasInfo, content, pointer + internalPointer, replaceTextPointer);
|
|
338
335
|
}
|
|
@@ -340,7 +337,7 @@ class ChangeConverter {
|
|
|
340
337
|
const element = convertChangeToElement(aliasInfo, file, change);
|
|
341
338
|
if (element) {
|
|
342
339
|
const internal = {
|
|
343
|
-
type:
|
|
340
|
+
type: REPLACE_ELEMENT,
|
|
344
341
|
uri: change.uri,
|
|
345
342
|
pointer: pointer + internalPointer,
|
|
346
343
|
newElement: element
|
|
@@ -353,9 +350,9 @@ class ChangeConverter {
|
|
|
353
350
|
const value = this.getAttributeValue(change.content);
|
|
354
351
|
if (property === 'value' && value !== undefined) {
|
|
355
352
|
const type = this.getPrimitiveValueType(change.content) ?? attributeName;
|
|
356
|
-
const newValue =
|
|
353
|
+
const newValue = convertPrimitiveValueToInternal(type, value, aliasInfo);
|
|
357
354
|
const internal = {
|
|
358
|
-
type:
|
|
355
|
+
type: UPDATE_ATTRIBUTE_VALUE,
|
|
359
356
|
uri: change.uri,
|
|
360
357
|
pointer: pointer + internalPointer.split('/').slice(0, -1).join('/'),
|
|
361
358
|
newValue
|
|
@@ -365,13 +362,13 @@ class ChangeConverter {
|
|
|
365
362
|
}
|
|
366
363
|
getPrimitiveValueType(content) {
|
|
367
364
|
if (content.type === 'primitive') {
|
|
368
|
-
if (content.expressionType ===
|
|
365
|
+
if (content.expressionType === ExpressionType.Unknown) {
|
|
369
366
|
return undefined;
|
|
370
367
|
}
|
|
371
368
|
return content.expressionType;
|
|
372
369
|
}
|
|
373
370
|
if (content.type === 'expression') {
|
|
374
|
-
if (content.value.type ===
|
|
371
|
+
if (content.value.type === ExpressionType.Unknown) {
|
|
375
372
|
return undefined;
|
|
376
373
|
}
|
|
377
374
|
return content.value.type;
|
|
@@ -392,15 +389,15 @@ class ChangeConverter {
|
|
|
392
389
|
}
|
|
393
390
|
convertUpdateExpression(file, aliasInfo, content, pointer, valueType, targetName) {
|
|
394
391
|
const rawPrimitiveValue = this.getExpressionValue(content);
|
|
395
|
-
const newValue =
|
|
392
|
+
const newValue = convertPrimitiveValueToInternal(content.value.type, rawPrimitiveValue, aliasInfo);
|
|
396
393
|
const type = valueType ?? content.value.type;
|
|
397
|
-
const node =
|
|
398
|
-
if (node?.type ===
|
|
394
|
+
const node = getGenericNodeFromPointer(file, pointer);
|
|
395
|
+
if (node?.type === ELEMENT_TYPE) {
|
|
399
396
|
const onlyChangeValue = content.previousType === undefined && content.value.type === valueType;
|
|
400
397
|
if (onlyChangeValue && node.attributes[type]) {
|
|
401
398
|
// attribute notation
|
|
402
399
|
const internalChange = {
|
|
403
|
-
type:
|
|
400
|
+
type: UPDATE_ATTRIBUTE_VALUE,
|
|
404
401
|
uri: file.uri,
|
|
405
402
|
pointer: pointer + `/attributes/${type}`,
|
|
406
403
|
newValue
|
|
@@ -410,17 +407,17 @@ class ChangeConverter {
|
|
|
410
407
|
else if (onlyChangeValue && node.name === valueType) {
|
|
411
408
|
// element notation
|
|
412
409
|
const internalChange = {
|
|
413
|
-
type:
|
|
410
|
+
type: REPLACE_ELEMENT_CONTENT,
|
|
414
411
|
uri: file.uri,
|
|
415
412
|
pointer: pointer,
|
|
416
|
-
newValue: [
|
|
413
|
+
newValue: [createTextNode(newValue)]
|
|
417
414
|
};
|
|
418
415
|
this.annotationFileChanges.push(internalChange);
|
|
419
416
|
}
|
|
420
417
|
else if (node.attributes[type]) {
|
|
421
418
|
// attribute notation
|
|
422
419
|
this.annotationFileChanges.push({
|
|
423
|
-
type:
|
|
420
|
+
type: REPLACE_ATTRIBUTE,
|
|
424
421
|
uri: file.uri,
|
|
425
422
|
pointer: pointer + `/attributes/${type}`,
|
|
426
423
|
newAttributeName: content.value.type,
|
|
@@ -430,14 +427,14 @@ class ChangeConverter {
|
|
|
430
427
|
else if (node.name === valueType) {
|
|
431
428
|
// element notation
|
|
432
429
|
const childContent = [];
|
|
433
|
-
if (content.value.type !==
|
|
434
|
-
childContent.push(
|
|
430
|
+
if (content.value.type !== Edm.Null) {
|
|
431
|
+
childContent.push(createTextNode(newValue));
|
|
435
432
|
}
|
|
436
433
|
const internalChange = {
|
|
437
|
-
type:
|
|
434
|
+
type: REPLACE_ELEMENT,
|
|
438
435
|
uri: file.uri,
|
|
439
436
|
pointer: pointer,
|
|
440
|
-
newElement:
|
|
437
|
+
newElement: createElementNode({
|
|
441
438
|
name: content.value.type,
|
|
442
439
|
content: childContent
|
|
443
440
|
})
|
|
@@ -445,7 +442,7 @@ class ChangeConverter {
|
|
|
445
442
|
this.annotationFileChanges.push(internalChange);
|
|
446
443
|
}
|
|
447
444
|
}
|
|
448
|
-
else if (node?.type ===
|
|
445
|
+
else if (node?.type === ATTRIBUTE_TYPE) {
|
|
449
446
|
this.convertUpdateExpressionForAttrributeType(file.uri, targetName, valueType, content, pointer, newValue);
|
|
450
447
|
}
|
|
451
448
|
}
|
|
@@ -453,31 +450,31 @@ class ChangeConverter {
|
|
|
453
450
|
if (content.previousType === undefined && content.value.type === valueType) {
|
|
454
451
|
// attribute notation
|
|
455
452
|
const internalChange = {
|
|
456
|
-
type:
|
|
453
|
+
type: UPDATE_ATTRIBUTE_VALUE,
|
|
457
454
|
uri: fileUri,
|
|
458
455
|
pointer: pointer,
|
|
459
456
|
newValue
|
|
460
457
|
};
|
|
461
458
|
this.annotationFileChanges.push(internalChange);
|
|
462
459
|
}
|
|
463
|
-
else if (content.value.type ===
|
|
460
|
+
else if (content.value.type === Edm.Null) {
|
|
464
461
|
this.annotationFileChanges.push({
|
|
465
|
-
type:
|
|
462
|
+
type: DELETE_ATTRIBUTE,
|
|
466
463
|
uri: fileUri,
|
|
467
464
|
pointer: pointer
|
|
468
465
|
});
|
|
469
466
|
this.annotationFileChanges.push({
|
|
470
|
-
type:
|
|
467
|
+
type: INSERT_ELEMENT,
|
|
471
468
|
uri: fileUri,
|
|
472
469
|
target: targetName,
|
|
473
470
|
pointer: pointer.split('/').slice(0, -2).join('/'),
|
|
474
|
-
element:
|
|
471
|
+
element: createElementNode({ name: Edm.Null })
|
|
475
472
|
});
|
|
476
473
|
}
|
|
477
474
|
else {
|
|
478
475
|
// attribute notation
|
|
479
476
|
const internalChange = {
|
|
480
|
-
type:
|
|
477
|
+
type: REPLACE_ATTRIBUTE,
|
|
481
478
|
uri: fileUri,
|
|
482
479
|
pointer: pointer,
|
|
483
480
|
newAttributeName: content.value.type,
|
|
@@ -487,34 +484,34 @@ class ChangeConverter {
|
|
|
487
484
|
}
|
|
488
485
|
}
|
|
489
486
|
convertUpdatePrimitiveValue(file, aliasInfo, content, pointer, replaceTextPointer) {
|
|
490
|
-
const newValue =
|
|
491
|
-
const node =
|
|
492
|
-
if (node?.type ===
|
|
487
|
+
const newValue = convertPrimitiveValueToInternal(content.expressionType ?? '', content.value, aliasInfo);
|
|
488
|
+
const node = getGenericNodeFromPointer(file, pointer);
|
|
489
|
+
if (node?.type === TEXT_TYPE) {
|
|
493
490
|
const containerPointer = pointer.split('/').slice(0, -2).join('/');
|
|
494
|
-
const container =
|
|
495
|
-
if (container?.type ===
|
|
491
|
+
const container = getGenericNodeFromPointer(file, containerPointer);
|
|
492
|
+
if (container?.type === ELEMENT_TYPE &&
|
|
496
493
|
content.expressionType &&
|
|
497
494
|
container.name !== content.expressionType) {
|
|
498
495
|
const internal = {
|
|
499
|
-
type:
|
|
496
|
+
type: REPLACE_ELEMENT,
|
|
500
497
|
uri: file.uri,
|
|
501
498
|
pointer: containerPointer,
|
|
502
|
-
newElement:
|
|
499
|
+
newElement: createElementNode({
|
|
503
500
|
name: content.expressionType,
|
|
504
|
-
content: [
|
|
501
|
+
content: [createTextNode(newValue)]
|
|
505
502
|
})
|
|
506
503
|
};
|
|
507
504
|
this.annotationFileChanges.push(internal);
|
|
508
505
|
return;
|
|
509
506
|
}
|
|
510
507
|
}
|
|
511
|
-
else if (node?.type ===
|
|
508
|
+
else if (node?.type === ELEMENT_TYPE &&
|
|
512
509
|
content.expressionType &&
|
|
513
510
|
replaceTextPointer.split('/').includes('attributes')) {
|
|
514
511
|
const oldAttributeName = replaceTextPointer.split('/').slice(-2)[0];
|
|
515
512
|
if (node.attributes[content.expressionType]) {
|
|
516
513
|
const internal = {
|
|
517
|
-
type:
|
|
514
|
+
type: UPDATE_ATTRIBUTE_VALUE,
|
|
518
515
|
uri: file.uri,
|
|
519
516
|
pointer: `${pointer}/attributes/${content.expressionType}`,
|
|
520
517
|
newValue
|
|
@@ -524,7 +521,7 @@ class ChangeConverter {
|
|
|
524
521
|
}
|
|
525
522
|
else {
|
|
526
523
|
const internal = {
|
|
527
|
-
type:
|
|
524
|
+
type: REPLACE_ATTRIBUTE,
|
|
528
525
|
uri: file.uri,
|
|
529
526
|
pointer: `${pointer}/attributes/${oldAttributeName}`,
|
|
530
527
|
newAttributeName: content.expressionType,
|
|
@@ -535,24 +532,24 @@ class ChangeConverter {
|
|
|
535
532
|
}
|
|
536
533
|
}
|
|
537
534
|
const internal = {
|
|
538
|
-
type:
|
|
535
|
+
type: REPLACE_TEXT,
|
|
539
536
|
uri: file.uri,
|
|
540
537
|
pointer: replaceTextPointer,
|
|
541
|
-
text:
|
|
538
|
+
text: createTextNode(newValue)
|
|
542
539
|
};
|
|
543
540
|
this.annotationFileChanges.push(internal);
|
|
544
541
|
}
|
|
545
542
|
convertMove(file, fileMergeMaps, aliasInfo, change) {
|
|
546
543
|
const { reference, index, moveReference } = change;
|
|
547
|
-
const { targetPointer: pointer, internalPointer } =
|
|
544
|
+
const { targetPointer: pointer, internalPointer } = findAnnotationByReference(aliasInfo, file, fileMergeMaps[change.uri], reference, change.pointer, this.splitAnnotationSupport);
|
|
548
545
|
const internal = {
|
|
549
|
-
type:
|
|
546
|
+
type: MOVE_ELEMENT,
|
|
550
547
|
uri: change.uri,
|
|
551
548
|
pointer: pointer + internalPointer,
|
|
552
549
|
index: index,
|
|
553
550
|
fromPointers: moveReference.reduce((acc, moveRef) => {
|
|
554
551
|
acc.push(...moveRef.fromPointer.map((fromPointer) => {
|
|
555
|
-
const { targetPointer: fromTargetPointer, internalPointer: internalFromPointer } =
|
|
552
|
+
const { targetPointer: fromTargetPointer, internalPointer: internalFromPointer } = findAnnotationByReference(aliasInfo, file, fileMergeMaps[change.uri], moveRef.reference ?? change.reference, fromPointer, this.splitAnnotationSupport);
|
|
556
553
|
return fromTargetPointer + internalFromPointer;
|
|
557
554
|
}));
|
|
558
555
|
return acc;
|
|
@@ -566,10 +563,10 @@ class ChangeConverter {
|
|
|
566
563
|
const file = this.getFile(compiledService, uri);
|
|
567
564
|
const aliasInfoMod = this.getAliasInformation(file);
|
|
568
565
|
for (const [targetName, inserts] of changesForUri) {
|
|
569
|
-
const target =
|
|
570
|
-
target.terms = inserts.map((change) =>
|
|
566
|
+
const target = createTarget(targetName);
|
|
567
|
+
target.terms = inserts.map((change) => convertAnnotationToInternal(change.content.value, aliasInfoMod));
|
|
571
568
|
const internal = {
|
|
572
|
-
type:
|
|
569
|
+
type: INSERT_TARGET,
|
|
573
570
|
uri: uri,
|
|
574
571
|
target
|
|
575
572
|
};
|
|
@@ -597,15 +594,15 @@ class ChangeConverter {
|
|
|
597
594
|
getValueTypeFromSchema(schemaProvider, change) {
|
|
598
595
|
const { reference, uri, pointer } = change;
|
|
599
596
|
const annotationLists = schemaProvider().schema.annotations[uri] ?? [];
|
|
600
|
-
const annotation =
|
|
597
|
+
const annotation = findAnnotation(annotationLists, reference);
|
|
601
598
|
if (!annotation) {
|
|
602
|
-
const refString =
|
|
603
|
-
throw new
|
|
599
|
+
const refString = annotationReferenceToString(reference, uri);
|
|
600
|
+
throw new ApiError(`Could not find annotation '${refString}' in file '${uri}'.`, ApiErrorCode.General);
|
|
604
601
|
}
|
|
605
|
-
const node =
|
|
602
|
+
const node = getAvtNodeFromPointer(annotation, pointer);
|
|
606
603
|
if (!node) {
|
|
607
|
-
const refString =
|
|
608
|
-
throw new
|
|
604
|
+
const refString = annotationReferenceToString(reference, uri);
|
|
605
|
+
throw new ApiError(`Could not resolve pointer '${pointer}' from annotation '${refString}'.`, ApiErrorCode.General);
|
|
609
606
|
}
|
|
610
607
|
if (this.isExpression(node)) {
|
|
611
608
|
return node.type;
|
|
@@ -620,9 +617,9 @@ class ChangeConverter {
|
|
|
620
617
|
if (cachedValue) {
|
|
621
618
|
return cachedValue;
|
|
622
619
|
}
|
|
623
|
-
const namespaces =
|
|
624
|
-
const aliasInfo =
|
|
625
|
-
const aliasInfoWithAllVocabularies =
|
|
620
|
+
const namespaces = getAllNamespacesAndReferences(file.namespace ?? { name: this.serviceName, type: 'namespace' }, file.references);
|
|
621
|
+
const aliasInfo = getAliasInformation(namespaces, this.metadataService.getNamespaces());
|
|
622
|
+
const aliasInfoWithAllVocabularies = addAllVocabulariesToAliasInformation(aliasInfo, this.vocabularyAPI.getVocabularies());
|
|
626
623
|
this.aliasInfoCache[file.uri] = aliasInfoWithAllVocabularies;
|
|
627
624
|
return aliasInfoWithAllVocabularies;
|
|
628
625
|
}
|
|
@@ -632,28 +629,27 @@ class ChangeConverter {
|
|
|
632
629
|
this.annotationFileChanges = [];
|
|
633
630
|
}
|
|
634
631
|
}
|
|
635
|
-
exports.ChangeConverter = ChangeConverter;
|
|
636
632
|
function mergeChanges(changes) {
|
|
637
633
|
const result = [];
|
|
638
634
|
const inserts = changes
|
|
639
|
-
.filter((change) => change.kind ===
|
|
635
|
+
.filter((change) => change.kind === ChangeType.InsertAnnotation)
|
|
640
636
|
.reduce((acc, change) => {
|
|
641
637
|
const reference = {
|
|
642
638
|
target: change.content.target,
|
|
643
639
|
term: change.content.value.term,
|
|
644
640
|
qualifier: change.content.value.qualifier
|
|
645
641
|
};
|
|
646
|
-
const key =
|
|
642
|
+
const key = annotationReferenceToString(reference, change.uri);
|
|
647
643
|
acc.set(key, change);
|
|
648
644
|
return acc;
|
|
649
645
|
}, new Map());
|
|
650
646
|
for (const change of changes) {
|
|
651
|
-
if (change.kind ===
|
|
647
|
+
if (change.kind === ChangeType.InsertAnnotation) {
|
|
652
648
|
// don't do anything with annotation inserts
|
|
653
649
|
result.push(change);
|
|
654
650
|
continue;
|
|
655
651
|
}
|
|
656
|
-
const key =
|
|
652
|
+
const key = annotationReferenceToString(change.reference, change.uri);
|
|
657
653
|
const insert = inserts.get(key);
|
|
658
654
|
if (!insert) {
|
|
659
655
|
// reference should exist -> continue normally
|
|
@@ -666,9 +662,9 @@ function mergeChanges(changes) {
|
|
|
666
662
|
return result;
|
|
667
663
|
}
|
|
668
664
|
function mergeChange(target, source) {
|
|
669
|
-
const reference =
|
|
665
|
+
const reference = annotationReferenceToString(source.reference, source.uri);
|
|
670
666
|
switch (source.kind) {
|
|
671
|
-
case
|
|
667
|
+
case ChangeType.InsertEmbeddedAnnotation: {
|
|
672
668
|
if (target.content.value.annotations) {
|
|
673
669
|
target.content.value.annotations.push(source.content.value);
|
|
674
670
|
}
|
|
@@ -677,10 +673,10 @@ function mergeChange(target, source) {
|
|
|
677
673
|
}
|
|
678
674
|
return;
|
|
679
675
|
}
|
|
680
|
-
case
|
|
681
|
-
const node =
|
|
676
|
+
case ChangeType.Insert: {
|
|
677
|
+
const node = getAvtNodeFromPointer(target.content.value, source.pointer);
|
|
682
678
|
if (!node) {
|
|
683
|
-
throw new
|
|
679
|
+
throw new ApiError(`Change merge for '${reference}' failed! Could not resolve '${source.pointer}'.`, ApiErrorCode.General);
|
|
684
680
|
}
|
|
685
681
|
if (Array.isArray(node) && source.content.type === 'record') {
|
|
686
682
|
if (source.index === undefined || source.index >= node.length) {
|
|
@@ -691,34 +687,34 @@ function mergeChange(target, source) {
|
|
|
691
687
|
}
|
|
692
688
|
return;
|
|
693
689
|
}
|
|
694
|
-
throw new
|
|
690
|
+
throw new ApiError(`Change merge for '${reference}' failed! Change value type '${source.content.type}' is not supported.`, ApiErrorCode.General);
|
|
695
691
|
}
|
|
696
692
|
default:
|
|
697
693
|
break;
|
|
698
694
|
}
|
|
699
|
-
throw new
|
|
695
|
+
throw new ApiError(`Change merge for '${reference}' failed! Change type '${source.kind}' is not supported.`, ApiErrorCode.General);
|
|
700
696
|
}
|
|
701
697
|
function convertChangeToElement(aliasInfoMod, file, change) {
|
|
702
698
|
if (change.content.type === 'record') {
|
|
703
699
|
const { content } = change;
|
|
704
|
-
return
|
|
700
|
+
return convertRecordToInternal(aliasInfoMod, content.value);
|
|
705
701
|
}
|
|
706
702
|
else if (change.content.type === 'property-value') {
|
|
707
703
|
const { content } = change;
|
|
708
|
-
return
|
|
704
|
+
return convertPropertyValueToInternal(aliasInfoMod, content.value);
|
|
709
705
|
}
|
|
710
706
|
else if (change.content.type === 'collection') {
|
|
711
707
|
const { content } = change;
|
|
712
|
-
return
|
|
708
|
+
return convertCollectionToInternal(aliasInfoMod, content.value);
|
|
713
709
|
}
|
|
714
710
|
else if (change.content.type === 'expression') {
|
|
715
711
|
const { content } = change;
|
|
716
|
-
return
|
|
712
|
+
return convertExpressionToInternal(aliasInfoMod, content.value);
|
|
717
713
|
}
|
|
718
714
|
else if (change.content.type === 'primitive') {
|
|
719
715
|
const { content } = change;
|
|
720
|
-
if (content.expressionType ===
|
|
721
|
-
return
|
|
716
|
+
if (content.expressionType === ExpressionType.Null) {
|
|
717
|
+
return createElementNode({ name: Edm.Null });
|
|
722
718
|
}
|
|
723
719
|
}
|
|
724
720
|
return undefined;
|