@sap/cds-compiler
Version:
CDS (Core Data Services) compiler and backends
70 lines (63 loc) • 2.22 kB
JavaScript
;
const { setProp, forEachValue } = require('../utils/objectUtils');
const { featureFlags } = require('../transform/featureFlags');
const { isSqlService, isDummyService, isDataProductProductionService } = require('../transform/db/processSqlServices');
/**
* Set a feature flag on the CSN model.
*
* @param {CSN.Model} csn CSN model to set flag on
* @param {string} flag Flag name to set
*/
function setFeatureFlag( csn, flag ) {
if (!csn.meta)
setProp(csn, 'meta', {});
if (!csn.meta[featureFlags])
csn.meta[featureFlags] = {};
csn.meta[featureFlags][flag] = true;
}
/**
* Get a function that detects and sets feature flags for expand/inline columns in a query.
*
* @param {CSN.Model} csn CSN model to set flags on
* @returns {Function} Function to call per query
*/
function getQueryFeatureFlagSetter( csn ) {
return function setQueryFeatureFlags(query) {
const queryProp = query.SELECT ? 'SELECT' : 'projection';
query[queryProp]?.columns?.forEach((column) => {
if (column.expand || column.inline)
setFeatureFlag(csn, '$expandInline');
});
};
}
/**
* Get a function that detects and sets feature flags for entity/service definitions.
* That are calculated elements and SQL services.
*
* @param {CSN.Model} csn CSN model to set flags on
* @param {CSN.Options} options Compiler options
* @returns {Function} Function to call per definition
*/
function getDefinitionFeatureFlagSetter( csn, options ) {
return function setDefinitionFeatureFlags(def) {
if (def.kind === 'entity' && def.elements) {
forEachValue(def.elements, (element) => {
if (element.value)
setFeatureFlag(csn, '$calculatedElements');
});
}
else if (def.kind === 'service') {
if (isSqlService(def))
setFeatureFlag(csn, '$sqlService');
if (isDummyService(def, options))
setFeatureFlag(csn, '$dummyService');
if (isDataProductProductionService(def))
setFeatureFlag(csn, '$dataProductService');
}
};
}
// Export factory functions that create bound feature flag setters for use in transformation loops
module.exports = {
getQueryFeatureFlagSetter,
getDefinitionFeatureFlagSetter,
};