@cap-js/graphql
A protocol adapter that generates a GraphQL schema from the model and serves it, so the same services answer GraphQL without a second definition of them.
Facts
Where it sits
Who is behind it
In the atlas: maintains 34@cap-jsmaintainerAjinkya PatilContributes to this
In the atlas: contributes to 112@ajinkyapatil8190Arley Triana MorinContributes to this
In the atlas: contributes to 9, wrote 1@arleytmChristian GeorgiContributes to this
In the atlas: maintains 1, contributes to 53@chgeoChristian NeuContributes to this
In the atlas: contributes to 5@christianneuChristian SchüringsContributes to this
In the atlas: contributes to 25@cschueringsDaniel HutzelContributes to this
In the atlas: contributes to 32, wrote 3@danjoaDr. David A. KunzContributes to this
In the atlas: contributes to 16@David-KunzOlenaContributes to this
In the atlas: contributes to 11@etimrHeiko WitteborgContributes to this
In the atlas: contributes to 18@hm23Johannes VogelContributes to this
In the atlas: contributes to 25@johannes-vogel22 contributors
Before choosing this
Conditions
LicenceSAP Developer License Agreement 3.2 CAP§ 1, 2, 3A cds-plugin is used with SAP CAP materials, or an artifact is explicitly identified as a CAP plugin or application.
- § 1 License. Productive customer applications are limited to SAP BTP or another SAP-licensed platform, and mass extraction to a non-SAP product is restricted except where solely required for SAP interoperability.
- § 2 Intellectual Property. The agreement retains SAP's rights in the covered materials and limits making APIs, tools or software available to third parties, while preserving ownership of customer applications subject to SAP's underlying rights.
- § 3 Artificial Intelligence Training. The agreement prohibits use of the covered materials and customer applications for training artificial-intelligence models or systems.
What it declares
Every artifact
- Type
- CDS plugin
- Origin
- By SAP
As a CDS plugin
- Declared for
- >=9
- Distributed through
- npm
Connections
Serving the same model over GraphQL instead of OData
Download
Install
npm add @cap-js/graphqlDerived from the package name. No recipe recorded; the README has the configuration.
Learn more
- SAP CAPv7 - Node.js Highlights and ExperiencesSAP CAPv7 - Node.js Highlights and ExperiencesAn account of upgrading a 100+ table CAP Node.js project from v6 to v7, working through breaking changes in @sap/cds 7: event handlers now always receive an array, service paths move under /odata/v4/... unless serve_on_root is set, and cds-serve replaces cds run. It goes deepest on the GraphQL plugin, @cap-js/graphql: the /graphql endpoint it serves, Composition results wrapped in a nodes connection, and offset-based pagination reached through OData's top and skip rather than GraphQL's own limit and offset.published 2023-08-03davidtill, SAP Community
- CAP: GraphQL as new protocolCAP: GraphQL as new protocolWritten days after @cap-js/graphql appeared, by somebody who went looking for it — an introduction to GraphQL alongside what the adapter actually does to a CAP service. The first outside account of the capability, and still one of very few.jhodel18, published 2023-03-18jhodel18, SAP Community
README
quoted from cap-js/graphql under Apache-2.0, readCDS protocol adapter for GraphQL
About this project
A GraphQL protocol adapter for SAP Cloud Application Programming Model Node.js. This adapter generically generates a GraphQL schema for the models of an application and serves an endpoint that allows you to query your services using the GraphQL query language.
WARNING: This package is in an early general availability state. This means that it is generally available, with stable APIs unless otherwise indicated, and you can use it for production. However, please note the current limitations listed below.
Requirements and Setup
- Simply add the GraphQL adapter to your project using
npm:npm add @cap-js/graphql
This command will set up the GraphQL plug-in with the
@sap/cdsruntime. It enables the new middlewares architecture in Node.js and registers a GraphQL endpoint at/graphqlserving all CRUD requests for the application services found in your model.
-
Annotate the services you want to serve, e.g. using
@graphqlor@protocol: 'graphql'. -
Run your server as usual, e.g. using
cds watch.
The runtime will serve all annotated services via GraphQL at the default configured endpoint.
Limitations
- Actions and functions are not yet supported.
- CDS annotations like
@readonlyaren’t considered during schema generation. - Cursor-based Pagination – we currently support offset-based pagination, and will add cursor-based pagination going forward. While we intend to support both variants then, it is not guaranteed that we can do so without breaking changes to current behaviour.
- Extensions are not yet considered.
Support, Feedback, Contributing
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.
Code of Conduct
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.
Licensing
Copyright 2022 SAP SE or an SAP affiliate company and cap-js/graphql 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.
History
Changed 1, Fixes 3
Notes
Changed
- Only load default error formatter if no custom error formatter is configured
Fixed
- Sanitization of logged queries, when running in production, if literal values contain parentheses
- Read GraphiQL HTML file only once on startup, and only if GraphiQL is enabled, to avoid unnecessary file system access
- Server crash by
SyntaxErrorfrom express JSON parser
Features 2, Fixes 1
Notes
Added
- Schema validation after schema generation (on server startup or manual compilation) to ensure that the generated schema is valid according to the GraphQL specification
- Scalar type
Voidthat represents the absence of a return value and only allows valuenull
Fixed
- Improved schema generation robustness where specific CDS modelling could cause empty GraphQL types to be generated (which is not allowed) for entities, aspects and services. These types and any resulting empty parent types are omitted from the generated schema and a warning is logged for them. If schema generation would result in an empty query root type, a placeholder field
_of typeVoidis added to keep the schema valid.
Changed 3
Notes
Changed
- Bump
@graphiql/plugin-explorerversion to^3 - Make error handling compatible with
@sap/cdsversion>=9 - Bump required
@sap/cdsversion to>=9which will be released in the near future
- Bump
Features 1, Changed 4
Notes
Added
- Support for configuring request payload limit using global flag
cds.server.body_parser.limit
Changed
- Bump required
@sap/cdsversion to>=7.8 - To improve performance, binary payloads are no longer validated to check if they are properly base64 or base64url encoded
- Bump required
nodeversion to^16due to usage ofBuffer.toString('base64url') - Use
cds.compile.to.serviceinfoto determine if a service should be compiled to GraphQL schema
- Support for configuring request payload limit using global flag
Fixes 1
Notes
Fixed
- Type parsing error for literal values passed within arguments on fields of scalar type differing from the literal type. This case occurred for delete mutations when the filter operands had a type other than
Int.
- Type parsing error for literal values passed within arguments on fields of scalar type differing from the literal type. This case occurred for delete mutations when the filter operands had a type other than
Features 2, Changed 3, Fixes 2
Notes
Added
- Support for generating GraphQL descriptions from CDS doc comments of services, entities, and elements
- Support for operator
infor filtering on lists of values
Changed
- Bump
@graphiql/plugin-explorerversion to^1 - Ignore fields that represent foreign keys in GraphQL schema generation
- When compiling to GraphQL using the CDS API or CLI, only generate GraphQL schemas for services that are annotated with GraphQL protocol annotations
Fixed
- Name clashes when CDS elements are named
nodesortotalCount - Parsing of
nullvalues in lists
Features 1, Changed 4, Fixes 2
Notes
Added
- Message interpolation of logged errors, transforming error message placeholders into human-readable text (default locale)
Changed
- Moved registration of
cds.compile.to.gqlandcds.compile.to.graphqltargets from@sap/cdsto@cap-js/graphql - Improve merging of custom
graphqlprotocol configuration with plugin default configuration - Errors representing client errors (
4xxrange) are now logged as warnings instead of errors - Exclude the stack trace of the outer logged error message in multiple error scenarios, as the inner stack trace already contained the precise initial segment of the outer stack trace
Fixed
- Load custom
errorFormatterrelative to CDS project root - Fix internal server error when formatting errors that aren't CDS errors (thrown by CDS or in custom handlers) or instances of GraphQLError, such as the error caused by requests with undefined
queryproperty
Features 3, Changed 2, Fixes 1
Notes
Added
- [beta] Translate CDS error messages and include additional error properties in
GraphQLErrorextensions. Only specific allowed properties are exposed when running in production. - [beta] Option
errorFormatterthat can be pointed to a function that overwrites the default logic of how CDS errors are formatted before they are added to the GraphQL error response. Please note that this may overwrite sanitization logic that is otherwise applied to error messages in production. - [beta] Logging of errors that occur during query and mutation execution
Changed
- Bump required
@sap/cdsversion to>=7.3 - Bump required
graphql-httpversion to^1.18.0
Fixed
- Malformed responses for convoluted queries in which parts of results are supposed to be returned multiple times, caused by formatting results in-place
- [beta] Translate CDS error messages and include additional error properties in
Changed 2, Fixes 1
Notes
Changed
- Pin
graphiqlversion to^3 - Pin
@graphiql/plugin-explorerversion to~0.3
Fixed
- GraphiQL Explorer Plugin initialization due to upstream implementation pattern change
- Pin
Changed 1, Fixes 1
Notes
Changed
- Improved query logging:
- Don't log queries that are
undefined - Log
operationName - Log
variableswhen not in production - Sanitize arguments and their values in queries when in production
- Don't log queries that are
Fixed
- Changed GraphiQL Explorer Plugin CDN URL due to upstream renaming
- Improved query logging:
Features 1, Changed 5
Notes
Added
- Support for
@sap/cds^7middlewares and protocols. Note: services now need to be annotated with protocol annotations such as@graphqlor@protocol: 'graphql'.
Changed
- Bump required
@sap/cdsversion to>=7 @cap-js/graphql/index.jsnow collects individual services and mounts the adapter as a protocol middleware on thecds.on('served', ...)event- Moved the
GraphQLAdaptermodule tolib/GraphQLAdapter.jsand merged it withCDSGraphQLAdapterpreviously found inindex.jsin the root directory - Don't generate fields that represent compositions of aspects within mutation types that represent services
- Disabled conjunction on the same field for the following operators:
eq(Equal)gt(Greater Than)ge(Greater Than or Equal)le(Less Than or Equal)lt(Less Than)startswithendswith
- Support for
Changed 4, Fixes 1
Notes
Changed
- Improved consistency of handling results of different types returned by custom handlers in CRUD resolvers:
- Wrap only objects (i.e. not primitive types or arrays) returned by custom handlers in arrays in create, read, and update resolvers
- Delete mutations return the length of an array that is returned by a
DELETEcustom handler or 1 if a single object is returned
- Don't generate fields for key elements in update input objects
- Update and delete mutations have mandatory
filterargument - Allow services that are not instances of
cds.ApplicationService. It is expected that the invoker provides the correct set of service providers when directly using the GraphQL protocol adapter API.
Fixed
- Aligned
cds.Requestinstantiation with other protocols for more consistent usage in custom handlers
- Improved consistency of handling results of different types returned by custom handlers in CRUD resolvers:
Features 3, Changed 2, Fixes 1
Notes
Added
- Supporting new
cds-plugintechnique for zero configuration - Support for filtering by
nullvalues - Allow multiple filters on the same field, with the same operator, that are logically joined by
AND. For example, filtering for all books with titles that contain both strings, "Wuthering" and "Heights":{ AdminService { Books(filter: { title: { contains: ["Wuthering", "Heights"] } }) { nodes { title } } } }
Changed
- Improved handling of
nullandundefinedvalues in query arguments - Empty filter lists resolve to
falseand empty filter objects resolve totrue
Fixed
- Handling of GraphQL queries that are sent via
GETrequests using thequeryURL parameter if GraphiQL is enabled
- Supporting new
Fixes 1
Notes
Fixed
- Add
appfolder tofilesproperty ofpackage.jsonto be included for publishing tonpm
- Add
Changed 4
Notes
Changed
- Replaced deprecated GraphQL HTTP server
express-graphqlwithgraphql-http - Serve GraphiQL 2 via included HTML instead of relying on the server framework (
express-graphqlincluded GraphiQL 1) - Bump
graphqlversion to 16 - Execute query resolvers in parallel and mutation resolvers serially
- Replaced deprecated GraphQL HTTP server
Changed 2, Fixes 2
Notes
Changed
- Register
aliasFieldResolverduring schema generation instead of passing it to the GraphQL server - The filters
contains,startswith, andendswithnow generate CQN function calls instead of generatinglikeexpressions directly
Fixed
- Schema generation crash that occurred if an entity property is named
localized - The field
totalCountcould not be queried on its own
- Register
Features 5, Changed 2
Notes
Added
- To-many relationships are now represented by an additional nesting level which contains the fields
totalCountandnodes.totalCountis similar to OData$count.nodescontains the fields belonging to the entity. This is similar to the GraphQL cursor connection specification, but without an additional secondedgesnesting level. The following shows an example query using the new schema structure:{ AdminService { Books { totalCount nodes { title } } } } - Support for aliases on fields returned by mutations
- Improved support for aliases on fields that represent compositions and associations (some limitations still apply)
- Include localized
textsfields of entities in schema generation - Improve check to skip field
localizedduring schema generation
Changed
- The GraphQL protocol adapter now uses a new middlewares mechanism instead of
cds.pluginswhich requires@sap/cdsversion 6.3 to run. Enable thecds.requires.middlewaresflag and register the GraphQL protocol adapter incds.env.protocolsto get started. - Replaced
debuglevel query and mutation logging with improvedinfolevel request logging
- To-many relationships are now represented by an additional nesting level which contains the fields
Details
Sources
Sources are graph entities: the same page may back several entries, and an unreachable source flags every row that rests on it.
Compatibility and provenance
Flavors
“A GraphQL protocol adapter for [SAP Cloud Application Programming Model](https://cap.cloud.sap) Node.js.” — cap-js/graphql — README
Contributors
History in the atlas
- A protocol adapter that generates a GraphQL schema from the model and serves it, so the same services answer GraphQL without a second definition of them.
- First seen.
For your agent
- Ref
artifact:cap-js-graphql- JSON
- /artifacts/cap-js-graphql.json
- MCP
- Connecting an agent