- Run 
npm add @cap-js-community/commonin@sap/cdsproject 
This project provides common functionality for CDS services to be consumed with SAP Cloud Application Programming Model (Node.js).
- Replication Cache
 - Migration Check
 - Rate Limiting
 - Redis Client
 - Support, Feedback, Contributing
 - Code of Conduct
 - Licensing
 
The replication cache allows to cache a service (e.g. db service) into a tenant-aware SQLite database. Local replicated SQLite database can be queried with same query as the original service.
Replication cache uses SQLite as local database for productive usage. Ensure
@cap-js/sqliteis installed as dependency (not as dev dependency) in your project.
@cds.replicate
entity Books {
  key ID       : Integer;
      title    : localized String;
      descr    : localized String;
}Annotations can be used to enable replication cache for a service on entity level:
@cds.replicate: Boolean | Object: Enable replication cache for entity@cds.replicate.ttl: Number: Time-To-Live (TTL) of cache entry in milliseconds@cds.replicate.auto: Boolean: Replication is managed automatically@cds.replicate.preload: Boolean: Preload replication for entity@cds.replicate.group: String: Replication group name@cds.replicate.static: Boolean: Statically replicate non-tenant aware
Defaults are taken from CDS environment.
Options can be passed to replication cache via CDS environment via cds.replicationCache section:
plugin: Boolean: Replication cache is activated via CDS plugin fordbservice. Default istruename: String: Service name. Default is"db"group: String: Replication group name. Default is"default"credentials: Object: SQLite credentialsdatabase: String: Database file. Default is":memory:"and in production:"data.sqlite"
ttl: Number: Time-To-Live (TTL) of cache entries in milliseconds. Default is1800000(30 minutes)check: Number: Interval to check size and prune. Default is60000(1 minute)stats: Number: Interval to log statistics. Default is300000(5 minutes)size: Number: Maximal cache size in bytes. Default is10485760(10 MB) and in production:104857600(100 MB)pipe: Boolean: Replication is streamed through pipeline.chunksis not used. Default istruechunks: Number: Replication chunk size. Default is1000retries: Number: Replication retries for failed replications. Default is3auto: Boolean: Replication is managed automatically. Default istrueprune: Boolean: Check and prune directly after replication. Default istruevalidate: Boolean: Validate count of replicated records. Default istruedeploy: Boolean: Deploy whole schema to allow queries on projections. Default istruepreload: Boolean: Preload all replication enables entity. Default isfalsewait: Boolean: Delay read query until replication finished. Default isfalsesearch: Boolean: Search queries are allowed on replication cache. Default istruemeasure: Boolean: Measure and compare replication cache and service query execution. Default isfalsetmpDir: Boolean: Store replication cache file in temporary directory. Default isfalsebaseDir: String: Base directory for replication cache files. Default is"temp"
Replication cache is inactive per default for tests (test profile). It can be enabled via CDS env:
{
  "cds": {
    "replicationCache": {
      "[test]": {
        "plugin": true
      }
    }
  }
}The migration check allows to check for incompatible changes in the CDS model and
to maintain a whitelist for compatible changes via cdsmc command line tool.
Options can be passed to migration check via CDS environment via cds.migrationCheck section:
baseDir: String: Specifies the base directory for migration check. Default is"migration-check"whitelist: Boolean: Requires maintaining a whitelist for compatible changes. Default istruecheckMtx: Boolean: Includes CDS MTXS persistence in check. Default istruekeep: Boolean: Keeps whitelist after update, otherwise whitelist is cleared. Default isfalsefreeze: Boolean: Freeze the persistence. Event compatible changes are not allowed, Default isfalselabel: String: Label to describe the updated hash files in addition to the timestamp. Default is""buildPath: String: Path to the build CSN. If not specified, it is derived from the CAP project type. Default isnulladminHash: String: Specify admin hash to acknowledge incompatible changes. Default isnulladminTracking: Boolean: Track changes acknowledged by admin in an admin changes file. Default istrue
Production CSN is built for first time when not existing (otherwise it is updated):
- Build CSN: 
cds build --production - Update Production CSN: 
cdsmc -u 
Production CSN MUST be added to version control.
Migration check is used to check for incompatible changes in a repetitive way along development:
- Build CSN: 
cds build --production - Check Changes: 
cdsmc 
Incompatible changes are detected and reported as error. Compatible changes need to be whitelisted (can be disabled via options).
Incompatible Changes:
- A released entity cannot be removed (
ReleasedEntityCannotBeRemoved) - The draft enablement state of a released entity cannot be changed (
ReleasedEntityDraftEnablementCannotBeChanged) - A released element cannot be removed (
ReleasedElementCannotBeRemoved) - The key of a released element cannot be changed (
ReleasedElementKeyCannotBeChanged) - The managed/unmanaged state of a released element cannot be changed (
ReleasedElementManagedUnmanagedCannotBeChanged) - The virtual state of a released element cannot be changed (
ReleasedElementVirtualCannotBeChanged) - The localization state of a released element cannot be changed (
ReleasedElementLocalizationCannotBeChanged) - A released element cannot be changed to not-nullable (
ReleasedElementNullableCannotBeChanged) - The data type of a released element cannot be changed (
ReleasedElementTypeCannotBeChanged) - The data type of a released element cannot be shortened (
ReleasedElementTypeCannotBeShortened) - The scale or precision of a released element cannot be reduced (
ReleasedElementScalePrecisionCannotBeLower) - The target of a released element cannot be changed (
ReleasedElementTargetCannotBeChanged) - The cardinality of a released element cannot be changed (
ReleasedElementCardinalityCannotBeChanged) - The ON condition of a released element cannot be changed (
ReleasedElementOnConditionCannotBeChanged) - The keys condition of a released element cannot be changed (
ReleasedElementKeysConditionCannotBeChanged) - Enabling journal mode and changing entity in same cycle is not allowed (
ReleasedEntityJournalModeAndEntityChangeIsNotAllowed) - Changes to the index of a released entity are not allowed (
ReleasedEntityIndexChangeIsNotAllowed) 
Compatible Changes:
- Changes to the index of a released entity must be whitelisted (
ReleasedEntityIndexChangeIsNotWhitelisted) - Extending the type of a released element requires whitelisting (
ReleasedElementTypeExtensionIsNotWhitelisted) - Extending the scale or precision of a released element requires whitelisting (
ReleasedElementScalePrecisionExtensionIsNotWhitelisted) - Changing the type of a released element to a compatible type requires whitelisting (
ReleasedElementTypeChangeIsNotWhitelisted) - The new entity is not whitelisted (
NewEntityIsNotWhitelisted) - The new entity element is not whitelisted (
NewEntityElementIsNotWhitelisted) - A new entity element must have a default value if it is not nullable (
NewEntityElementNotNullableDefault) - The new entity index is not whitelisted (
NewEntityIndexIsNotWhitelisted) 
The Production CSN can be updated when no migration check errors occur:
- Build CSN: 
cds build --production - Update Production CSN: 
cdsmc -u 
Production CSN MUST be added to version control.
Maintain the whitelist extension file migration-extension-whitelist.json for compatible changes:
- 
Whitelist Entity:
{ "definitions": { "test.Test": {} } } - 
Whitelist Entity Element:
{ "definitions": { "test.Test": { "elements": { "value": {} } } } } 
Accepted incompatible changes can be acknowledged and will not be reported as error anymore:
- Get current admin hash for incompatible changes: 
cdsmc -a - Set admin hash in env: 
cds.migrationCheck.adminHash 
CDS persistence can be (temporarily) frozen to prevent any changes (also compatible) to the persistence model:
- Activate/Deactivate persistence freeze in env 
cds.migrationCheck.freeze - Freeze/Unfreeze Persistence: 
cdsmc -u -a- File 
./csn-prod.freezeis created to indicate that persistence is frozen 
 - File 
 
