🚀 Big News: Socket Acquires Coana to Bring Reachability Analysis to Every Appsec Team.Learn more
Socket
Book a DemoInstallSign in
Socket

@cap-js-community/common

Package Overview
Dependencies
Maintainers
3
Versions
11
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@cap-js-community/common - npm Package Compare versions

Comparing version

to
0.2.2

2

package.json
{
"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) {