@sap/cds-compiler 2.15.8 → 3.1.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/CHANGELOG.md +102 -1590
- package/bin/.eslintrc.json +2 -1
- package/bin/cdsc.js +61 -46
- package/doc/API.md +11 -0
- package/doc/CHANGELOG_ARCHIVE.md +1592 -0
- package/doc/CHANGELOG_BETA.md +26 -5
- package/doc/CHANGELOG_DEPRECATED.md +55 -1
- package/doc/{DeprecatedOptions.md → DeprecatedOptions_v2.md} +3 -1
- package/doc/Versioning.md +20 -1
- package/lib/api/.eslintrc.json +2 -2
- package/lib/api/main.js +282 -156
- package/lib/api/options.js +17 -88
- package/lib/api/validate.js +6 -10
- package/lib/base/keywords.js +280 -110
- package/lib/base/message-registry.js +85 -25
- package/lib/base/messages.js +119 -89
- package/lib/base/model.js +46 -2
- package/lib/base/optionProcessorHelper.js +53 -21
- package/lib/checks/actionsFunctions.js +15 -12
- package/lib/checks/annotationsOData.js +1 -1
- package/lib/checks/cdsPersistence.js +1 -0
- package/lib/checks/elements.js +6 -6
- package/lib/checks/invalidTarget.js +1 -1
- package/lib/checks/nonexpandableStructured.js +1 -1
- package/lib/checks/queryNoDbArtifacts.js +2 -1
- package/lib/checks/selectItems.js +101 -15
- package/lib/checks/types.js +7 -8
- package/lib/checks/utils.js +2 -2
- package/lib/checks/validator.js +3 -3
- package/lib/compiler/assert-consistency.js +78 -21
- package/lib/compiler/base.js +6 -4
- package/lib/compiler/builtins.js +177 -10
- package/lib/compiler/checks.js +1 -1
- package/lib/compiler/define.js +28 -23
- package/lib/compiler/extend.js +75 -18
- package/lib/compiler/finalize-parse-cdl.js +25 -18
- package/lib/compiler/index.js +27 -11
- package/lib/compiler/moduleLayers.js +7 -0
- package/lib/compiler/populate.js +26 -39
- package/lib/compiler/propagator.js +12 -7
- package/lib/compiler/resolve.js +207 -236
- package/lib/compiler/shared.js +100 -93
- package/lib/compiler/tweak-assocs.js +13 -20
- package/lib/compiler/utils.js +20 -6
- package/lib/edm/annotations/preprocessAnnotations.js +12 -13
- package/lib/edm/csn2edm.js +35 -37
- package/lib/edm/edm.js +22 -13
- package/lib/edm/edmAnnoPreprocessor.js +349 -0
- package/lib/edm/edmInboundChecks.js +85 -0
- package/lib/edm/edmPreprocessor.js +338 -689
- package/lib/edm/edmUtils.js +97 -67
- package/lib/gen/Dictionary.json +29 -9
- package/lib/gen/language.checksum +1 -1
- package/lib/gen/language.interp +8 -31
- package/lib/gen/language.tokens +105 -114
- package/lib/gen/languageLexer.interp +1 -34
- package/lib/gen/languageLexer.js +892 -1007
- package/lib/gen/languageLexer.tokens +95 -106
- package/lib/gen/languageParser.js +20629 -22474
- package/lib/inspect/.eslintrc.json +4 -0
- package/lib/inspect/index.js +14 -0
- package/lib/inspect/inspectModelStatistics.js +81 -0
- package/lib/inspect/inspectPropagation.js +189 -0
- package/lib/inspect/inspectUtils.js +44 -0
- package/lib/json/from-csn.js +74 -69
- package/lib/json/to-csn.js +17 -14
- package/lib/language/antlrParser.js +2 -2
- package/lib/language/docCommentParser.js +61 -38
- package/lib/language/errorStrategy.js +52 -40
- package/lib/language/genericAntlrParser.js +424 -292
- package/lib/language/language.g4 +604 -687
- package/lib/language/multiLineStringParser.js +14 -42
- package/lib/language/textUtils.js +44 -0
- package/lib/main.d.ts +28 -42
- package/lib/main.js +104 -81
- package/lib/model/api.js +1 -1
- package/lib/model/csnRefs.js +57 -30
- package/lib/model/csnUtils.js +189 -287
- package/lib/model/revealInternalProperties.js +32 -10
- package/lib/model/sortViews.js +32 -31
- package/lib/modelCompare/compare.js +3 -0
- package/lib/optionProcessor.js +91 -57
- package/lib/render/.eslintrc.json +1 -1
- package/lib/render/DuplicateChecker.js +4 -7
- package/lib/render/manageConstraints.js +70 -2
- package/lib/render/toCdl.js +387 -367
- package/lib/render/toHdbcds.js +20 -16
- package/lib/render/toRename.js +44 -22
- package/lib/render/toSql.js +81 -59
- package/lib/render/utils/common.js +16 -3
- package/lib/render/utils/sql.js +20 -19
- package/lib/sql-identifier.js +6 -0
- package/lib/transform/db/.eslintrc.json +3 -2
- package/lib/transform/db/associations.js +43 -35
- package/lib/transform/db/cdsPersistence.js +5 -16
- package/lib/transform/db/constraints.js +1 -1
- package/lib/transform/db/expansion.js +7 -6
- package/lib/transform/db/flattening.js +16 -18
- package/lib/transform/db/transformExists.js +7 -5
- package/lib/transform/db/views.js +3 -3
- package/lib/transform/draft/.eslintrc.json +2 -2
- package/lib/transform/draft/db.js +6 -6
- package/lib/transform/draft/odata.js +6 -7
- package/lib/transform/forHanaNew.js +30 -24
- package/lib/transform/forOdataNew.js +14 -16
- package/lib/transform/localized.js +35 -25
- package/lib/transform/odata/toFinalBaseType.js +10 -10
- package/lib/transform/odata/typesExposure.js +17 -8
- package/lib/transform/odata/utils.js +1 -38
- package/lib/transform/transformUtilsNew.js +63 -77
- package/lib/transform/translateAssocsToJoins.js +2 -2
- package/lib/transform/universalCsn/.eslintrc.json +2 -2
- package/lib/transform/universalCsn/coreComputed.js +11 -6
- package/lib/transform/universalCsn/universalCsnEnricher.js +33 -5
- package/lib/utils/file.js +31 -21
- package/lib/utils/moduleResolve.js +0 -1
- package/lib/utils/timetrace.js +20 -21
- package/package.json +34 -4
- package/share/messages/syntax-expected-integer.md +9 -8
- package/doc/ApiMigration.md +0 -237
- package/doc/CommandLineMigration.md +0 -58
- package/doc/ErrorMessages.md +0 -175
- package/doc/FioriAnnotations.md +0 -94
- package/doc/ODataTransformation.md +0 -273
- package/lib/backends.js +0 -529
- package/lib/checks/unknownMagic.js +0 -41
- package/lib/fix_antlr4-8_warning.js +0 -56
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { setProp, isBetaEnabled } = require('../base/model');
|
|
4
|
+
const {
|
|
5
|
+
forEachDefinition, forEachMemberRecursively, getUtils,
|
|
6
|
+
} = require('../model/csnUtils');
|
|
7
|
+
|
|
8
|
+
// eslint-disable-next-line no-unused-vars
|
|
9
|
+
function resolveForeignKeyRefs(csn) {
|
|
10
|
+
const csnUtils = getUtils(csn);
|
|
11
|
+
forEachDefinition(csn, (def, defName) => {
|
|
12
|
+
let currPath = ['definitions', defName ];
|
|
13
|
+
forEachMemberRecursively(def, (construct, _constructName, _prop, path) => {
|
|
14
|
+
if(construct.target && construct.keys) {
|
|
15
|
+
construct.keys.forEach((fk, i) => {
|
|
16
|
+
setProp(fk, '_artifact', csnUtils.inspectRef([...path, 'keys', i]).art);
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
}, currPath, true, { elementsOnly: true });
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
function inboundQualificationChecks(csn, options, messageFunctions,
|
|
25
|
+
serviceRootNames, requestedServiceNames, isMyServiceRequested, whatsMyServiceRootName) {
|
|
26
|
+
const csnUtils = getUtils(csn);
|
|
27
|
+
const { message, throwWithAnyError } = messageFunctions;
|
|
28
|
+
|
|
29
|
+
forEachDefinition(csn, [ attach$path, checkChainedArray ]);
|
|
30
|
+
checkNestedContextsAndServices();
|
|
31
|
+
throwWithAnyError();
|
|
32
|
+
|
|
33
|
+
// attach $path to all
|
|
34
|
+
function attach$path(def, defName) {
|
|
35
|
+
setProp(def, '$path', [ 'definitions', defName ]);
|
|
36
|
+
forEachMemberRecursively(def,
|
|
37
|
+
(member, _memberName, _prop, path) => {
|
|
38
|
+
setProp(member, '$path', path);
|
|
39
|
+
}, [ 'definitions', defName ]);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function checkChainedArray(def, defName) {
|
|
43
|
+
if (!isMyServiceRequested(defName))
|
|
44
|
+
return;
|
|
45
|
+
let currPath = ['definitions', defName];
|
|
46
|
+
checkIfItemsOfItems(def, undefined, undefined, currPath);
|
|
47
|
+
forEachMemberRecursively(def, checkIfItemsOfItems, currPath);
|
|
48
|
+
|
|
49
|
+
function checkIfItemsOfItems(construct, _constructName, _prop, path) {
|
|
50
|
+
const constructType = csnUtils.effectiveType(construct);
|
|
51
|
+
if (constructType.items) {
|
|
52
|
+
if (constructType.items.items) {
|
|
53
|
+
message('chained-array-of', path);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const itemsType = csnUtils.effectiveType(constructType.items);
|
|
58
|
+
if (itemsType.items)
|
|
59
|
+
message('chained-array-of', path);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function checkNestedContextsAndServices() {
|
|
65
|
+
!isBetaEnabled(options, 'nestedServices') && serviceRootNames.forEach(sn => {
|
|
66
|
+
const parent = whatsMyServiceRootName(sn, false);
|
|
67
|
+
if(parent && requestedServiceNames.includes(parent) && parent !== sn) {
|
|
68
|
+
message( 'service-nested-service', [ 'definitions', sn ], { art: parent },
|
|
69
|
+
'A service can\'t be nested within a service $(ART)' );
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
Object.entries(csn.definitions).forEach(([fqName, art]) => {
|
|
74
|
+
if(art.kind === 'context') {
|
|
75
|
+
const parent = whatsMyServiceRootName(fqName);
|
|
76
|
+
if(requestedServiceNames.includes(parent)) {
|
|
77
|
+
message( 'service-nested-context', [ 'definitions', fqName ], { art: parent },
|
|
78
|
+
'A context can\'t be nested within a service $(ART)' );
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
module.exports = { inboundQualificationChecks }
|