Skip to main content

@expr

The @expr directive is defined as follows:

Directive Definition
Directive Definition
directive @expr(body: JSON) on FIELD_DEFINITION | OBJECT

The @expr directive in GraphQL is a powerful tool for embedding data directly into your schema, offering two primary functionalities:

Static

This feature allows for the inclusion of a constant response within the schema definition itself. It is useful for scenarios where the response is unchanging. e.g:

schema {
query: Query
}

type Query {
user: User @expr(body: {name: "John", age: 12})
}

type User {
name: String
age: Int
}

The @expr directive also checks the provided value at compile time to ensure it matches the field's schema. If not, the console displays a descriptive error message.

Dynamic

Beyond static data embedding, the @expr directive extends its utility to support dynamic data injection through Mustache template syntax. This feature enables the use of placeholders within the constant data, which are then dynamically replaced with actual values at runtime. It supports both scalar values and complex objects, including lists and nested objects, offering flexibility in tailoring responses to specific needs. e.g:

schema {
query: Query
}

type Query {
user: User
@expr(
body: {
name: "John"
workEmail: "[email protected]"
personalEmail: "[email protected]"
}
)
}

type User {
name: String
age: Int
personalEmail: String
workEmail: String
emails: Emails
@expr(
body: {
emails: {
workEmail: "{{.value.workEmail}}"
personalEmail: "{{.value.personalEmail}}"
}
}
)
}

type Emails {
workEmail: String
personalEmail: String
}

In this example, the @expr directive dynamically generates an Emails object based on the provided template data. The placeholders within the template ({{.value.workEmail}} and {{.value.personalEmail}}) get replaced with the actual values specified in the User type, allowing for dynamic content generation while still adhering to the schema's structure.

Combining Multiple Directives

The @expr directive can be used in combination with other resolvable directives, with results merged deeply. This allows for powerful and flexible resolver configurations.

For more details, see Directives Documentation.