segbedji / graphql-typed
A Statamic addon that adds type-safe GraphQL arguments for collections, filters, and enums.
Package info
github.com/JustinyAhin/statamic-graphql-typed
Type:statamic-addon
pkg:composer/segbedji/graphql-typed
Requires
- statamic/cms: ^6.0
Requires (Dev)
- orchestra/testbench: ^9.2 || ^10.0
README
A Statamic addon that adds type-safe GraphQL arguments for better developer experience when using typed GraphQL clients.
The Problem
Statamic's default GraphQL schema uses String for collection names and JsonArgument for filters:
entries(collection: [String], filter: JsonArgument, ...): EntryInterfacePagination
This means GraphQL clients like gqty, graphql-codegen, or Apollo can't provide autocomplete or type checking for these arguments.
The Solution
This addon replaces the collection argument with a dynamically generated CollectionName enum based on your actual collections:
enum CollectionName { ARTICLES PAGES # ... auto-generated from your collections } entries(collection: [CollectionName], ...): EntryInterfacePagination
Features
- Dynamically generates
CollectionNameenum from your Statamic collections - Overrides the default
entryandentriesqueries to use the typed enum - Zero configuration required - just install and regenerate your client types
Installation
composer require segbedji/graphql-typed
Usage
After installing, regenerate your GraphQL client types. The collection argument will now be typed as CollectionName enum instead of String.
Before (untyped)
query.entries({ collection: ['articles'] }) // 'articles' is just a string, no validation
After (typed)
query.entries({ collection: [CollectionName.ARTICLES] }) // Type-safe enum value
How It Works
The addon registers:
- CollectionNameEnum - A GraphQL enum type that dynamically generates values from
Collection::all() - TypedEntryQuery - Extends the default
EntryQuerybut uses theCollectionNameenum for thecollectionargument - TypedEntriesQuery - Extends the default
EntriesQuerybut uses theCollectionNameenum for thecollectionargument
Future Improvements
- Add typed filter inputs per collection based on blueprint fields
- Add typed sort options based on available fields