Add Alloy infrastructure, context system, and field components#77
Open
FionaBronwen wants to merge 3 commits into
Open
Conversation
8f1da87 to
8b51ca4
Compare
8b51ca4 to
8f411e1
Compare
Introduce the foundation for the component-based GraphQL emitter: - Build/config: Add @alloy-js/core, @alloy-js/graphql dependencies, configure JSX transpilation (tsconfig, vitest) - Context system: GraphQLSchemaContext with ClassifiedTypes, ModelVariants, and ScalarVariant interfaces - Field components: Field, OperationField, and GraphQLTypeExpression for rendering model properties and operations as GraphQL SDL - Type resolution: GraphQLTypeExpression handles scalars, models, enums, unions, arrays, and nullability using an isInput prop to distinguish input vs output context - Scalar mappings: Add getGraphQLBuiltinName() for built-in scalar identity checks
8f411e1 to
5f26c25
Compare
The ModelVariants lookup structure was originally designed to help components decide when to append "Input" suffix to model names. However, the mutation engine now fully handles this: - Input models are mutated with the "Input" suffix already applied - Property type references are rewired to point to the correct variants This commit removes the unused ModelVariants interface and the lookup logic from GraphQLTypeExpression, simplifying the component to just use the model's name directly. Also adds unionMembers to context (needed for union rendering).
Remove unused utility functions that were superseded by the mutation engine: - getTemplatedModelName (mutation engine handles template naming) - getSingleNameWithNamespace (never used in production) - isArray, isRecordType, isScalarOrEnumArray, isUnionArray (use compiler's isArrayModelType) - unwrapModel, unwrapType (never imported) - isTrueModel (never imported) Also removes the corresponding test for getSingleNameWithNamespace.
swatkatz
reviewed
May 13, 2026
| /** | ||
| * Classified types separated by category for schema generation | ||
| */ | ||
| export interface ClassifiedTypes { |
There was a problem hiding this comment.
IIUC, ClassifiedTypes looks like a projection of MutatedSchema as it merges wrapperModels into outputModels, drops voidOperations, and reshuffles a few fields. Adding a second interface is needed only if the MutatedSchema is consumed as-is by something else.
When the ariadne emitter migrates to the mutation engine, would it consume ClassifiedTypes or MutatedSchema directly? If MutatedSchema is the shared contract, should we just put that on the context?
swatkatz
reviewed
May 13, 2026
| /** Classified types for schema generation */ | ||
| classifiedTypes: ClassifiedTypes; | ||
| /** Ordered member names for each union, keyed by the mutated Union */ | ||
| unionMembers: Map<Union, readonly string[]>; |
There was a problem hiding this comment.
Why is this being added separately to the context?
swatkatz
reviewed
May 13, 2026
| /** Ordered member names for each union, keyed by the mutated Union */ | ||
| unionMembers: Map<Union, readonly string[]>; | ||
| /** Scalar specification URLs for @specifiedBy directives */ | ||
| scalarSpecifications: Map<string, string>; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This PR sets up the Alloy JSX foundation for the component-based GraphQL emitter! This PR introduces the build config, context system, and first set of components that will be used to construct the GraphQL schema in subsequent PRs.
@alloy-js/core,@alloy-js/graphqldependencies, JSX transpilation in tsconfig and vitestGraphQLSchemaContext(Alloy named context) withClassifiedTypes, andScalarVariantinterfaces for schema-wide stateField,OperationField, andGraphQLTypeExpressionfor rendering model properties and operations as GraphQL SDLgetGraphQLBuiltinName()to scalar-mappings for identity-based built-in scalar resolutionTest plan