Migration check can be used in a pipeline (e.g. part of Pull Request voter) to ensure that incompatible changes are not introduced:
- Build & Check: 
cds build --production && cdsmc - Update Production CSN: 
cds build --production && cdsmc -u 
Production CSN MUST be added to version control.
The rate limiting allows to limit the number of requests per service and tenant.
@cds.rateLimiting
service BookshopService {
  entity Books @readonly   as projection on test.Books;
}@cds.rateLimiting: Boolean: Activate rate limit for service@cds.rateLimiting.maxConcurrent: Number: Maximum number of concurrent requests per service and tenant@cds.rateLimiting.maxInWindow: Number: Maximum number of requests in defined window per service and tenant@cds.rateLimiting.window: Number: Window length in milliseconds
Options can be passed to migration check via CDS environment via cds.rateLimiting section:
plugin: Boolean: Rate limiting is activated via CDS plugin for annotated services. Default istruemaxConcurrent: Boolean: Maximum number of concurrent requests per service and tenant. Default is3maxWindow: Boolean: Maximum number of requests in defined window per service and tenant. Default is10000(10 seconds)window: Boolean: Window length in milliseconds. Default is3600000(1 hour)retry: Boolean: Default is5
Redis options can be provided in CDS env as follows:
{
  "cds": {
    "requires": {
      "redis-rateLimiting": {
        "vcap": {
          "tag": "my-redis"
        },
        "options": {}
      }
    }
  }
}For shared redis configuration Redis service name can be provided in CDS env as follows:
{
  "cds": {
    "requires": {
      "redis-rateLimiting": false,
      "redis": {
        "vcap": {
          "tag": "my-redis"
        },
        "options": {}
      }
    }
  }
}Rate limiting is inactive per default for tests (test profile). It can be enabled via CDS env:
{
  "cds": {
    "rateLimiting": {
      "[test]": {
        "plugin": true
      }
    }
  }
}A Redis Client broker is provided to connect to Redis service.
const { RedisClient } = require("@cap-js-community/common");
const mainClient = await RedisClient.default().createMainClientAndConnect(options);const { RedisClient } = require("@cap-js-community/common");
const mainClient = await RedisClient.default("name").createMainClientAndConnect(options);const { RedisClient } = require("@cap-js-community/common");
const client = await new RedisClient("name").createClientAndConnect(options);Options can be passed to Redis client via CDS environment via cds.redis section:
Redis options can be provided in CDS env as follows:
{
  "cds": {
    "requires": {
      "redis": {
        "vcap": {
          "tag": "redis-cache"
        },
        "options": {}
      }
    }
  }
}Specific Redis options for a custom name can be established as follows:
{
  "cds": {
    "requires": {
      "redis-customName": {
        "vcap": {
          "tag": "redis-cache"
        },
        "options": {}
      }
    }
  }
}const { RedisClient } = require("@cap-js-community/common");
const mainClient = await RedisClient.default("customName").createMainClientAndConnect(options);In addition, options can be passed to Redis client during creation via options parameter:
const { RedisClient } = require("@cap-js-community/common");
const mainClient = await RedisClient.default().createMainClientAndConnect(options);For details on Redis createClient configuration options see Redis Client Configuration.
This project is open to feature requests/suggestions, bug reports etc. via GitHub issues. Contribution and feedback are encouraged and always welcome. For more information about how to contribute, the project structure, as well as additional contribution information, see our Contribution Guidelines.
We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone. By participating in this project, you agree to abide by its Code of Conduct at all times.
Copyright 2025 SAP SE or an SAP affiliate company and common contributors. Please see our LICENSE for copyright and license information. Detailed information including third-party components and their licensing/copyright information is available via the REUSE tool.