@cap-js-community/common
Advanced tools
Comparing version
{ | ||
"name": "@cap-js-community/common", | ||
"version": "0.2.1", | ||
"version": "0.2.2", | ||
"description": "CAP Node.js Community Common", | ||
@@ -5,0 +5,0 @@ "homepage": "https://cap.cloud.sap/", |
@@ -878,18 +878,45 @@ "use strict"; | ||
function selectFromAliases(model, query) { | ||
let aliases = {}; | ||
if (query.SELECT.from.SELECT) { | ||
// Sub-select aliases are not (yet) supported | ||
} else if (query.SELECT.from.ref) { | ||
const ref = resolveRef(model, query.SELECT.from.ref); | ||
if (query.SELECT.from.as) { | ||
aliases[query.SELECT.from.as] = ref; | ||
} else { | ||
const as = ref.split(".").pop(); | ||
aliases[as] = ref; | ||
} | ||
} else if ((query.SELECT.from.join || query.SELECT.from.SET) && query.SELECT.from.args) { | ||
for (const arg of query.SELECT.from.args) { | ||
const ref = resolveRef(model, arg.ref); | ||
if (arg.as) { | ||
aliases[arg.as] = ref; | ||
} else { | ||
const as = ref.split(".").pop(); | ||
aliases[as] = ref; | ||
} | ||
} | ||
} | ||
return aliases; | ||
} | ||
function selectRefs(model, query) { | ||
let refs = selectFromRefs(model, query); | ||
const aliases = selectFromAliases(model, query); | ||
if (query._target) { | ||
const target = model.definitions[query._target.name]; | ||
if (query.SELECT.orderBy) { | ||
refs = refs.concat(expressionRefs(model, target, query.SELECT.orderBy, query.SELECT.mixin)); | ||
refs = refs.concat(expressionRefs(model, target, query.SELECT.orderBy, query.SELECT.mixin, aliases)); | ||
} | ||
if (query.SELECT.columns) { | ||
refs = refs.concat(expressionRefs(model, target, query.SELECT.columns, query.SELECT.mixin)); | ||
refs = refs.concat(expandRefs(model, target, query.SELECT.columns, query.SELECT.mixin)); | ||
refs = refs.concat(expressionRefs(model, target, query.SELECT.columns, query.SELECT.mixin, aliases)); | ||
refs = refs.concat(expandRefs(model, target, query.SELECT.columns, query.SELECT.mixin, aliases)); | ||
} | ||
if (query.SELECT.where) { | ||
refs = refs.concat(expressionRefs(model, target, query.SELECT.where, query.SELECT.mixin)); | ||
refs = refs.concat(expressionRefs(model, target, query.SELECT.where, query.SELECT.mixin, aliases)); | ||
} | ||
if (query.SELECT.having) { | ||
refs = refs.concat(expressionRefs(model, target, query.SELECT.having, query.SELECT.mixin)); | ||
refs = refs.concat(expressionRefs(model, target, query.SELECT.having, query.SELECT.mixin, aliases)); | ||
} | ||
@@ -900,2 +927,16 @@ } | ||
function resolveRef(model, refs) { | ||
let ref = refs[0]; | ||
if (ref.id) { | ||
ref = ref.id; | ||
} | ||
let current = model.definitions[ref]; | ||
for (const ref of refs.slice(1)) { | ||
if (current.elements[ref].type === "cds.Association" || current.elements[ref].type === "cds.Composition") { | ||
current = current.elements[ref]._target; | ||
} | ||
} | ||
return current.name; | ||
} | ||
function resolveRefs(model, refs) { | ||
@@ -922,3 +963,3 @@ let resolvedRefs = []; | ||
function identifierRefs(model, definition, expressions, mixin) { | ||
function identifierRefs(model, definition, expressions, mixins, aliases) { | ||
let refs = []; | ||
@@ -928,8 +969,7 @@ for (const expression of expressions) { | ||
let current = definition; | ||
let currentMixin = mixin; | ||
let currentMixins = mixins; | ||
for (const ref of expression.ref) { | ||
const element = current.elements[ref] || currentMixin?.[ref]; | ||
if (element.type === "cds.Association" || element.type === "cds.Composition") { | ||
current = model.definitions[element.target]; | ||
currentMixin = {}; | ||
current = target(model, current, currentMixins, aliases, ref); | ||
if (current !== null) { | ||
currentMixins = {}; | ||
refs.push(current.name); | ||
@@ -943,9 +983,9 @@ } | ||
function expressionRefs(model, definition, expressions, mixin) { | ||
let refs = identifierRefs(model, definition, expressions, mixin); | ||
function expressionRefs(model, definition, expressions, mixins, aliases) { | ||
let refs = identifierRefs(model, definition, expressions, mixins, aliases); | ||
for (const expression of expressions) { | ||
if (expression.xpr) { | ||
refs = refs.concat(expressionRefs(model, definition, expression.xpr, mixin)); | ||
refs = refs.concat(expressionRefs(model, definition, expression.xpr, mixins, aliases)); | ||
} else if (expression.args) { | ||
refs = refs.concat(expressionRefs(model, definition, expression.args, mixin)); | ||
refs = refs.concat(expressionRefs(model, definition, expression.args, mixins, aliases)); | ||
} else if (expression.SELECT) { | ||
@@ -958,3 +998,3 @@ refs = refs.concat(selectRefs(model, expression)); | ||
function expandRefs(model, definition, columns, mixin) { | ||
function expandRefs(model, definition, columns, mixins, aliases) { | ||
let refs = []; | ||
@@ -964,7 +1004,6 @@ for (const column of columns) { | ||
let current = definition; | ||
let currentMixin = mixin; | ||
let currentMixins = mixins; | ||
for (const ref of column.ref) { | ||
const element = current.elements[ref] || currentMixin?.[ref]; | ||
current = model.definitions[element.target]; | ||
currentMixin = {}; | ||
current = target(model, current, currentMixins, aliases, ref); | ||
currentMixins = {}; | ||
refs.push(current.name); | ||
@@ -978,2 +1017,22 @@ } | ||
function target(model, entity, mixins, aliases, ref) { | ||
if (aliases?.[ref]) { | ||
return typeof aliases[ref] === "string" ? model.definitions[aliases[ref]] : aliases[ref]; | ||
} | ||
if (entity.name.endsWith(`.${ref}`)) { | ||
return entity; | ||
} | ||
const element = entity.elements[ref] || mixins?.[ref]; | ||
if (!element) { | ||
cds.log(Component).warn("Reference not found in entity", { | ||
entity: entity.name, | ||
ref, | ||
}); | ||
} | ||
if (element.type === "cds.Association" || element.type === "cds.Composition") { | ||
return model.definitions[element.target]; | ||
} | ||
return null; | ||
} | ||
function staticRefs(model, refs) { | ||
@@ -980,0 +1039,0 @@ for (const ref of refs) { |
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
101961
1.7%2303
2.49%