@sap/cds-compiler 2.12.0 → 2.15.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +221 -15
- package/bin/cdsc.js +125 -50
- package/bin/cdsse.js +2 -2
- package/doc/CHANGELOG_BETA.md +13 -6
- package/doc/CHANGELOG_DEPRECATED.md +22 -6
- package/doc/NameResolution.md +21 -16
- package/lib/api/main.js +47 -84
- package/lib/api/options.js +5 -6
- package/lib/api/validate.js +6 -11
- package/lib/backends.js +15 -23
- package/lib/base/dictionaries.js +0 -8
- package/lib/base/error.js +26 -0
- package/lib/base/keywords.js +7 -17
- package/lib/base/location.js +9 -4
- package/lib/base/message-registry.js +114 -18
- package/lib/base/messages.js +101 -90
- package/lib/base/model.js +2 -63
- package/lib/base/optionProcessorHelper.js +177 -123
- package/lib/checks/annotationsOData.js +12 -33
- package/lib/checks/arrayOfs.js +1 -34
- package/lib/checks/cdsPersistence.js +2 -1
- package/lib/checks/enricher.js +17 -1
- package/lib/checks/invalidTarget.js +3 -1
- package/lib/checks/managedWithoutKeys.js +3 -1
- package/lib/checks/selectItems.js +4 -4
- package/lib/checks/sql-snippets.js +27 -26
- package/lib/checks/types.js +1 -1
- package/lib/checks/validator.js +6 -11
- package/lib/compiler/assert-consistency.js +6 -3
- package/lib/compiler/base.js +1 -0
- package/lib/compiler/builtins.js +19 -6
- package/lib/compiler/checks.js +23 -60
- package/lib/compiler/cycle-detector.js +1 -1
- package/lib/compiler/define.js +1151 -0
- package/lib/compiler/extend.js +1000 -0
- package/lib/compiler/finalize-parse-cdl.js +237 -0
- package/lib/compiler/index.js +107 -39
- package/lib/compiler/kick-start.js +190 -0
- package/lib/compiler/moduleLayers.js +4 -4
- package/lib/compiler/populate.js +1227 -0
- package/lib/compiler/propagator.js +114 -46
- package/lib/compiler/resolve.js +1521 -0
- package/lib/compiler/shared.js +126 -65
- package/lib/compiler/tweak-assocs.js +535 -0
- package/lib/compiler/utils.js +197 -33
- package/lib/edm/.eslintrc.json +5 -0
- package/lib/edm/annotations/genericTranslation.js +38 -24
- package/lib/edm/annotations/preprocessAnnotations.js +2 -2
- package/lib/edm/csn2edm.js +219 -100
- package/lib/edm/edm.js +302 -230
- package/lib/edm/edmPreprocessor.js +554 -419
- package/lib/edm/edmUtils.js +138 -44
- package/lib/gen/Dictionary.json +100 -19
- package/lib/gen/language.checksum +1 -1
- package/lib/gen/language.interp +11 -1
- package/lib/gen/language.tokens +86 -83
- package/lib/gen/languageLexer.interp +10 -1
- package/lib/gen/languageLexer.js +860 -833
- package/lib/gen/languageLexer.tokens +78 -75
- package/lib/gen/languageParser.js +5765 -4480
- package/lib/json/csnVersion.js +10 -11
- package/lib/json/from-csn.js +15 -3
- package/lib/json/to-csn.js +126 -68
- package/lib/language/docCommentParser.js +4 -4
- package/lib/language/genericAntlrParser.js +123 -5
- package/lib/language/language.g4 +355 -156
- package/lib/language/multiLineStringParser.js +5 -5
- package/lib/main.d.ts +486 -59
- package/lib/main.js +41 -9
- package/lib/model/api.js +3 -1
- package/lib/model/csnRefs.js +252 -156
- package/lib/model/csnUtils.js +384 -297
- package/lib/model/enrichCsn.js +71 -29
- package/lib/model/revealInternalProperties.js +29 -8
- package/lib/model/sortViews.js +2 -1
- package/lib/modelCompare/compare.js +23 -18
- package/lib/optionProcessor.js +63 -26
- package/lib/render/manageConstraints.js +35 -32
- package/lib/render/toCdl.js +897 -947
- package/lib/render/toHdbcds.js +205 -257
- package/lib/render/toSql.js +264 -225
- package/lib/render/utils/common.js +136 -25
- package/lib/render/utils/sql.js +4 -3
- package/lib/render/utils/stringEscapes.js +111 -0
- package/lib/sql-identifier.js +1 -1
- package/lib/transform/.eslintrc.json +5 -0
- package/lib/transform/db/.eslintrc.json +3 -1
- package/lib/transform/db/applyTransformations.js +35 -12
- package/lib/transform/db/assertUnique.js +1 -1
- package/lib/transform/db/associations.js +104 -306
- package/lib/transform/db/cdsPersistence.js +2 -2
- package/lib/transform/db/constraints.js +58 -53
- package/lib/transform/db/expansion.js +60 -33
- package/lib/transform/db/flattening.js +582 -104
- package/lib/transform/db/groupByOrderBy.js +3 -1
- package/lib/transform/db/transformExists.js +66 -13
- package/lib/transform/db/views.js +11 -7
- package/lib/transform/draft/.eslintrc.json +38 -0
- package/lib/transform/{db/draft.js → draft/db.js} +6 -5
- package/lib/transform/draft/odata.js +227 -0
- package/lib/transform/forHanaNew.js +109 -208
- package/lib/transform/forOdataNew.js +59 -212
- package/lib/transform/localized.js +46 -26
- package/lib/transform/odata/toFinalBaseType.js +85 -11
- package/lib/transform/odata/typesExposure.js +147 -199
- package/lib/transform/odata/utils.js +2 -2
- package/lib/transform/transformUtilsNew.js +44 -33
- package/lib/transform/translateAssocsToJoins.js +3 -20
- package/lib/transform/universalCsn/.eslintrc.json +36 -0
- package/lib/transform/universalCsn/coreComputed.js +172 -0
- package/lib/transform/universalCsn/universalCsnEnricher.js +737 -0
- package/lib/transform/universalCsn/utils.js +63 -0
- package/lib/utils/moduleResolve.js +13 -6
- package/lib/utils/objectUtils.js +30 -0
- package/package.json +1 -1
- package/share/messages/README.md +26 -0
- package/share/messages/message-explanations.json +2 -1
- package/share/messages/syntax-expected-integer.md +37 -0
- package/lib/compiler/definer.js +0 -2361
- package/lib/compiler/resolver.js +0 -3079
- package/lib/transform/odata/attachPath.js +0 -96
- package/lib/transform/odata/expandStructKeysInAssociations.js +0 -59
- package/lib/transform/odata/generateForeignKeyElements.js +0 -261
- package/lib/transform/odata/referenceFlattener.js +0 -290
- package/lib/transform/odata/sortByAssociationDependency.js +0 -105
- package/lib/transform/odata/structuralPath.js +0 -72
- package/lib/transform/odata/structureFlattener.js +0 -171
- package/lib/transform/universalCsnEnricher.js +0 -237
|
@@ -1,237 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const { setProp } = require('../base/model');
|
|
4
|
-
const {
|
|
5
|
-
forEachDefinition,
|
|
6
|
-
forAllQueries,
|
|
7
|
-
getUtils,
|
|
8
|
-
forEachMember,
|
|
9
|
-
forEachMemberRecursively,
|
|
10
|
-
} = require('../model/csnUtils');
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Loop through a universal CSN and enrich it with the properties/annotations
|
|
14
|
-
* from the source definition - modifies the input model in-place
|
|
15
|
-
*
|
|
16
|
-
* @param {CSN.Model} csn
|
|
17
|
-
* @param {CSN.Options} options
|
|
18
|
-
*/
|
|
19
|
-
module.exports = function (csn, options) {
|
|
20
|
-
let { getOrigin, getQueryPrimarySource, artifactRef } = getUtils(csn);
|
|
21
|
-
|
|
22
|
-
// Properties on definition level that we treat specially.
|
|
23
|
-
// TODO: There might be more annotations that will need special treatment
|
|
24
|
-
// see lib/compiler/propagator.js for reference
|
|
25
|
-
const defProps = {
|
|
26
|
-
'@cds.autoexpose': onlyViaArtifact,
|
|
27
|
-
'@fiori.draft.enabled': onlyViaArtifact,
|
|
28
|
-
'@': (prop, target, source) => { target[prop] = source[prop] },
|
|
29
|
-
// Example: `type E : F;` does not have `elements`, but they are required for e.g. OData.
|
|
30
|
-
'elements': onlyTypeDef,
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// In this first loop through the model, missing properties in universal CSN
|
|
34
|
-
// are propagated so the CSN can become client one
|
|
35
|
-
forEachDefinition(csn, propagate);
|
|
36
|
-
|
|
37
|
-
// The $origin properties need to be removed separately
|
|
38
|
-
// as the values are used in csnRef::getOrigin that is used during
|
|
39
|
-
// the propagation above.
|
|
40
|
-
// Currently testMode-only for comparison against client CSN.
|
|
41
|
-
if (options.testMode) removeDollarProperties(csn);
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Identify the sources of the passed object and propagate the relevant
|
|
45
|
-
* properties/annotations.
|
|
46
|
-
*
|
|
47
|
-
* @param {Object} art Target object for propagation
|
|
48
|
-
*/
|
|
49
|
-
function propagate(art) {
|
|
50
|
-
// check if art was already processed by the status flag
|
|
51
|
-
// TODO: clean up later on, together with validator clean up probably or
|
|
52
|
-
// when this module is meant to be used standalone -> use internal cache to store already processed definitions?
|
|
53
|
-
if (art._status === 'propagated') return;
|
|
54
|
-
|
|
55
|
-
// collect chain of origins and propagate
|
|
56
|
-
// from the farthest to the nearest one to the target
|
|
57
|
-
let chain = [];
|
|
58
|
-
let target = art;
|
|
59
|
-
let origin = undefined;
|
|
60
|
-
do {
|
|
61
|
-
origin = getOrigin(target);
|
|
62
|
-
if (origin) {
|
|
63
|
-
chain.push({ target, origin });
|
|
64
|
-
target = origin;
|
|
65
|
-
}
|
|
66
|
-
} while (origin);
|
|
67
|
-
|
|
68
|
-
if (chain.length)
|
|
69
|
-
chain.reverse().forEach(propagateSingleStep);
|
|
70
|
-
else
|
|
71
|
-
// even if there weren't any found origin(s) on definition level
|
|
72
|
-
// we need to loop through the members
|
|
73
|
-
// TODO: construct use-/test-case where there might be the need that an origin chain
|
|
74
|
-
// needs to be constructed for members as well, specifically for this 'else'
|
|
75
|
-
// case where we do not run through the definitions
|
|
76
|
-
propagateMembersProps(target);
|
|
77
|
-
|
|
78
|
-
function propagateSingleStep({ target, origin }) {
|
|
79
|
-
// if target was already processed -> continue
|
|
80
|
-
if (target._status === 'propagated') return;
|
|
81
|
-
// propagate relevant definition level properties
|
|
82
|
-
// we check for kind as in the future the function should be
|
|
83
|
-
// generic and work for parts of CSN
|
|
84
|
-
if (target.kind) propagateDefProps(target, origin);
|
|
85
|
-
// propagate properties to members
|
|
86
|
-
propagateMembersProps(target);
|
|
87
|
-
|
|
88
|
-
setProp(target, '_status', 'propagated');
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Propagate from 'source' to 'target' the relevant properties
|
|
93
|
-
* for CSN definitions.
|
|
94
|
-
*
|
|
95
|
-
* @param {CSN.Definition} target
|
|
96
|
-
* @param {CSN.Definition} source
|
|
97
|
-
*/
|
|
98
|
-
function propagateDefProps(target, source) {
|
|
99
|
-
const keys = Object.keys(source);
|
|
100
|
-
for (const prop of keys) {
|
|
101
|
-
// do not overwrite properties in target def
|
|
102
|
-
if (!(prop in target)) {
|
|
103
|
-
const func = defProps[prop] || defProps[prop.charAt(0)];
|
|
104
|
-
if (func) func(prop, target, source);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Propagate properties from Universal to Client CSN relevant for members.
|
|
111
|
-
*
|
|
112
|
-
* @param {CSN.Artifact} target
|
|
113
|
-
*/
|
|
114
|
-
function propagateMembersProps(target) {
|
|
115
|
-
// TODO: in the future, consider case when target is a member itself,
|
|
116
|
-
// for when we do not run with the complete CSN
|
|
117
|
-
// TODO: use newly added 'forEachMemberRecursivelyWithQuery'
|
|
118
|
-
forEachMemberRecursively(target, (member) => {
|
|
119
|
-
propagateMemberPropsFromOrigin(member);
|
|
120
|
-
if (member.target && !member.keys && !member.on)
|
|
121
|
-
calculateForeignKeys(member);
|
|
122
|
-
});
|
|
123
|
-
target.query && forAllQueries(target.query, (query) => {
|
|
124
|
-
if (query.SELECT && query.SELECT.elements) {
|
|
125
|
-
forEachMember(query.SELECT, (member) => {
|
|
126
|
-
propagateMemberPropsFromOrigin(member);
|
|
127
|
-
if (member.target && !member.keys && !member.on)
|
|
128
|
-
calculateForeignKeys(member);
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
setProp(target, '_status', 'propagated');
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
function propagateMemberPropsFromOrigin(member) {
|
|
136
|
-
// For empty members (`{}`), the origin was set in a previous call to `getOrigin(definition)`.
|
|
137
|
-
const memberOrigin = getOrigin(member);
|
|
138
|
-
if (!memberOrigin) return;
|
|
139
|
-
|
|
140
|
-
// when having an element with a type property that is
|
|
141
|
-
// user-defined there is no need to propagate 'elements',
|
|
142
|
-
// 'kind', etc. from the origin (which is the type definition)
|
|
143
|
-
if (member.type && Object.keys(member).length === 1) return;
|
|
144
|
-
|
|
145
|
-
const keys = Object.keys(memberOrigin);
|
|
146
|
-
// Copy over properties from the origin element.
|
|
147
|
-
// Don't propagate "kind" as this property is not allowed in elements.
|
|
148
|
-
for (const key of keys) {
|
|
149
|
-
if (!(key in member) && key !== 'kind')
|
|
150
|
-
member[key] = memberOrigin[key];
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// copy over own annotations/properties
|
|
154
|
-
// TODO: try to create use-/test-case where this needs
|
|
155
|
-
// to be applied on definition level, ATM it is done only for members
|
|
156
|
-
if (member.$origin && !Array.isArray(member.$origin) && member.$origin.$origin) {
|
|
157
|
-
const ownKeys = Object.keys(member.$origin);
|
|
158
|
-
for (const key of ownKeys) {
|
|
159
|
-
if (key !== '$origin')
|
|
160
|
-
member[key] = member.$origin[key];
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
// In case of managed composition an anonymous $origin is used.
|
|
165
|
-
// csnRefs::getOrigin returns {} for such a member, thus have to recreate the client CSN from
|
|
166
|
-
// the values in the $origin. PR #8072
|
|
167
|
-
if (!Object.keys(memberOrigin).length && member.$origin && member.$origin.type === 'cds.Composition') {
|
|
168
|
-
member.type = member.$origin.type;
|
|
169
|
-
member.cardinality = member.$origin.cardinality;
|
|
170
|
-
member.targetAspect = member.$origin.target;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
function calculateForeignKeys(member) {
|
|
175
|
-
// managed assocs in universal CSN have no longer keys
|
|
176
|
-
// if they are not explicitly defined - PR#8064
|
|
177
|
-
const target = artifactRef(member.target);
|
|
178
|
-
const targetKeys = Object.keys(target.elements).filter((key) => target.elements[key].key);
|
|
179
|
-
member.keys = targetKeys.map(
|
|
180
|
-
keyName => { return { ref: [keyName] } }
|
|
181
|
-
);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
/**
|
|
187
|
-
* @cds.autoexpose for example, is propagated only if at definition level and only if
|
|
188
|
-
* the primary source (left-most) does not follow an association.
|
|
189
|
-
*
|
|
190
|
-
* @param {String} prop
|
|
191
|
-
* @param {CSN.Definition} target
|
|
192
|
-
* @param {CSN.Definition} source
|
|
193
|
-
*/
|
|
194
|
-
function onlyViaArtifact(prop, target, source) {
|
|
195
|
-
if (!target.kind) return;
|
|
196
|
-
const primarySourceRef = getQueryPrimarySource(target.query || target.projection);
|
|
197
|
-
const artRef = primarySourceRef ? artifactRef(primarySourceRef) : source;
|
|
198
|
-
if (!artRef.target) {
|
|
199
|
-
target[prop] = source[prop];
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* Execute only if the target definition is a user-defined type.
|
|
205
|
-
*
|
|
206
|
-
* @param {String} prop
|
|
207
|
-
* @param {CSN.Definition} target
|
|
208
|
-
* @param {CSN.Definition} source
|
|
209
|
-
* @returns
|
|
210
|
-
*/
|
|
211
|
-
function onlyTypeDef(prop, target, source) {
|
|
212
|
-
if (target.kind !== 'type') return;
|
|
213
|
-
target[prop] = source[prop];
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
/**
|
|
217
|
-
* Removes every occurrence of '$origin' and '$generated'
|
|
218
|
-
* for compatibility with what we have in client CSN.
|
|
219
|
-
*
|
|
220
|
-
* @param {CSN.Model} csn
|
|
221
|
-
*/
|
|
222
|
-
function removeDollarProperties(csn) {
|
|
223
|
-
forEachDefinition(csn, (def) => {
|
|
224
|
-
delete def.$origin;
|
|
225
|
-
delete def.$generated;
|
|
226
|
-
// TODO: use newly added 'forEachMemberRecursivelyWithQuery'
|
|
227
|
-
forEachMemberRecursively(def, (member) => delete member.$origin);
|
|
228
|
-
def.query && forAllQueries(def.query, (query) => {
|
|
229
|
-
if (query.SELECT && query.SELECT.elements) {
|
|
230
|
-
forEachMember(query.SELECT, (member) => {
|
|
231
|
-
delete member.$origin;
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
});
|
|
235
|
-
})
|
|
236
|
-
}
|
|
237
|
-
}
|