@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.
Files changed (128) hide show
  1. package/CHANGELOG.md +221 -15
  2. package/bin/cdsc.js +125 -50
  3. package/bin/cdsse.js +2 -2
  4. package/doc/CHANGELOG_BETA.md +13 -6
  5. package/doc/CHANGELOG_DEPRECATED.md +22 -6
  6. package/doc/NameResolution.md +21 -16
  7. package/lib/api/main.js +47 -84
  8. package/lib/api/options.js +5 -6
  9. package/lib/api/validate.js +6 -11
  10. package/lib/backends.js +15 -23
  11. package/lib/base/dictionaries.js +0 -8
  12. package/lib/base/error.js +26 -0
  13. package/lib/base/keywords.js +7 -17
  14. package/lib/base/location.js +9 -4
  15. package/lib/base/message-registry.js +114 -18
  16. package/lib/base/messages.js +101 -90
  17. package/lib/base/model.js +2 -63
  18. package/lib/base/optionProcessorHelper.js +177 -123
  19. package/lib/checks/annotationsOData.js +12 -33
  20. package/lib/checks/arrayOfs.js +1 -34
  21. package/lib/checks/cdsPersistence.js +2 -1
  22. package/lib/checks/enricher.js +17 -1
  23. package/lib/checks/invalidTarget.js +3 -1
  24. package/lib/checks/managedWithoutKeys.js +3 -1
  25. package/lib/checks/selectItems.js +4 -4
  26. package/lib/checks/sql-snippets.js +27 -26
  27. package/lib/checks/types.js +1 -1
  28. package/lib/checks/validator.js +6 -11
  29. package/lib/compiler/assert-consistency.js +6 -3
  30. package/lib/compiler/base.js +1 -0
  31. package/lib/compiler/builtins.js +19 -6
  32. package/lib/compiler/checks.js +23 -60
  33. package/lib/compiler/cycle-detector.js +1 -1
  34. package/lib/compiler/define.js +1151 -0
  35. package/lib/compiler/extend.js +1000 -0
  36. package/lib/compiler/finalize-parse-cdl.js +237 -0
  37. package/lib/compiler/index.js +107 -39
  38. package/lib/compiler/kick-start.js +190 -0
  39. package/lib/compiler/moduleLayers.js +4 -4
  40. package/lib/compiler/populate.js +1227 -0
  41. package/lib/compiler/propagator.js +114 -46
  42. package/lib/compiler/resolve.js +1521 -0
  43. package/lib/compiler/shared.js +126 -65
  44. package/lib/compiler/tweak-assocs.js +535 -0
  45. package/lib/compiler/utils.js +197 -33
  46. package/lib/edm/.eslintrc.json +5 -0
  47. package/lib/edm/annotations/genericTranslation.js +38 -24
  48. package/lib/edm/annotations/preprocessAnnotations.js +2 -2
  49. package/lib/edm/csn2edm.js +219 -100
  50. package/lib/edm/edm.js +302 -230
  51. package/lib/edm/edmPreprocessor.js +554 -419
  52. package/lib/edm/edmUtils.js +138 -44
  53. package/lib/gen/Dictionary.json +100 -19
  54. package/lib/gen/language.checksum +1 -1
  55. package/lib/gen/language.interp +11 -1
  56. package/lib/gen/language.tokens +86 -83
  57. package/lib/gen/languageLexer.interp +10 -1
  58. package/lib/gen/languageLexer.js +860 -833
  59. package/lib/gen/languageLexer.tokens +78 -75
  60. package/lib/gen/languageParser.js +5765 -4480
  61. package/lib/json/csnVersion.js +10 -11
  62. package/lib/json/from-csn.js +15 -3
  63. package/lib/json/to-csn.js +126 -68
  64. package/lib/language/docCommentParser.js +4 -4
  65. package/lib/language/genericAntlrParser.js +123 -5
  66. package/lib/language/language.g4 +355 -156
  67. package/lib/language/multiLineStringParser.js +5 -5
  68. package/lib/main.d.ts +486 -59
  69. package/lib/main.js +41 -9
  70. package/lib/model/api.js +3 -1
  71. package/lib/model/csnRefs.js +252 -156
  72. package/lib/model/csnUtils.js +384 -297
  73. package/lib/model/enrichCsn.js +71 -29
  74. package/lib/model/revealInternalProperties.js +29 -8
  75. package/lib/model/sortViews.js +2 -1
  76. package/lib/modelCompare/compare.js +23 -18
  77. package/lib/optionProcessor.js +63 -26
  78. package/lib/render/manageConstraints.js +35 -32
  79. package/lib/render/toCdl.js +897 -947
  80. package/lib/render/toHdbcds.js +205 -257
  81. package/lib/render/toSql.js +264 -225
  82. package/lib/render/utils/common.js +136 -25
  83. package/lib/render/utils/sql.js +4 -3
  84. package/lib/render/utils/stringEscapes.js +111 -0
  85. package/lib/sql-identifier.js +1 -1
  86. package/lib/transform/.eslintrc.json +5 -0
  87. package/lib/transform/db/.eslintrc.json +3 -1
  88. package/lib/transform/db/applyTransformations.js +35 -12
  89. package/lib/transform/db/assertUnique.js +1 -1
  90. package/lib/transform/db/associations.js +104 -306
  91. package/lib/transform/db/cdsPersistence.js +2 -2
  92. package/lib/transform/db/constraints.js +58 -53
  93. package/lib/transform/db/expansion.js +60 -33
  94. package/lib/transform/db/flattening.js +582 -104
  95. package/lib/transform/db/groupByOrderBy.js +3 -1
  96. package/lib/transform/db/transformExists.js +66 -13
  97. package/lib/transform/db/views.js +11 -7
  98. package/lib/transform/draft/.eslintrc.json +38 -0
  99. package/lib/transform/{db/draft.js → draft/db.js} +6 -5
  100. package/lib/transform/draft/odata.js +227 -0
  101. package/lib/transform/forHanaNew.js +109 -208
  102. package/lib/transform/forOdataNew.js +59 -212
  103. package/lib/transform/localized.js +46 -26
  104. package/lib/transform/odata/toFinalBaseType.js +85 -11
  105. package/lib/transform/odata/typesExposure.js +147 -199
  106. package/lib/transform/odata/utils.js +2 -2
  107. package/lib/transform/transformUtilsNew.js +44 -33
  108. package/lib/transform/translateAssocsToJoins.js +3 -20
  109. package/lib/transform/universalCsn/.eslintrc.json +36 -0
  110. package/lib/transform/universalCsn/coreComputed.js +172 -0
  111. package/lib/transform/universalCsn/universalCsnEnricher.js +737 -0
  112. package/lib/transform/universalCsn/utils.js +63 -0
  113. package/lib/utils/moduleResolve.js +13 -6
  114. package/lib/utils/objectUtils.js +30 -0
  115. package/package.json +1 -1
  116. package/share/messages/README.md +26 -0
  117. package/share/messages/message-explanations.json +2 -1
  118. package/share/messages/syntax-expected-integer.md +37 -0
  119. package/lib/compiler/definer.js +0 -2361
  120. package/lib/compiler/resolver.js +0 -3079
  121. package/lib/transform/odata/attachPath.js +0 -96
  122. package/lib/transform/odata/expandStructKeysInAssociations.js +0 -59
  123. package/lib/transform/odata/generateForeignKeyElements.js +0 -261
  124. package/lib/transform/odata/referenceFlattener.js +0 -290
  125. package/lib/transform/odata/sortByAssociationDependency.js +0 -105
  126. package/lib/transform/odata/structuralPath.js +0 -72
  127. package/lib/transform/odata/structureFlattener.js +0 -171
  128. 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
- }