@sap/cds-compiler 2.11.2 → 2.13.6

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 (140) hide show
  1. package/CHANGELOG.md +175 -2
  2. package/bin/.eslintrc.json +1 -2
  3. package/bin/cds_update_identifiers.js +10 -8
  4. package/bin/cdsc.js +23 -17
  5. package/bin/cdsse.js +2 -2
  6. package/bin/cdsv2m.js +3 -2
  7. package/doc/CHANGELOG_ARCHIVE.md +1 -1
  8. package/doc/CHANGELOG_BETA.md +25 -6
  9. package/doc/CHANGELOG_DEPRECATED.md +22 -6
  10. package/doc/NameResolution.md +21 -16
  11. package/lib/api/main.js +32 -79
  12. package/lib/api/options.js +3 -2
  13. package/lib/api/validate.js +2 -1
  14. package/lib/backends.js +16 -26
  15. package/lib/base/dictionaries.js +0 -8
  16. package/lib/base/error.js +26 -0
  17. package/lib/base/keywords.js +10 -19
  18. package/lib/base/location.js +9 -4
  19. package/lib/base/message-registry.js +75 -9
  20. package/lib/base/messages.js +31 -35
  21. package/lib/base/model.js +2 -62
  22. package/lib/base/optionProcessorHelper.js +246 -183
  23. package/lib/checks/.eslintrc.json +2 -0
  24. package/lib/checks/actionsFunctions.js +2 -1
  25. package/lib/checks/annotationsOData.js +1 -1
  26. package/lib/checks/cdsPersistence.js +2 -1
  27. package/lib/checks/emptyOrOnlyVirtual.js +2 -2
  28. package/lib/checks/enricher.js +17 -1
  29. package/lib/checks/foreignKeys.js +4 -4
  30. package/lib/checks/invalidTarget.js +3 -1
  31. package/lib/checks/managedInType.js +4 -4
  32. package/lib/checks/managedWithoutKeys.js +3 -1
  33. package/lib/checks/queryNoDbArtifacts.js +1 -3
  34. package/lib/checks/selectItems.js +4 -4
  35. package/lib/checks/sql-snippets.js +94 -0
  36. package/lib/checks/types.js +1 -1
  37. package/lib/checks/unknownMagic.js +1 -1
  38. package/lib/checks/validator.js +12 -7
  39. package/lib/compiler/assert-consistency.js +12 -8
  40. package/lib/compiler/base.js +0 -1
  41. package/lib/compiler/builtins.js +42 -21
  42. package/lib/compiler/checks.js +46 -12
  43. package/lib/compiler/cycle-detector.js +1 -1
  44. package/lib/compiler/define.js +1103 -0
  45. package/lib/compiler/extend.js +983 -0
  46. package/lib/compiler/finalize-parse-cdl.js +231 -0
  47. package/lib/compiler/index.js +46 -39
  48. package/lib/compiler/kick-start.js +190 -0
  49. package/lib/compiler/moduleLayers.js +4 -4
  50. package/lib/compiler/populate.js +1226 -0
  51. package/lib/compiler/propagator.js +113 -47
  52. package/lib/compiler/resolve.js +1433 -0
  53. package/lib/compiler/shared.js +100 -65
  54. package/lib/compiler/tweak-assocs.js +529 -0
  55. package/lib/compiler/utils.js +215 -33
  56. package/lib/edm/.eslintrc.json +5 -0
  57. package/lib/edm/annotations/genericTranslation.js +38 -25
  58. package/lib/edm/annotations/preprocessAnnotations.js +3 -3
  59. package/lib/edm/csn2edm.js +10 -9
  60. package/lib/edm/edm.js +19 -20
  61. package/lib/edm/edmPreprocessor.js +166 -95
  62. package/lib/edm/edmUtils.js +127 -34
  63. package/lib/gen/Dictionary.json +92 -43
  64. package/lib/gen/language.checksum +1 -1
  65. package/lib/gen/language.interp +11 -1
  66. package/lib/gen/language.tokens +86 -82
  67. package/lib/gen/languageLexer.interp +18 -1
  68. package/lib/gen/languageLexer.js +925 -847
  69. package/lib/gen/languageLexer.tokens +78 -74
  70. package/lib/gen/languageParser.js +5434 -4298
  71. package/lib/json/from-csn.js +59 -17
  72. package/lib/json/to-csn.js +189 -71
  73. package/lib/language/antlrParser.js +3 -3
  74. package/lib/language/docCommentParser.js +3 -3
  75. package/lib/language/errorStrategy.js +26 -8
  76. package/lib/language/genericAntlrParser.js +144 -53
  77. package/lib/language/language.g4 +424 -200
  78. package/lib/language/multiLineStringParser.js +536 -0
  79. package/lib/main.d.ts +550 -61
  80. package/lib/main.js +38 -11
  81. package/lib/model/api.js +3 -1
  82. package/lib/model/csnRefs.js +322 -198
  83. package/lib/model/csnUtils.js +226 -370
  84. package/lib/model/enrichCsn.js +124 -69
  85. package/lib/model/revealInternalProperties.js +29 -7
  86. package/lib/model/sortViews.js +10 -2
  87. package/lib/modelCompare/compare.js +17 -12
  88. package/lib/optionProcessor.js +8 -3
  89. package/lib/render/.eslintrc.json +1 -2
  90. package/lib/render/DuplicateChecker.js +1 -1
  91. package/lib/render/manageConstraints.js +36 -33
  92. package/lib/render/toCdl.js +174 -275
  93. package/lib/render/toHdbcds.js +203 -122
  94. package/lib/render/toRename.js +7 -10
  95. package/lib/render/toSql.js +161 -82
  96. package/lib/render/utils/common.js +22 -8
  97. package/lib/render/utils/sql.js +10 -7
  98. package/lib/render/utils/stringEscapes.js +111 -0
  99. package/lib/sql-identifier.js +1 -1
  100. package/lib/transform/.eslintrc.json +5 -0
  101. package/lib/transform/braceExpression.js +4 -2
  102. package/lib/transform/db/.eslintrc.json +2 -0
  103. package/lib/transform/db/applyTransformations.js +212 -0
  104. package/lib/transform/db/assertUnique.js +1 -1
  105. package/lib/transform/db/associations.js +187 -0
  106. package/lib/transform/db/cdsPersistence.js +150 -0
  107. package/lib/transform/db/constraints.js +61 -56
  108. package/lib/transform/db/expansion.js +50 -29
  109. package/lib/transform/db/flattening.js +556 -106
  110. package/lib/transform/db/groupByOrderBy.js +3 -1
  111. package/lib/transform/db/temporal.js +236 -0
  112. package/lib/transform/db/transformExists.js +103 -28
  113. package/lib/transform/db/views.js +92 -44
  114. package/lib/transform/draft/.eslintrc.json +38 -0
  115. package/lib/transform/{db/draft.js → draft/db.js} +9 -7
  116. package/lib/transform/draft/odata.js +227 -0
  117. package/lib/transform/forHanaNew.js +98 -783
  118. package/lib/transform/forOdataNew.js +22 -175
  119. package/lib/transform/localized.js +36 -32
  120. package/lib/transform/odata/generateForeignKeyElements.js +3 -3
  121. package/lib/transform/odata/referenceFlattener.js +95 -89
  122. package/lib/transform/odata/structureFlattener.js +1 -1
  123. package/lib/transform/odata/toFinalBaseType.js +86 -12
  124. package/lib/transform/odata/typesExposure.js +5 -5
  125. package/lib/transform/odata/utils.js +2 -2
  126. package/lib/transform/transformUtilsNew.js +47 -33
  127. package/lib/transform/translateAssocsToJoins.js +13 -30
  128. package/lib/transform/universalCsn/.eslintrc.json +36 -0
  129. package/lib/transform/universalCsn/coreComputed.js +170 -0
  130. package/lib/transform/universalCsn/universalCsnEnricher.js +715 -0
  131. package/lib/transform/universalCsn/utils.js +63 -0
  132. package/lib/utils/file.js +8 -3
  133. package/lib/utils/objectUtils.js +30 -0
  134. package/lib/utils/timetrace.js +8 -2
  135. package/package.json +1 -1
  136. package/share/messages/README.md +26 -0
  137. package/lib/compiler/definer.js +0 -2349
  138. package/lib/compiler/resolver.js +0 -2922
  139. package/lib/transform/db/helpers.js +0 -58
  140. package/lib/transform/universalCsnEnricher.js +0 -67
