UNPKG

@sap/cds-compiler

Version:

CDS (Core Data Services) compiler and backends

70 lines (63 loc) 2.22 kB
'use strict'; 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, };