{"ref":"artifact:cap-attachments-plus","page":"/artifacts/cap-attachments-plus","json":"/artifacts/cap-attachments-plus.json","generated":"2026-10-26","drafted_with_ai":true,"entity":{"id":"cap-attachments-plus","name":"cap-attachments-plus","artifact_type":"cds-plugin","ecosystem":"cap","flavors":[{"key":"node","source":{"url":"https://www.npmjs.com/package/cap-attachments-plus","title":"cap-attachments-plus — npm README","checked":"2026-09-13","quote":"The attachments plugin needs to be referenced in the package.json of the consuming CAP NodeJS application:"}}],"domain":"data-and-persistence","origin_ring":"independent","description":{"one_line":"A CAP Node.js attachments plugin with an Attachments aspect and a Fiori elements upload facet, storing content in the database locally or in AWS, Azure or GCP through a BTP destination.","short":"CAP Node.js attachments plugin with database or cloud storage","what_it_solves":"Adds an Attachments aspect and Fiori elements upload facet. Cloud attachment content is stored in the application owner’s AWS, Azure or GCP account using credentials from a BTP destination; local development can store content in the database. Non-draft clients create metadata and upload content in separate requests."},"links":{"npm":"https://www.npmjs.com/package/cap-attachments-plus"},"type_properties":{"distribution":{"value":["npm"],"sources":[{"url":"https://www.npmjs.com/package/cap-attachments-plus","title":"cap-attachments-plus — README","checked":"2026-10-18","quote":"npm add cap-attachments-plus"}]}},"provides":[{"capability":"capability:attachments","what_it_does":"Adds an Attachments aspect and Fiori elements upload facet. Cloud attachment content is stored in the application owner’s AWS, Azure or GCP account using credentials from a BTP destination; local development can store content in the database.","sources":[{"url":"https://www.npmjs.com/package/cap-attachments-plus","title":"plus — README","checked":"2026-09-17","quote":"Credentials come from a **BTP destination** you create yourself"},{"url":"https://www.npmjs.com/package/cap-attachments-plus","title":"plus — README","checked":"2026-09-17","quote":"For scenarios where the entity is not draft-enabled, for example [`tests/non-draft-request.http`](./tests/non-draft-request.http), separate HTTP requests for metadata creation and asset uploading need to be performed manually."},{"url":"https://www.npmjs.com/package/cap-attachments-plus","title":"plus — README","checked":"2026-09-17","quote":"The plugin's own `[development]` profile default already wires up a **mocked** scanner (`kind: \"malwareScanner-mocked\"`) that always reports `Clean` without calling any real service."},{"url":"https://www.npmjs.com/package/cap-attachments-plus","title":"plus — README","checked":"2026-09-17","quote":"Each cloud provider reads its configuration directly from a BTP destination, pointing at your own AWS, Azure or GCP account rather than an SAP Object Store service instance."}],"facets":[{"key":"storage_target","value":"Local database; own AWS, Azure or GCP storage via BTP destination","applies_to":{"ecosystems":["cap"],"flavors":["node"]},"source":{"url":"https://www.npmjs.com/package/cap-attachments-plus","title":"plus — README","checked":"2026-09-17","quote":"Credentials come from a **BTP destination** you create yourself"}},{"key":"upload_flow","value":"Fiori elements uses drafts; non-draft upload uses separate requests","applies_to":{"ecosystems":["cap"],"flavors":["node"]},"source":{"url":"https://www.npmjs.com/package/cap-attachments-plus","title":"plus — README","checked":"2026-09-17","quote":"For scenarios where the entity is not draft-enabled, for example [`tests/non-draft-request.http`](./tests/non-draft-request.http), separate HTTP requests for metadata creation and asset uploading need to be performed manually."}},{"key":"scan_behaviour","value":"Configurable; development mock reports Clean without scanning","applies_to":{"ecosystems":["cap"],"flavors":["node"]},"source":{"url":"https://www.npmjs.com/package/cap-attachments-plus","title":"plus — README","checked":"2026-09-17","quote":"The plugin's own `[development]` profile default already wires up a **mocked** scanner (`kind: \"malwareScanner-mocked\"`) that always reports `Clean` without calling any real service."}}]}],"provenance":{"discovered_via":[{"source":"source:npm"},{"source":"source:discover"}],"first_seen":"2026-08-30"},"source_available":false,"history":[{"date":"2026-09-08","field":"links.repo","from":"https://github.com/TODO/cap-attachments-plus","to":"npm: https://www.npmjs.com/package/cap-attachments-plus","reason":"The repository was a placeholder that never resolved — github.com/TODO/… . There is no public repository for this package, so npm is its address and source_available says why."},{"date":"2026-09-08","field":"description.one_line","from":"CAP cds-plugin providing image and attachment storing out-of-the-box.","to":"A derived copy of the official attachments plugin, published under its own name; its readme is @cap-js/attachments' with the package name swapped.","reason":"Placement copied the package's own npm description. Replaced with a line written for this graph — what it does and where it sits — because an unattributed sentence is an unattributed claim."},{"date":"2026-09-17","field":"provides.what_it_does","from":null,"to":"Adds an Attachments aspect and Fiori elements upload facet. Cloud attachment content is stored in the application owner’s AWS, Azure or GCP account using credentials from a BTP destination; local development can store content in the database.","reason":"Current npm README documents destination-based cloud storage, replacing the name-swapped claim. Source repository availability remains unchanged; no cloud integration verified."}],"drafted_with_ai":true,"requires":[{"ref":"artifact:btp-destination","requirement":"conditional","role":"attachment-storage","condition":"A cloud storage backend is selected.","sources":[{"url":"https://www.npmjs.com/package/cap-attachments-plus","title":"plus — README","checked":"2026-09-17","quote":"bind the **Destination service** instance (which the plugin uses to look up your BTP destination at runtime)"}]},{"ref":"artifact:btp-malware-scanning","requirement":"conditional","role":"attachment-scanning","condition":"Real malware scanning is enabled rather than the development mock.","sources":[{"url":"https://www.npmjs.com/package/cap-attachments-plus","title":"plus — README","checked":"2026-09-17","quote":"If there is no malware scanner available and the scanner is not disabled, then the upload will fail."}]},{"ref":"artifact:btp-object-store","requirement":"conditional","role":"tenant-store-provisioning","condition":"Automatic per-tenant Object Store provisioning is used.","sources":[{"url":"https://www.npmjs.com/package/cap-attachments-plus","title":"plus — README","checked":"2026-09-17","quote":"The SAP Object Store service binding described below is only relevant for **multi-tenant** deployments that use the plugin's automatic per-tenant Object Store provisioning"}]}]},"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":"good","evidence":"2 months since release"},{"label":"Continuity","tier":"fair","evidence":"1 publisher on npm"},{"label":"Repository","tier":"unknown","evidence":"no repository data"}],"compatibility":[{"label":"Declared for","tier":"good","evidence":">=8 — includes cds 10 and 9"},{"label":"Survived majors","tier":"unknown","evidence":"first released after @sap/cds 10 shipped"},{"label":"Maintainer's CI","tier":"unknown","evidence":"no repository data"}],"practice":[{"label":"Tests","tier":"unknown","evidence":"npm test script, tree not read"},{"label":"Docs","tier":"good","evidence":"README 34 KB"},{"label":"Changelog","tier":"fair","evidence":"none in the repo"}],"reach":[{"value":9,"unit":"installs/week"},{"value":null,"unit":"watching"}]},"signals":{"crawled_at":"2026-10-25","latest_version":"1.0.29","majors":{"1":{"version":"1.0.26","date":"2026-08-11"}},"license":"Apache-2.0","first_release":"2026-08-11","last_release":"2026-08-11","releases":4,"cadence_days":0,"maintainers":1,"repository":null,"peer_cds":">=8","test_script":true,"types":false,"downloads_weekly":9,"months_since_release":2,"dormant":false,"repository_directory":null,"dependencies":6,"node_engine":">=18.0.0","downloads_monthly":38,"npm_document_version":"1.0.29","npm_document_integrity":"sha512-aEWt2ftv/J8+5uqLjqlALkpqaLMSN8hfMwx2yIIqs7VvDMSZyCyU0xAZHdJO3J+PikxtZ4MYiF4DD0NjDX99sQ==","npm_document_tarball":"https://registry.npmjs.org/cap-attachments-plus/-/cap-attachments-plus-1.0.29.tgz","readme_path":"README.md","readme_bytes":34405,"readme_source":"npm","changelog":false,"license_file":true,"license_path":"LICENSE","license_name":"Apache License 2.0, January 2004"},"release_notes":{"license":"Apache License 2.0, January 2004","quotable":false,"versions":[{"version":"1.0.29","date":"2026-08-11"},{"version":"1.0.28","date":"2026-08-11"},{"version":"1.0.27","date":"2026-08-11"},{"version":"1.0.26","date":"2026-08-11"}],"crawled_at":"2026-10-25"},"edges":{"maintainers":[],"contributors":[],"explained_by":[],"alternative_to_this":[],"needed_by":[],"available_via":[],"parts":[],"add_ons":[],"answered_through_parts":[]}}