package/lib/main.js CHANGED
@@ -18,11 +18,14 @@ const { odata, cdl, sql, hdi, hdbcds, edm, edmx } = require('./api/main');
18
18
  const { getArtifactDatabaseNameOf, getElementDatabaseNameOf } = require('./model/csnUtils');
19
19
  const { traverseCsn } = require('./model/api');
20
20
  const { createMessageFunctions, sortMessages, sortMessagesSeverityAware, deduplicateMessages } = require('./base/messages');
21
+ const { smartId, smartFuncId, delimitedId } = require('./sql-identifier');
22
+ const keywords = require( './base/keywords' );
21
23
 
22
24
  const parseLanguage = require('./language/antlrParser');
23
25
  const { parseX, compileX, compileSyncX, compileSourcesX, InvocationError } = require('./compiler');
24
26
  const { fns } = require('./compiler/shared');
25
- const { define } = require('./compiler/definer');
27
+ const define = require('./compiler/define');
28
+ const finalizeParseCdl = require('./compiler/finalize-parse-cdl');
26
29
 
27
30
  // The compiler version (taken from package.json)
28
31
  function version() {
@@ -41,33 +44,35 @@ const {
41
44
 
42
45
  const { compactModel, compactQuery, compactExpr } = require('./json/to-csn')
43
46
 
44
- function parseCdl( cdl, filename, options = {} ) {
47
+ function parseCdl( cdlSource, filename, options = {} ) {
45
48
  options = Object.assign( {}, options, { parseCdl: true } );
46
49
  const sources = Object.create(null);
50
+ /** @type {XSN.Model} */
47
51
  const model = { sources, options, $functions: {}, $volatileFunctions: {} };
48
52
  const messageFunctions = createMessageFunctions( options, 'parse', model );
49
53
  model.$messageFunctions = messageFunctions;
50
54
 
51
- const xsn = parseLanguage( cdl, filename, Object.assign( { parseOnly: true }, options ),
55
+ const xsn = parseLanguage( cdlSource, filename, Object.assign( { parseOnly: true }, options ),
52
56
  messageFunctions );
53
57
  sources[filename] = xsn;
54
58
  fns( model );
55
59
  define( model );
60
+ finalizeParseCdl( model );
56
61
  messageFunctions.throwWithError();
57
62
  return compactModel( model );
58
63
  }
59
64
 
60
- function parseCql( cdl, filename = '<query>.cds', options = {} ) {
65
+ function parseCql( cdlSource, filename = '<query>.cds', options = {} ) {
61
66
  const messageFunctions = createMessageFunctions( options, 'parse' );
62
- const xsn = parseLanguage( cdl, filename, Object.assign( { parseOnly: true }, options ),
67
+ const xsn = parseLanguage( cdlSource, filename, Object.assign( { parseOnly: true }, options ),
63
68
  messageFunctions, 'query' );
64
69
  messageFunctions.throwWithError();
65
70
  return compactQuery( xsn );
66
71
  }
67
72
 
68
- function parseExpr( cdl, filename = '<expr>.cds', options = {} ) {
73
+ function parseExpr( cdlSource, filename = '<expr>.cds', options = {} ) {
69
74
  const messageFunctions = createMessageFunctions( options, 'parse' );
70
- const xsn = parseLanguage( cdl, filename, Object.assign( { parseOnly: true }, options ),
75
+ const xsn = parseLanguage( cdlSource, filename, Object.assign( { parseOnly: true }, options ),
71
76
  messageFunctions, 'expr' );
72
77
  messageFunctions.throwWithError();
73
78
  return compactExpr( xsn );
@@ -79,8 +84,8 @@ module.exports = {
79
84
  // Compiler
80
85
  version,
81
86
  compile: (...args) => compileX(...args).then( compactModel ), // main function
82
- compileSync: (...args) => compactModel( compileSyncX(...args) ), // main function
83
- compileSources: (...args) => compactModel( compileSourcesX(...args) ), // main function
87
+ compileSync: (filenames, dir, options, fileCache) => compactModel( compileSyncX(filenames, dir, options, fileCache) ), // main function
88
+ compileSources: (sourcesDict, options) => compactModel( compileSourcesX(sourcesDict, options) ), // main function
84
89
  compactModel: csn => csn, // for easy v2 migration
85
90
  CompilationError,
86
91
  sortMessages,
@@ -106,10 +111,32 @@ module.exports = {
106
111
  * @deprecated Use parse.cql instead
107
112
  */
108
113
  parseToCqn: parseCql,
114
+ /**
115
+ * @deprecated Use parse.expr instead
116
+ */
109
117
  parseToExpr: parseExpr, // deprecated name
110
118
  // SNAPI
111
119
  for: { odata },
112
- to: { cdl, sql, hdi, hdbcds, edm, edmx },
120
+ to: {
121
+ cdl: Object.assign(cdl, {
122
+ keywords: Object.freeze([ ...keywords.cdl ]),
123
+ functions: Object.freeze([ ...keywords.cdl_functions ]),
124
+ }),
125
+ sql: Object.assign(sql, {
126
+ sqlite: { keywords: Object.freeze([ ...keywords.sqlite ] )},
127
+ smartId,
128
+ smartFunctionId: smartFuncId,
129
+ delimitedId,
130
+ }),
131
+ hdi: Object.assign(hdi, {
132
+ keywords: Object.freeze([ ...keywords.hana ]),
133
+ }),
134
+ hdbcds: Object.assign(hdbcds, {
135
+ keywords: Object.freeze([ ...keywords.hdbcds ]),
136
+ }),
137
+ edm,
138
+ edmx
139
+ },
113
140
  // Convenience for hdbtabledata calculation in @sap/cds
114
141
  getArtifactCdsPersistenceName: getArtifactDatabaseNameOf,
115
142
  getElementCdsPersistenceName: getElementDatabaseNameOf,
@@ -120,5 +147,5 @@ module.exports = {
120
147
  // INTERNAL functions for the cds-lsp package and friends - before you use
121
148
  // it, you MUST talk with us - there can be potential incompatibilities with
122
149
  // new releases (even having the same major version):
123
- $lsp: { parse: parseX, compile: compileX },
150
+ $lsp: { parse: parseX, compile: compileX, getArtifactName: a => a.name },
124
151
  };
package/lib/model/api.js CHANGED
@@ -28,12 +28,14 @@ const defaultFunctions = {
28
28
 
29
29
  /**
30
30
  * Traverse the CSN node `csn`.
31
+ *
31
32
  * If `csn` is an array, call it recursively on each array item.
32
33
  * If `csn` is an(other) object, call a function on each property:
33
34
  * - The property name is a used as key in argument `userFunctions` and the
34
35
  * constant `defaultFunctions` above to get the function which is called on
35
36
  * the property value, see `defaultFunctions` for details.
36
- * - If no function is found with the property name, try to find one with the first char.
37
+ * - If no function is found with the property name, try to find one with the
38
+ * first char, which is useful for annotations.
37
39
  * - If still not found, call `traverseCsn` recursively.
38
40
  *
39
41
  * The functions in `userFunctions` are usually transformer functions, which