UNPKG

cypher-tag

Version:

A template literal tag for Cypher in GraphQL.

60 lines (46 loc) 2.56 kB
## cypher-tag A JavaScript template literal tag for Cypher in GraphQL. ## Motivation The [neo4j-graphql-js](https://www.npmjs.com/package/neo4j-graphql-js) and [@neo4j/graphql](https://www.npmjs.com/package/@neo4j/graphql) libraries define a [@cypher](https://grandstack.io/docs/graphql-custom-logic) directive used for statically embedding Cypher statements on fields. This allows for writing custom operations that translate GraphQL to Cypher, on top of the default translation logic. ```graphql directive @cypher(statement: String!) on FIELD_DEFINITION ... ``` But there is no syntax highlighting for Cypher within GraphQL and attempting to define a `cypher` or `cql` tag must handle for nested composition. ## Syntax Highlighting If you install the [Cypher Query Language Tools for Neo4j](https://marketplace.visualstudio.com/items?itemName=AnthonyJGatlin.vscode-cypher-query-language-tools) VSCode extension, then syntax highlighting will be supported when using the `cql` template literal tag. #### Not Highlighted ![Not Highlighted](https://github.com/michaeldgraham/cypher-tag/blob/main/no-highlight.png?raw=true) When using `cql`, the tagged template literal is wrapped with a GraphQL [Block String](https://spec.graphql.org/June2018/#sec-String-Value) when compiled. So instead of writing: ```graphql type Type { field: OutputType @cypher(statement: " ... ") } ``` Or writing: ```graphql type Type { field: OutputType @cypher(statement: """ ... """) } ``` You can write: ```graphql type Type { field: OutputType @cypher(statement: ${cql` ... `}) } ``` #### Highlighted ![Highlighted](https://github.com/michaeldgraham/cypher-tag/blob/main/highlighted.png?raw=true) # Composition You can use the `cql` tag to compose the Cypher of another `cql` tag. This enables composition and reuse of Cypher template variables, perhaps while using imperative tooling, making your `@cypher` directives [DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself). One caveat with the VSCode extension is that syntax highlighting breaks when `cql` is used on a variable but has a space behind it. ![Composition](https://github.com/michaeldgraham/cypher-tag/blob/main/composition.png?raw=true) ## Roadmap * Static validation of Cypher in string literals tagged with `cql` * Corresponding VSCode extension * Improved syntax highlighting * IntelliSense integration with GraphQL schema * Activity bar tab with directory navigation for only files containing `cql`