{"ref":"artifact:lemaiwo-cds-plugin-handlers","page":"/artifacts/lemaiwo-cds-plugin-handlers","json":"/artifacts/lemaiwo-cds-plugin-handlers.json","generated":"2026-10-26","drafted_with_ai":true,"entity":{"id":"lemaiwo-cds-plugin-handlers","name":"cds-plugin-handlers","artifact_type":"cds-plugin","ecosystem":"cap","domain":"developer-experience","origin_ring":"independent","description":{"one_line":"A CAP plugin that structures handlers as one file per entity, in a folder per service, instead of one service implementation that keeps growing.","short":"One handler file per entity in CAP services"},"links":{"repo":"https://github.com/lemaiwo/cds-plugin-handlers","npm":"https://www.npmjs.com/package/cds-plugin-handlers"},"compat":{"runtimes":["node"]},"type_properties":{"distribution":{"value":["npm"],"sources":[{"url":"https://github.com/lemaiwo/cds-plugin-handlers","title":"cds-plugin-handlers — README","checked":"2026-10-18","quote":"npm install cds-plugin-handlers"}]}},"provenance":{"discovered_via":[{"source":"source:github","channel":"lemaiwo"}],"first_seen":"2026-08-31","claimed_by":"actor:lemaiwo"},"provides":[{"capability":"capability:typescript-patterns","what_it_does":"Fixes the arrangement by folder rather than by annotation: a handlers folder under src holds a folder per service and a class per entity inside it, so where a handler goes follows from the name of its service and entity. Beside it a services folder holds a class per external service, which is where requests to an external API or another database are written instead of in the handler. Being a cds-plugin, the project's service implementation does not have to wire any of it up.","facets":[{"key":"handler_binding","value":["folder layout"],"source":{"url":"https://github.com/lemaiwo/cds-plugin-handlers","title":"lemaiwo/cds-plugin-handlers — README, Usage","checked":"2026-10-15","quote":"Inside the \"handlers\" folder you have to create a folder for each service, e.g.: \"CatalogService\" for the service CatalogService. In here, you have to create a handler class for each entity, e.g.: \"BooksHandler\" for the entity Books."}},{"key":"layers","value":["handlers","external services"],"source":{"url":"https://github.com/lemaiwo/cds-plugin-handlers","title":"lemaiwo/cds-plugin-handlers — README","checked":"2026-10-15","quote":"CAP CDS Plugin that enables classes for entities in a structured way + implementing an additional layer for service classes to separate the implementation for requests to external api's."},"sources":[{"url":"https://github.com/lemaiwo/cds-plugin-handlers","title":"lemaiwo/cds-plugin-handlers — README, the handler classes","checked":"2026-10-15","quote":"Inside the \"handlers\" folder you have to create a folder for each service, e.g.: \"CatalogService\" for the service CatalogService. In here, you have to create a handler class for each entity, e.g.: \"BooksHandler\" for the entity Books."},{"url":"https://github.com/lemaiwo/cds-plugin-handlers","title":"lemaiwo/cds-plugin-handlers — README, the services folder","checked":"2026-10-15","quote":"All requests to external services or even to different databases can be stored in a folder \"services\"."}]}],"sources":[{"url":"https://github.com/lemaiwo/cds-plugin-handlers","title":"lemaiwo/cds-plugin-handlers — README","checked":"2026-10-15","quote":"CAP CDS Plugin that enables classes for entities in a structured way + implementing an additional layer for service classes to separate the implementation for requests to external api's."}]}],"maintainers":["actor:lemaiwo"],"contributors":["actor:gertmertens92","actor:lemaiwo"],"history":[{"date":"2026-10-15","field":"provides[typescript-patterns]","from":"bare ref","to":"what_it_does and two facet values","reason":"The edge carried no sentence. It now says how the plugin decides where a handler goes, which is by folder and file name rather than by a decorator, and states the handler_binding and layers values of the capability's comparison, each on the README sentence it rests on. dependency_injection and draft_events are left unstated: the README mentions neither."}],"drafted_with_ai":true},"effective_normative_relations":[{"instrument":"instrument:sap-developer-license-3-2-cap","relation":"use-constrained-by","sections":["1","2","3"],"applies_when":"A cds-plugin is used with SAP CAP materials, or an artifact is explicitly identified as a CAP plugin or application.","note":"This is inherited applicability, not a licence verdict about the artifact itself. Review the agreement for the actual materials and use; an explicit artifact relationship to another revision takes precedence.","scope":{"kind":"artifact"},"sources":[{"url":"https://cap.cloud.sap/resources/license/developer-license-3_2_CAP.txt","title":"SAP Developer License Agreement 3.2 CAP","checked":"2026-09-16","quote":"documentation, plug-ins, templates, scripts and sample code, libraries, software development kits"}],"inherited_from":"cap-plugins-and-applications","relevant_capabilities":["agent-systems-access","async-processing","data-import-export","database-connectors","deployment","destinations","llm-integration","mcp-servers","plugin-authoring","replication","retrieval-augmented-generation","rfc-connectivity"]}],"readings":{"liveness":[{"label":"Maintenance","tier":"poor","evidence":"20 months since release"},{"label":"Continuity","tier":"fair","evidence":"2 contributors, 1 publisher"},{"label":"Repository","tier":"poor","evidence":"pushed 2025-02, not archived"}],"compatibility":[{"label":"Declared for","tier":"poor","evidence":"^8.7.2 — stops before cds 9"},{"label":"Survived majors","tier":"poor","evidence":"no release since @sap/cds 10 shipped (July 2026)"},{"label":"Maintainer's CI","tier":"fair","evidence":"no CI configured"}],"practice":[{"label":"Tests","tier":"poor","evidence":"none found in the tree"},{"label":"Docs","tier":"fair","evidence":"README 3 KB"},{"label":"Changelog","tier":"fair","evidence":"none in the repo"}],"reach":[{"value":1,"unit":"installs/week"},{"value":1,"unit":"watching"}]},"signals":{"crawled_at":"2026-10-26","latest_version":"1.0.3","majors":{"1":{"version":"1.0.0","date":"2024-02-16"}},"license":"MIT","first_release":"2024-02-16","last_release":"2025-02-17","releases":4,"cadence_days":106,"maintainers":1,"repository":"git+https://github.com/lemaiwo/cds-plugin-handlers.git","peer_cds":"^8.7.2","test_script":false,"types":false,"downloads_weekly":1,"stars":1,"forks":1,"open_issues":0,"archived":false,"pushed_at":"2025-02-17","license_spdx":"Apache-2.0","org_owned":false,"default_branch":"main","contributors":2,"tree_truncated":false,"test_files":0,"workflows":0,"other_ci":false,"readme_bytes":2722,"docs_files":0,"changelog":false,"license_file":true,"dts_files":0,"readme_path":"readme.md","readme_sha":"78ebf4aefece993550e33ca06347a0f0d5320935","months_since_release":20,"dormant":true,"repository_directory":null,"dependencies":0,"node_engine":null,"downloads_monthly":26,"created_at":"2024-02-18T16:28:34Z","open_prs":0,"first_commit":"2024-02-18","last_commit":"2025-02-17","commits":9,"repo_read":"2026-10-26"},"release_notes":{"license":"Apache-2.0","quotable":true,"versions":[{"version":"1.0.3","date":"2025-02-17"},{"version":"1.0.2","date":"2024-06-02"},{"version":"1.0.1","date":"2024-06-02"},{"version":"1.0.0","date":"2024-02-16"}],"crawled_at":"2026-10-25"},"edges":{"maintainers":[{"ref":"actor:lemaiwo","name":"Wouter Lemaire","json":"/actors/lemaiwo.json"}],"contributors":[{"ref":"actor:gertmertens92","name":"Gert Mertens","json":"/actors/gertmertens92.json"},{"ref":"actor:lemaiwo","name":"Wouter Lemaire","json":"/actors/lemaiwo.json"}],"explained_by":[{"ref":"content:create-your-first-cap-plugin","name":"Create your first CAP plugin","json":"/content/create-your-first-cap-plugin.json"}],"alternative_to_this":[],"needed_by":[],"available_via":[],"parts":[],"add_ons":[],"answered_through_parts":[]}}