{"ref":"artifact:cap-js-community-common","page":"/artifacts/cap-js-community-common","json":"/artifacts/cap-js-community-common.json","generated":"2026-10-26","drafted_with_ai":true,"entity":{"id":"cap-js-community-common","name":"@cap-js-community/common","artifact_type":"package","ecosystem":"cap","domain":"operations-and-runtime","origin_ring":"community-org","description":{"one_line":"Six independent features for CAP services in one package: replication cache, migration check, rate limiting, a [Redis](external:redis) client broker, a local HTML5 repository and a CDM builder.","short":"Six CAP features in one package, from replication cache to rate limits","what_it_solves":"Each feature fills a different hole. Replication cache mirrors a service into tenant-aware SQLite; migration check catches incompatible CDS model changes against a whitelist; rate limiting caps requests per service and tenant; the local HTML5 repository lets UI5 apps be tested behind an approuter without deploying.","when_not_to_use":"It is a bundle, not a plugin with one job. Depending on it for one feature brings the rest."},"links":{"npm":"https://www.npmjs.com/package/@cap-js-community/common","repo":"https://github.com/cap-js-community/common"},"identity":{"author":"cap-js-community","license":"Apache-2.0"},"compat":{"runtimes":["node"]},"provides":[{"capability":"capability:caching","what_it_does":"Replicates a service into tenant-aware SQLite for querying with the original service’s queries; @cds.replicate selects entities and exposes TTL, preload and static replication options.","sources":[{"url":"https://github.com/cap-js-community/common/blob/main/README.md","title":"CAP Node.js Community Common — Replication Cache","checked":"2026-09-17","quote":"The replication cache allows to cache a service (e.g. db service) into a tenant-aware SQLite database."}],"facets":[{"key":"cache_layer","value":"Service data replicated into local SQLite","source":{"url":"https://github.com/cap-js-community/common/blob/main/README.md","title":"CAP Node.js Community Common — Replication Cache","checked":"2026-09-17","quote":"Local replicated SQLite database can be queried with same query as the original service."},"applies_to":{"ecosystems":["cap"]}},{"key":"freshness_control","value":"TTL, tags and optional invalidateOnWrite","source":{"url":"https://github.com/cap-js-community/common/blob/main/README.md","title":"CAP Node.js Community Common — Replication Cache","checked":"2026-09-17","quote":"`@cds.replicate.ttl: Number`: Time-To-Live (TTL) of cache entry in milliseconds\n  - `@cds.replicate.auto: Boolean`: Replication is managed automatically\n  - `@cds.replicate.preload: Boolean`: Preload replication for entity"},"applies_to":{"ecosystems":["cap"]}},{"key":"tenant_partitioning","value":"Tenant-aware replication; static option is non-tenant-aware","source":{"url":"https://github.com/cap-js-community/common/blob/main/README.md","title":"CAP Node.js Community Common — Replication Cache","checked":"2026-09-17","quote":"The replication cache allows to cache a service (e.g. db service) into a tenant-aware SQLite database. […] `@cds.replicate.static: Boolean`: Statically replicate non-tenant aware"},"applies_to":{"ecosystems":["cap"]}}]},{"capability":"capability:replication","what_it_does":"Replicates a service into a tenant-aware SQLite database, kept per tenant.","sources":[{"url":"https://github.com/cap-js-community/common#replication-cache","title":"cap-js-community/common — Replication Cache","checked":"2026-08-31","quote":"The replication cache allows to cache a service (e.g. db service) into a tenant-aware SQLite database."}],"facets":[{"key":"strategy","value":["copy"],"source":{"url":"https://github.com/cap-js-community/common#replication-cache","title":"cap-js-community/common — Replication Cache","checked":"2026-09-27","quote":"The replication cache allows to cache a service (e.g. db service) into a tenant-aware SQLite database."}},{"key":"refresh","value":["on expiry"],"source":{"url":"https://github.com/cap-js-community/common#replication-cache","title":"cap-js-community/common — Replication Cache","checked":"2026-09-27","quote":"`@cds.replicate.ttl: Number`: Time-To-Live (TTL) of cache entry in milliseconds"}},{"key":"source_kind","value":["CAP service"],"source":{"url":"https://github.com/cap-js-community/common#replication-cache","title":"cap-js-community/common — Replication Cache","checked":"2026-09-27","quote":"The replication cache allows to cache a service (e.g. db service) into a tenant-aware SQLite database."}},{"key":"target_kind","value":["SQLite"],"source":{"url":"https://github.com/cap-js-community/common#replication-cache","title":"cap-js-community/common — Replication Cache","checked":"2026-09-27","quote":"Local replicated SQLite database can be queried with same query as the original service."}}]},{"capability":"capability:schema-evolution","what_it_does":"Migration Check: flags incompatible CDS model changes and maintains a whitelist of compatible ones via the cdsmc CLI.","sources":[{"url":"https://github.com/cap-js-community/common#migration-check","title":"cap-js-community/common — Migration Check","checked":"2026-08-31","quote":"check for incompatible changes in the CDS model and to maintain a whitelist for compatible changes"}]},{"capability":"capability:rate-limiting","what_it_does":"Limits the number of requests per service and per tenant, backed by [Redis](external:redis) where configured.","sources":[{"url":"https://github.com/cap-js-community/common#rate-limiting","title":"cap-js-community/common — Rate Limiting","checked":"2026-08-31","quote":"The rate limiting allows to limit the number of requests per service and tenant."}]},{"capability":"capability:local-development","what_it_does":"Serves the apps and libraries of the project's app folder from the local file system as the HTML5 repository an approuter asks, and proxies every other request to the remote HTML5 repository, so a change to a UI5 application is tested behind the router without being deployed first. An app is picked up when it sits in the app folder and contains a ui5.yaml, and the approuter folder needs a default-env.json holding an HTML5 repository configuration from the deployment environment.","sources":[{"url":"https://github.com/cap-js-community/common/blob/main/README.md","title":"CAP Node.js Community Common — Local HTML5 Repository","checked":"2026-10-15","quote":"Developing HTML5 apps against hybrid environments including Approuter component requires a local HTML5 repository to directly test the changes to UI5 applications without deployment to a remote HTML5 repository."},{"url":"https://github.com/cap-js-community/common/blob/main/README.md","title":"CAP Node.js Community Common — Local HTML5 Repository, what it serves","checked":"2026-10-15","quote":"All apps and libraries located in `app` folder and containing an `ui5.yaml` are redirected to local HTML5 repository served from local file system. All other requests are proxied to the remote HTML5 repository."},{"url":"https://github.com/cap-js-community/common/blob/main/README.md","title":"CAP Node.js Community Common — Local HTML5 Repository, configuration","checked":"2026-10-15","quote":"Create a `default-env.json` in `approuter` folder, including a valid HTML5 repository configuration from deployment environment"}],"facets":[{"key":"local_stack_part","value":["HTML5 application repository"],"source":{"url":"https://github.com/cap-js-community/common/blob/main/README.md","title":"CAP Node.js Community Common — Local HTML5 Repository, what it serves","checked":"2026-10-15","quote":"All apps and libraries located in `app` folder and containing an `ui5.yaml` are redirected to local HTML5 repository served from local file system. All other requests are proxied to the remote HTML5 repository."},"applies_to":{"ecosystems":["cap"]}}]},{"capability":"capability:metadata-publishing","what_it_does":"CDM Builder: emits a Common Data Model descriptor from the CDS model.","sources":[{"url":"https://github.com/cap-js-community/common#cdm-builder","title":"cap-js-community/common — CDM Builder","checked":"2026-08-31"}]}],"provenance":{"discovered_via":[{"source":"source:npm"},{"source":"source:github","channel":"cap-js-community"}],"first_seen":"2026-08-31"},"maintainers":["actor:cap-js-community","actor:oklemenz2"],"contributors":["actor:drktfl","actor:oklemenz2","actor:soccermax"],"drafted_with_ai":true,"requires":[{"ref":"artifact:cap-js-sqlite","for":"Replication cache requires [@cap-js/sqlite](artifact:cap-js-sqlite) as a production dependency, not only a development dependency.","sources":[{"url":"https://github.com/cap-js-community/common/blob/main/README.md","title":"CAP Node.js Community Common — Replication Cache","checked":"2026-09-17","quote":"Ensure `@cap-js/sqlite` is installed as dependency (not as dev dependency) in your project."}]}],"history":[{"date":"2026-09-17","field":"provides, requires","from":"Replication cache description without comparison facets or SQLite prerequisite","to":"Sourced cache layer, freshness and tenant configuration facets; explicit SQLite production dependency","reason":"Maintainer README documents replication configuration and the required production dependency."},{"date":"2026-10-15","field":"provides[capability:local-development].what_it_does, sources, facets","from":"Serves an HTML5 application repository locally so UI modules resolve without deploying. One source, carrying no quote.","to":"What the local repository serves and what it proxies, the two conditions the README states, three quoted sources and the comparison value for the part of the local stack it starts.","reason":"capability:local-development curation on 2026-10-15. The edge rested on a link with no quoted sentence, and the README states both halves a reader needs: the apps in the app folder with a ui5.yaml come from the file system and everything else is proxied to the remote repository, with the configuration file in the approuter folder as the prerequisite."}]},"effective_normative_relations":[],"readings":{"liveness":[{"label":"Maintenance","tier":"good","evidence":"released this month"},{"label":"Continuity","tier":"good","evidence":"7 contributors, 6 publishers, org-owned"},{"label":"Repository","tier":"good","evidence":"pushed 2026-10, not archived"}],"compatibility":[{"label":"Declared for","tier":"fair","evidence":"nothing declared"},{"label":"Survived majors","tier":"good","evidence":"released before and after @sap/cds 10"},{"label":"Maintainer's CI","tier":"good","evidence":"Main CI green, 2026-10-22"}],"practice":[{"label":"Tests","tier":"good","evidence":"31 test files, npm test"},{"label":"Docs","tier":"good","evidence":"README 17 KB"},{"label":"Changelog","tier":"good","evidence":"CHANGELOG in the repo"}],"reach":[{"value":2559,"unit":"installs/week"},{"value":2,"unit":"watching"}]},"signals":{"crawled_at":"2026-10-24","latest_version":"0.5.5","majors":{"0.1":{"version":"0.1.0","date":"2025-04-09"},"0.2":{"version":"0.2.0","date":"2025-06-03"},"0.3":{"version":"0.3.0","date":"2025-11-03"},"0.4":{"version":"0.4.0","date":"2026-03-10"},"0.5":{"version":"0.5.0","date":"2026-07-03"}},"license":"Apache-2.0","first_release":"2025-04-09","last_release":"2026-10-22","releases":30,"cadence_days":27,"maintainers":6,"repository":"git+https://github.com/cap-js-community/common.git","peer_cds":null,"test_script":true,"types":true,"downloads_weekly":2559,"stars":2,"forks":2,"open_issues":1,"archived":false,"pushed_at":"2026-10-22","license_spdx":"Apache-2.0","org_owned":true,"default_branch":"main","contributors":7,"tree_truncated":false,"test_files":31,"workflows":4,"other_ci":false,"readme_bytes":17234,"docs_files":0,"changelog":true,"license_file":true,"dts_files":1,"ci_status":"success","ci_run_at":"2026-10-22","ci_workflow":"Main CI","ci_event":"push","readme_path":"README.md","readme_sha":"a6e8214a13855b375281d7fcd6d37c6909fba5ef","months_since_release":0,"dormant":false,"repository_directory":null,"dependencies":4,"node_engine":">=22","downloads_monthly":15541,"created_at":"2025-04-08T08:50:55Z","open_prs":1,"first_commit":"2025-04-08","last_commit":"2026-10-22","commits":367,"repo_read":"2026-10-24"},"release_notes":{"license":"Apache-2.0","quotable":true,"source":{"kind":"npm","path":"CHANGELOG.md","version":"0.5.5","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md"},"format":"keep-a-changelog","releases":[{"version":"0.5.5","date":"2026-10-22","date_source":"heading","heading":"Version 0.5.5 - 2026-10-22","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-055---2026-10-22","sections":[{"kind":"fix","heading":"Fixed","items":1}],"hash":"98de693f24b0e627"},{"version":"0.5.4","date":"2026-09-25","date_source":"heading","heading":"Version 0.5.4 - 2026-09-25","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-054---2026-09-25","sections":[{"kind":"fix","heading":"Fixed","items":1}],"hash":"6547d5f6bff20a9b"},{"version":"0.5.3","date":"2026-09-22","date_source":"heading","heading":"Version 0.5.3 - 2026-09-22","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-053---2026-09-22","sections":[{"kind":"fix","heading":"Fixed","items":1}],"hash":"00d6a52325632ee5"},{"version":"0.5.2","date":"2026-09-21","date_source":"heading","heading":"Version 0.5.2 - 2026-09-21","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-052---2026-09-21","sections":[{"kind":"fix","heading":"Fixed","items":2}],"hash":"380251fa2e30398c"},{"version":"0.5.1","date":"2026-08-04","date_source":"heading","heading":"Version 0.5.1 - 2026-08-04","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-051---2026-08-04","sections":[{"kind":"fix","heading":"Fixed","items":2}],"hash":"b50d51e166b853c4"},{"version":"0.5.0","date":"2026-07-03","date_source":"heading","heading":"Version 0.5.0 - 2026-07-03","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-050---2026-07-03","sections":[{"kind":"feature","heading":"Added","items":1},{"kind":"fix","heading":"Fixed","items":1}],"hash":"609999b7b72cda6a"},{"version":"0.4.0","date":"2026-03-10","date_source":"heading","heading":"Version 0.4.0 - 2026-03-10","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-040---2026-03-10","sections":[{"kind":"feature","heading":"Added","items":2}],"hash":"b42edf206cc53029"},{"version":"0.3.5","date":"2026-02-03","date_source":"heading","heading":"Version 0.3.5 - 2026-02-03","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-035---2026-02-03","sections":[{"kind":"fix","heading":"Fixed","items":1},{"kind":"feature","heading":"Added","items":1}],"hash":"4acbd61c885f6c0c"},{"version":"0.3.4","date":"2026-01-20","date_source":"heading","heading":"Version 0.3.4 - 2026-01-20","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-034---2026-01-20","sections":[{"kind":"fix","heading":"Fixed","items":1}],"hash":"7fcadcab3bf722ed"},{"version":"0.3.3","date":"2026-01-07","date_source":"heading","heading":"Version 0.3.3 - 2026-01-07","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-033---2026-01-07","sections":[{"kind":"feature","heading":"Added","items":1},{"kind":"fix","heading":"Fixed","items":1}],"hash":"a99de9c2fd22fccd"},{"version":"0.3.2","date":"2025-11-05","date_source":"heading","heading":"Version 0.3.2 - 2025-11-05","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-032---2025-11-05","sections":[{"kind":"fix","heading":"Fixed","items":1}],"hash":"8ce8899f72e39c7f"},{"version":"0.3.1","date":"2025-11-05","date_source":"heading","heading":"Version 0.3.1 - 2025-11-05","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-031---2025-11-05","sections":[{"kind":"fix","heading":"Fixed","items":1}],"hash":"8ce8899f72e39c7f"},{"version":"0.3.0","date":"2025-11-03","date_source":"heading","heading":"Version 0.3.0 - 2025-11-03","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-030---2025-11-03","sections":[{"kind":"fix","heading":"Fixed","items":3}],"hash":"6c751de8709f593f"},{"version":"0.2.8","date":"2025-10-13","date_source":"heading","heading":"Version 0.2.8 - 2025-10-13","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-028---2025-10-13","sections":[{"kind":"fix","heading":"Fixed","items":1}],"hash":"ba2c1f302f2c676d"},{"version":"0.2.7","date":"2025-10-13","date_source":"heading","heading":"Version 0.2.7 - 2025-10-13","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-027---2025-10-13","sections":[{"kind":"fix","heading":"Fixed","items":1}],"hash":"ba2c1f302f2c676d"},{"version":"0.2.6","date":"2025-08-04","date_source":"heading","heading":"Version 0.2.6 - 2025-08-04","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-026---2025-08-04","sections":[{"kind":"fix","heading":"Fixed","items":2}],"hash":"ccafe991f84657b5"},{"version":"0.2.5","date":"2025-07-07","date_source":"heading","heading":"Version 0.2.5 - 2025-07-07","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-025---2025-07-07","sections":[{"kind":"fix","heading":"Fixed","items":1}],"hash":"fb01d47a11aed065"},{"version":"0.2.4","date":"2025-07-03","date_source":"heading","heading":"Version 0.2.4 - 2025-07-03","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-024---2025-07-03","sections":[{"kind":"fix","heading":"Fixed","items":3}],"hash":"c5ae819595a3427b"},{"version":"0.2.3","date":"2025-07-01","date_source":"heading","heading":"Version 0.2.3 - 2025-07-01","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-023---2025-07-01","sections":[{"kind":"fix","heading":"Fixed","items":1}],"hash":"6d75433716daa018"},{"version":"0.2.2","date":"2025-06-26","date_source":"heading","heading":"Version 0.2.2 - 2025-06-26","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-022---2025-06-26","sections":[{"kind":"fix","heading":"Fixed","items":1}],"hash":"a86c78a1e698cf83"},{"version":"0.2.1","date":"2025-06-26","date_source":"heading","heading":"Version 0.2.1 - 2025-06-26","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-021---2025-06-26","sections":[{"kind":"fix","heading":"Fixed","items":2}],"hash":"6a86452c9c57390f"},{"version":"0.2.0","date":"2025-06-03","date_source":"heading","heading":"Version 0.2.0 - 2025-06-03","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-020---2025-06-03","sections":[{"kind":"fix","heading":"Fixed","items":1}],"hash":"7c19dde5a8f6fcb9"},{"version":"0.1.7","date":"2025-05-08","date_source":"heading","heading":"Version 0.1.7 - 2025-05-08","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-017---2025-05-08","sections":[{"kind":"fix","heading":"Fixed","items":1}],"hash":"93c06b7aacd31dfb"},{"version":"0.1.6","date":"2025-05-07","date_source":"heading","heading":"Version 0.1.6 - 2025-05-07","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-016---2025-05-07","sections":[{"kind":"fix","heading":"Fixed","items":1}],"hash":"fa5b787ab5b12dfe"},{"version":"0.1.5","date":"2025-05-05","date_source":"heading","heading":"Version 0.1.5 - 2025-05-05","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-015---2025-05-05","sections":[{"kind":"fix","heading":"Fixed","items":1}],"hash":"98a675c385f15492"},{"version":"0.1.4","date":"2025-04-10","date_source":"heading","heading":"Version 0.1.4 - 2025-04-10","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-014---2025-04-10","sections":[{"kind":"fix","heading":"Fixed","items":1}],"hash":"733295a9c1dfca21"},{"version":"0.1.3","date":"2025-04-10","date_source":"heading","heading":"Version 0.1.3 - 2025-04-10","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-013---2025-04-10","sections":[{"kind":"fix","heading":"Fixed","items":1}],"hash":"e3febd311de4d532"},{"version":"0.1.2","date":"2025-04-09","date_source":"heading","heading":"Version 0.1.2 - 2025-04-09","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-012---2025-04-09","sections":[{"kind":"fix","heading":"Fixed","items":1}],"hash":"733295a9c1dfca21"},{"version":"0.1.1","date":"2025-04-09","date_source":"heading","heading":"Version 0.1.1 - 2025-04-09","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-011---2025-04-09","sections":[{"kind":"fix","heading":"Fixed","items":1}],"hash":"733295a9c1dfca21"},{"version":"0.1.0","date":"2025-04-09","date_source":"heading","heading":"Version 0.1.0 - 2025-04-09","url":"https://github.com/cap-js-community/common/blob/main/CHANGELOG.md#version-010---2025-04-09","sections":[{"kind":"feature","heading":"Added","items":1}],"hash":"113a09a6fa02ea20"}],"versions":[{"version":"0.5.5","date":"2026-10-22"},{"version":"0.5.4","date":"2026-09-25"},{"version":"0.5.3","date":"2026-09-22"},{"version":"0.5.2","date":"2026-09-21"},{"version":"0.5.1","date":"2026-08-04"},{"version":"0.5.0","date":"2026-07-03"},{"version":"0.4.0","date":"2026-03-10"},{"version":"0.3.5","date":"2026-02-03"},{"version":"0.3.4","date":"2026-01-20"},{"version":"0.3.3","date":"2026-01-07"},{"version":"0.3.2","date":"2025-11-05"},{"version":"0.3.1","date":"2025-11-05"},{"version":"0.3.0","date":"2025-11-03"},{"version":"0.2.8","date":"2025-10-13"},{"version":"0.2.7","date":"2025-10-13"},{"version":"0.2.6","date":"2025-08-04"},{"version":"0.2.5","date":"2025-07-07"},{"version":"0.2.4","date":"2025-07-03"},{"version":"0.2.3","date":"2025-07-01"},{"version":"0.2.2","date":"2025-06-26"},{"version":"0.2.1","date":"2025-06-26"},{"version":"0.2.0","date":"2025-06-03"},{"version":"0.1.7","date":"2025-05-08"},{"version":"0.1.6","date":"2025-05-07"},{"version":"0.1.5","date":"2025-05-05"},{"version":"0.1.4","date":"2025-04-10"},{"version":"0.1.3","date":"2025-04-10"},{"version":"0.1.2","date":"2025-04-09"},{"version":"0.1.1","date":"2025-04-09"},{"version":"0.1.0","date":"2025-04-09"}],"crawled_at":"2026-10-25"},"edges":{"maintainers":[{"ref":"actor:cap-js-community","name":"cap-js-community","json":"/actors/cap-js-community.json"},{"ref":"actor:oklemenz2","name":"Oliver Klemenz","json":"/actors/oklemenz2.json"}],"contributors":[{"ref":"actor:drktfl","name":"Dirk Teufel","json":"/actors/drktfl.json"},{"ref":"actor:soccermax","name":"Max Gruenfelder","json":"/actors/soccermax.json"},{"ref":"actor:oklemenz2","name":"Oliver Klemenz","json":"/actors/oklemenz2.json"}],"explained_by":[],"alternative_to_this":[],"needed_by":[],"available_via":[],"parts":[],"add_ons":[],"answered_through_parts":[]}}