@effect-gql/core 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -1
- package/index.cjs +34 -17
- package/index.cjs.map +1 -1
- package/index.js +34 -17
- package/index.js.map +1 -1
- package/package.json +1 -1
- package/server/index.cjs +34 -17
- package/server/index.cjs.map +1 -1
- package/server/index.js +36 -19
- package/server/index.js.map +1 -1
package/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schema-mapping.ts","../src/builder/type-registry.ts","../src/builder/field-builders.ts","../src/builder/schema-builder.ts","../src/builder/pipe-api.ts","../src/extensions.ts","../src/builder/execute.ts","../src/error.ts","../src/context.ts","../src/loader.ts","../src/resolver-context.ts","../src/server/config.ts","../src/server/graphiql.ts","../src/server/complexity.ts","../src/server/cache-control.ts","../src/server/router.ts","../src/server/schema-builder-extensions.ts","../src/server/ws-types.ts","../src/server/ws-adapter.ts","../src/server/ws-utils.ts","../src/server/sse-types.ts","../src/server/sse-adapter.ts","../src/analyzer-extension.ts"],"names":["AST","GraphQLString","GraphQLFloat","GraphQLBoolean","GraphQLInt","S","GraphQLList","field","GraphQLNonNull","GraphQLObjectType","GraphQLInputObjectType","AST2","enumType","S2","unionType","middleware","effect","Runtime","Queue","Effect","Stream","Option","Fiber","Pipeable","GraphQLDirective","GraphQLEnumType","inputType","interfaceType","GraphQLInterfaceType","GraphQLUnionType","GraphQLSchema","Context","Ref","parse","extensionData","GraphQLError","validate","graphqlExecute","Data","Layer","DataLoader","HashMap","make","Config","Kind","query","getRootType","analyzeSelectionSet","getNamedType","GraphQLScalarType","analyzeFragmentSpread","analyzeInlineFragment","analyzeField","HttpServerResponse","Schema","HttpIncomingMessage","HttpServerRequest","specifiedRules","NoSchemaIntrospectionCustomRule","HttpRouter","Deferred","subscribe","makeServer"],"mappings":"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","file":"index.cjs","sourcesContent":["import { Effect } from \"effect\"\nimport * as S from \"effect/Schema\"\nimport * as AST from \"effect/SchemaAST\"\nimport {\n GraphQLObjectType,\n GraphQLString,\n GraphQLInt,\n GraphQLFloat,\n GraphQLBoolean,\n GraphQLNonNull,\n GraphQLList,\n GraphQLOutputType,\n GraphQLInputObjectType,\n GraphQLInputType,\n GraphQLFieldConfigMap,\n GraphQLFieldConfigArgumentMap,\n} from \"graphql\"\n\n/**\n * Check if a number AST node represents an integer\n */\nconst isIntegerType = (ast: AST.AST): boolean => {\n // Check for Refinement with integer filter\n if (ast._tag === \"Refinement\") {\n const refinement = ast as any\n\n // S.Int uses a filter with a specific predicate\n // Check the annotations for the integer identifier\n const annotations = refinement.annotations\n if (annotations) {\n // Check for identifier annotation\n const identifier = AST.getIdentifierAnnotation(refinement)\n if (identifier._tag === \"Some\" && identifier.value === \"Int\") {\n return true\n }\n }\n\n // Recursively check the base type\n return isIntegerType(refinement.from)\n }\n return false\n}\n\n/**\n * Convert an Effect Schema to a GraphQL output type\n */\nexport const toGraphQLType = (schema: S.Schema<any, any, any>): GraphQLOutputType => {\n const ast = schema.ast\n\n // Handle primitives\n if (ast._tag === \"StringKeyword\") return GraphQLString\n if (ast._tag === \"NumberKeyword\") return GraphQLFloat\n if (ast._tag === \"BooleanKeyword\") return GraphQLBoolean\n\n // Handle refinements (e.g., S.Int)\n if (ast._tag === \"Refinement\") {\n if (isIntegerType(ast)) {\n return GraphQLInt\n }\n // For other refinements, use the base type\n return toGraphQLType(S.make((ast as any).from))\n }\n\n // Handle literals\n if (ast._tag === \"Literal\") {\n if (typeof ast.literal === \"string\") return GraphQLString\n if (typeof ast.literal === \"number\") {\n // Check if it's an integer literal\n return Number.isInteger(ast.literal) ? GraphQLInt : GraphQLFloat\n }\n if (typeof ast.literal === \"boolean\") return GraphQLBoolean\n }\n\n // Handle arrays - check for TupleType\n if (ast._tag === \"TupleType\") {\n const elements = ast.elements\n if (elements.length > 0) {\n const elementSchema = S.make(elements[0].type)\n return new GraphQLList(toGraphQLType(elementSchema))\n }\n }\n\n // Handle structs/objects\n if (ast._tag === \"TypeLiteral\") {\n const fields: GraphQLFieldConfigMap<any, any> = {}\n\n for (const field of ast.propertySignatures) {\n const fieldName = String(field.name)\n const fieldSchema = S.make(field.type)\n let fieldType = toGraphQLType(fieldSchema)\n\n // Make non-optional fields non-null\n if (!field.isOptional) {\n fieldType = new GraphQLNonNull(fieldType)\n }\n\n fields[fieldName] = { type: fieldType }\n }\n\n // Generate a name from the schema or use a default\n const typeName =\n (schema as any).annotations?.identifier || `Object_${Math.random().toString(36).slice(2, 11)}`\n\n return new GraphQLObjectType({\n name: typeName,\n fields,\n })\n }\n\n // Handle transformations - use the \"to\" side\n if (ast._tag === \"Transformation\") {\n return toGraphQLType(S.make(ast.to))\n }\n\n // Handle unions (use first type as fallback)\n if (ast._tag === \"Union\") {\n const types = ast.types\n if (types.length > 0) {\n return toGraphQLType(S.make(types[0]))\n }\n }\n\n // Handle Suspend (recursive/self-referential schemas)\n if (ast._tag === \"Suspend\") {\n const innerAst = (ast as any).f()\n return toGraphQLType(S.make(innerAst))\n }\n\n // Default fallback\n return GraphQLString\n}\n\n/**\n * Convert an Effect Schema to a GraphQL input type\n */\nexport const toGraphQLInputType = (schema: S.Schema<any, any, any>): GraphQLInputType => {\n const ast = schema.ast\n\n // Handle primitives\n if (ast._tag === \"StringKeyword\") return GraphQLString\n if (ast._tag === \"NumberKeyword\") return GraphQLFloat\n if (ast._tag === \"BooleanKeyword\") return GraphQLBoolean\n\n // Handle refinements (e.g., S.Int)\n if (ast._tag === \"Refinement\") {\n if (isIntegerType(ast)) {\n return GraphQLInt\n }\n // For other refinements, use the base type\n return toGraphQLInputType(S.make((ast as any).from))\n }\n\n // Handle literals\n if (ast._tag === \"Literal\") {\n if (typeof ast.literal === \"string\") return GraphQLString\n if (typeof ast.literal === \"number\") {\n // Check if it's an integer literal\n return Number.isInteger(ast.literal) ? GraphQLInt : GraphQLFloat\n }\n if (typeof ast.literal === \"boolean\") return GraphQLBoolean\n }\n\n // Handle arrays\n if (ast._tag === \"TupleType\") {\n const elements = ast.elements\n if (elements.length > 0) {\n const elementSchema = S.make(elements[0].type)\n return new GraphQLList(toGraphQLInputType(elementSchema))\n }\n }\n\n // Handle structs/objects as input types\n if (ast._tag === \"TypeLiteral\") {\n const fields: Record<string, { type: GraphQLInputType }> = {}\n\n for (const field of ast.propertySignatures) {\n const fieldName = String(field.name)\n const fieldSchema = S.make(field.type)\n let fieldType = toGraphQLInputType(fieldSchema)\n\n // Make non-optional fields non-null\n if (!field.isOptional) {\n fieldType = new GraphQLNonNull(fieldType)\n }\n\n fields[fieldName] = { type: fieldType }\n }\n\n const typeName =\n (schema as any).annotations?.identifier || `Input_${Math.random().toString(36).slice(2, 11)}`\n\n return new GraphQLInputObjectType({\n name: typeName,\n fields,\n })\n }\n\n // Handle transformations - use the \"from\" side for input\n if (ast._tag === \"Transformation\") {\n return toGraphQLInputType(S.make(ast.from))\n }\n\n // Handle unions (use first type as fallback)\n if (ast._tag === \"Union\") {\n const types = ast.types\n if (types.length > 0) {\n return toGraphQLInputType(S.make(types[0]))\n }\n }\n\n // Handle Suspend (recursive/self-referential schemas)\n if (ast._tag === \"Suspend\") {\n const innerAst = (ast as any).f()\n return toGraphQLInputType(S.make(innerAst))\n }\n\n // Default fallback\n return GraphQLString\n}\n\n/**\n * Additional field configuration for computed/relational fields\n */\nexport interface AdditionalField<Parent, Args, R, E, A> {\n type: GraphQLOutputType\n args?: GraphQLFieldConfigArgumentMap\n description?: string\n resolve: (parent: Parent, args: Args) => Effect.Effect<A, E, R>\n}\n\n/**\n * Create a GraphQL Object Type from an Effect Schema with a name\n * Optionally add computed/relational fields with resolvers\n */\nexport const toGraphQLObjectType = <T>(\n name: string,\n schema: S.Schema<any, any, any>,\n additionalFields?: Record<string, AdditionalField<T, any, any, any, any>>\n): GraphQLObjectType => {\n const ast = schema.ast\n\n if (ast._tag === \"TypeLiteral\") {\n const fields: GraphQLFieldConfigMap<any, any> = {}\n\n // Add fields from schema\n for (const field of ast.propertySignatures) {\n const fieldName = String(field.name)\n const fieldSchema = S.make(field.type)\n let fieldType = toGraphQLType(fieldSchema)\n\n // Make non-optional fields non-null\n if (!field.isOptional) {\n fieldType = new GraphQLNonNull(fieldType)\n }\n\n fields[fieldName] = { type: fieldType }\n }\n\n // Add additional computed/relational fields\n if (additionalFields) {\n for (const [fieldName, fieldConfig] of Object.entries(additionalFields)) {\n fields[fieldName] = {\n type: fieldConfig.type,\n args: fieldConfig.args,\n description: fieldConfig.description,\n // Note: resolve will be set later when runtime is available\n resolve: fieldConfig.resolve as any,\n }\n }\n }\n\n return new GraphQLObjectType({\n name,\n fields,\n })\n }\n\n throw new Error(`Schema must be an object type to convert to GraphQLObjectType`)\n}\n\n/**\n * Convert an Effect Schema to GraphQL arguments\n */\nexport const toGraphQLArgs = (schema: S.Schema<any, any, any>): GraphQLFieldConfigArgumentMap => {\n const ast = schema.ast\n\n if (ast._tag === \"TypeLiteral\") {\n const args: GraphQLFieldConfigArgumentMap = {}\n\n for (const field of ast.propertySignatures) {\n const fieldName = String(field.name)\n const fieldSchema = S.make(field.type)\n let fieldType = toGraphQLInputType(fieldSchema)\n\n // Make non-optional fields non-null\n if (!field.isOptional) {\n fieldType = new GraphQLNonNull(fieldType)\n }\n\n args[fieldName] = { type: fieldType }\n }\n\n return args\n }\n\n throw new Error(`Schema must be an object type to convert to GraphQL arguments`)\n}\n","import * as S from \"effect/Schema\"\nimport * as AST from \"effect/SchemaAST\"\nimport {\n GraphQLObjectType,\n GraphQLInterfaceType,\n GraphQLEnumType,\n GraphQLUnionType,\n GraphQLInputObjectType,\n GraphQLList,\n GraphQLNonNull,\n GraphQLFieldConfigMap,\n GraphQLInputFieldConfigMap,\n} from \"graphql\"\nimport { toGraphQLType, toGraphQLArgs, toGraphQLInputType } from \"../schema-mapping\"\nimport type {\n TypeRegistration,\n InterfaceRegistration,\n EnumRegistration,\n UnionRegistration,\n InputTypeRegistration,\n} from \"./types\"\n\n/**\n * Extract type name from a schema if it has one.\n * Supports:\n * - S.TaggedStruct(\"Name\", {...}) - extracts from _tag literal\n * - S.TaggedClass()(\"Name\", {...}) - extracts from identifier annotation\n * - S.Class<T>(\"Name\")({...}) - extracts from identifier annotation\n */\nexport function getSchemaName(schema: S.Schema<any, any, any>): string | undefined {\n const ast = schema.ast\n\n // Handle Transformation (Schema.Class, TaggedClass)\n if (ast._tag === \"Transformation\") {\n const identifier = AST.getIdentifierAnnotation((ast as any).to)\n if (identifier._tag === \"Some\") {\n return identifier.value\n }\n }\n\n // Handle TypeLiteral (TaggedStruct)\n if (ast._tag === \"TypeLiteral\") {\n const tagProp = (ast as any).propertySignatures.find((p: any) => String(p.name) === \"_tag\")\n if (tagProp && tagProp.type._tag === \"Literal\" && typeof tagProp.type.literal === \"string\") {\n return tagProp.type.literal\n }\n }\n\n return undefined\n}\n\n/**\n * Context needed for type conversion operations\n */\nexport interface TypeConversionContext {\n types: Map<string, TypeRegistration>\n interfaces: Map<string, InterfaceRegistration>\n enums: Map<string, EnumRegistration>\n unions: Map<string, UnionRegistration>\n inputs: Map<string, InputTypeRegistration>\n typeRegistry: Map<string, GraphQLObjectType>\n interfaceRegistry: Map<string, GraphQLInterfaceType>\n enumRegistry: Map<string, GraphQLEnumType>\n unionRegistry: Map<string, GraphQLUnionType>\n inputRegistry: Map<string, GraphQLInputObjectType>\n // Reverse lookup caches for O(1) type resolution\n schemaToTypeName?: Map<S.Schema<any, any, any>, string>\n astToTypeName?: Map<AST.AST, string>\n schemaToInterfaceName?: Map<S.Schema<any, any, any>, string>\n astToInterfaceName?: Map<AST.AST, string>\n schemaToInputName?: Map<S.Schema<any, any, any>, string>\n astToInputName?: Map<AST.AST, string>\n // Cached sorted values for enum/union matching\n enumSortedValues?: Map<string, readonly string[]>\n unionSortedTypes?: Map<string, readonly string[]>\n // Reverse lookup: literal value -> enum name (for single literal O(1) lookup)\n literalToEnumName?: Map<string, string>\n}\n\n/**\n * Build reverse lookup maps from registration maps for O(1) type resolution\n */\nexport function buildReverseLookups(ctx: TypeConversionContext): void {\n // Build schema/AST -> type name lookups\n if (!ctx.schemaToTypeName) {\n ctx.schemaToTypeName = new Map()\n ctx.astToTypeName = new Map()\n for (const [typeName, typeReg] of ctx.types) {\n ctx.schemaToTypeName.set(typeReg.schema, typeName)\n ctx.astToTypeName.set(typeReg.schema.ast, typeName)\n }\n }\n\n // Build schema/AST -> interface name lookups\n if (!ctx.schemaToInterfaceName) {\n ctx.schemaToInterfaceName = new Map()\n ctx.astToInterfaceName = new Map()\n for (const [interfaceName, interfaceReg] of ctx.interfaces) {\n ctx.schemaToInterfaceName.set(interfaceReg.schema, interfaceName)\n ctx.astToInterfaceName.set(interfaceReg.schema.ast, interfaceName)\n }\n }\n\n // Build schema/AST -> input name lookups\n if (!ctx.schemaToInputName) {\n ctx.schemaToInputName = new Map()\n ctx.astToInputName = new Map()\n for (const [inputName, inputReg] of ctx.inputs) {\n ctx.schemaToInputName.set(inputReg.schema, inputName)\n ctx.astToInputName.set(inputReg.schema.ast, inputName)\n }\n }\n\n // Build cached sorted enum values and literal -> enum lookup\n if (!ctx.enumSortedValues) {\n ctx.enumSortedValues = new Map()\n ctx.literalToEnumName = new Map()\n for (const [enumName, enumReg] of ctx.enums) {\n ctx.enumSortedValues.set(enumName, [...enumReg.values].sort())\n // Build literal -> enum reverse lookup for O(1) single literal lookups\n for (const value of enumReg.values) {\n ctx.literalToEnumName.set(value, enumName)\n }\n }\n }\n\n // Build cached sorted union types\n if (!ctx.unionSortedTypes) {\n ctx.unionSortedTypes = new Map()\n for (const [unionName, unionReg] of ctx.unions) {\n ctx.unionSortedTypes.set(unionName, [...unionReg.types].sort())\n }\n }\n}\n\n// GraphQLNonNull wrapper cache for memoization\nconst nonNullCache = new WeakMap<any, GraphQLNonNull<any>>()\n\n/**\n * Get or create a GraphQLNonNull wrapper (memoized)\n */\nexport function getNonNull<T extends import(\"graphql\").GraphQLNullableType>(\n type: T\n): GraphQLNonNull<T> {\n let cached = nonNullCache.get(type)\n if (!cached) {\n cached = new GraphQLNonNull(type)\n nonNullCache.set(type, cached)\n }\n return cached\n}\n\n/**\n * Convert schema to GraphQL type, checking registry first for registered types\n */\nexport function toGraphQLTypeWithRegistry(\n schema: S.Schema<any, any, any>,\n ctx: TypeConversionContext\n): any {\n // Ensure reverse lookup maps are built\n buildReverseLookups(ctx)\n\n const ast = schema.ast\n\n // Check registered object types first\n const registeredType = findRegisteredType(schema, ast, ctx)\n if (registeredType) return registeredType\n\n // Check registered interfaces\n const registeredInterface = findRegisteredInterface(schema, ast, ctx)\n if (registeredInterface) return registeredInterface\n\n // Handle transformations (like S.Array, S.optional, etc)\n if (ast._tag === \"Transformation\") {\n return handleTransformationAST(ast, ctx)\n }\n\n // Handle unions (enum literals or object type unions)\n if (ast._tag === \"Union\") {\n return handleUnionAST(ast, ctx)\n }\n\n // Check single literal for enum match\n if (ast._tag === \"Literal\") {\n const enumType = findEnumForLiteral(ast, ctx)\n if (enumType) return enumType\n }\n\n // Handle tuple types (readonly arrays)\n if (ast._tag === \"TupleType\") {\n return handleTupleTypeAST(ast, ctx)\n }\n\n // Handle Suspend (recursive/self-referential schemas)\n if (ast._tag === \"Suspend\") {\n const innerAst = (ast as any).f()\n return toGraphQLTypeWithRegistry(S.make(innerAst), ctx)\n }\n\n // Fall back to default conversion\n return toGraphQLType(schema)\n}\n\n/**\n * Find a registered object type matching this schema (O(1) with reverse lookup)\n */\nfunction findRegisteredType(\n schema: S.Schema<any, any, any>,\n ast: AST.AST,\n ctx: TypeConversionContext\n): GraphQLObjectType | undefined {\n // Use reverse lookup maps for O(1) lookup\n const typeName = ctx.schemaToTypeName?.get(schema) ?? ctx.astToTypeName?.get(ast)\n if (typeName) {\n return ctx.typeRegistry.get(typeName)\n }\n return undefined\n}\n\n/**\n * Find a registered interface matching this schema (O(1) with reverse lookup)\n */\nfunction findRegisteredInterface(\n schema: S.Schema<any, any, any>,\n ast: AST.AST,\n ctx: TypeConversionContext\n): GraphQLInterfaceType | undefined {\n // Use reverse lookup maps for O(1) lookup\n const interfaceName = ctx.schemaToInterfaceName?.get(schema) ?? ctx.astToInterfaceName?.get(ast)\n if (interfaceName) {\n return ctx.interfaceRegistry.get(interfaceName)\n }\n return undefined\n}\n\n/**\n * Handle Transformation AST nodes (arrays, optional, Schema.Class, etc.)\n */\nfunction handleTransformationAST(ast: any, ctx: TypeConversionContext): any {\n const toAst = ast.to\n\n // Check if it's an array (readonly array on the to side)\n if (toAst._tag === \"TupleType\") {\n if (toAst.rest && toAst.rest.length > 0) {\n const elementSchema = S.make(toAst.rest[0].type)\n const elementType = toGraphQLTypeWithRegistry(elementSchema, ctx)\n return new GraphQLList(elementType)\n } else if (toAst.elements.length > 0) {\n const elementSchema = S.make(toAst.elements[0].type)\n const elementType = toGraphQLTypeWithRegistry(elementSchema, ctx)\n return new GraphQLList(elementType)\n }\n }\n\n // Other transformations - recurse on the \"to\" side\n return toGraphQLTypeWithRegistry(S.make(ast.to), ctx)\n}\n\n/**\n * Handle Union AST nodes (literal enums or object type unions)\n */\nfunction handleUnionAST(ast: any, ctx: TypeConversionContext): any {\n const allLiterals = ast.types.every((t: any) => t._tag === \"Literal\")\n\n if (allLiterals) {\n // This might be an enum\n const enumType = findEnumForLiteralUnion(ast.types, ctx)\n if (enumType) return enumType\n } else {\n // This is a Union of object types - check if it matches a registered union\n const unionType = findRegisteredUnion(ast.types, ctx)\n if (unionType) return unionType\n }\n\n // Fallback: use first type\n if (ast.types.length > 0) {\n return toGraphQLTypeWithRegistry(S.make(ast.types[0]), ctx)\n }\n\n return toGraphQLType(S.make(ast))\n}\n\n/**\n * Find a registered enum matching a union of literals (uses cached sorted values)\n */\nfunction findEnumForLiteralUnion(\n types: any[],\n ctx: TypeConversionContext\n): GraphQLEnumType | undefined {\n const literalValues = types.map((t: any) => String(t.literal)).sort()\n\n for (const [enumName] of ctx.enums) {\n // Use cached sorted values instead of sorting on every comparison\n const enumValues = ctx.enumSortedValues?.get(enumName)\n if (\n enumValues &&\n literalValues.length === enumValues.length &&\n literalValues.every((v: string, i: number) => v === enumValues[i])\n ) {\n return ctx.enumRegistry.get(enumName)\n }\n }\n return undefined\n}\n\n/**\n * Find a registered union matching an object type union (uses cached sorted types)\n */\nfunction findRegisteredUnion(\n types: any[],\n ctx: TypeConversionContext\n): GraphQLUnionType | undefined {\n // Collect _tag values from each union member\n const memberTags: string[] = []\n for (const memberAst of types) {\n if (memberAst._tag === \"TypeLiteral\") {\n const tagProp = memberAst.propertySignatures.find((p: any) => String(p.name) === \"_tag\")\n if (tagProp && tagProp.type._tag === \"Literal\") {\n memberTags.push(String(tagProp.type.literal))\n }\n }\n }\n\n // Check if any registered union has matching types\n if (memberTags.length === types.length) {\n const sortedTags = memberTags.sort()\n for (const [unionName] of ctx.unions) {\n // Use cached sorted types instead of sorting on every comparison\n const unionTypes = ctx.unionSortedTypes?.get(unionName)\n if (\n unionTypes &&\n sortedTags.length === unionTypes.length &&\n sortedTags.every((tag, i) => tag === unionTypes[i])\n ) {\n return ctx.unionRegistry.get(unionName)\n }\n }\n }\n return undefined\n}\n\n/**\n * Find a registered enum containing a single literal value (O(1) with reverse lookup)\n */\nfunction findEnumForLiteral(ast: any, ctx: TypeConversionContext): GraphQLEnumType | undefined {\n const literalValue = String(ast.literal)\n // Use reverse lookup map for O(1) lookup instead of O(N×M) iteration\n const enumName = ctx.literalToEnumName?.get(literalValue)\n if (enumName) {\n return ctx.enumRegistry.get(enumName)\n }\n return undefined\n}\n\n/**\n * Handle TupleType AST nodes (arrays)\n */\nfunction handleTupleTypeAST(ast: any, ctx: TypeConversionContext): any {\n if (ast.rest && ast.rest.length > 0) {\n const elementSchema = S.make(ast.rest[0].type)\n const elementType = toGraphQLTypeWithRegistry(elementSchema, ctx)\n return new GraphQLList(elementType)\n } else if (ast.elements && ast.elements.length > 0) {\n const elementSchema = S.make(ast.elements[0].type)\n const elementType = toGraphQLTypeWithRegistry(elementSchema, ctx)\n return new GraphQLList(elementType)\n }\n return toGraphQLType(S.make(ast))\n}\n\n/**\n * Convert a schema to GraphQL fields\n */\nexport function schemaToFields(\n schema: S.Schema<any, any, any>,\n ctx: TypeConversionContext\n): GraphQLFieldConfigMap<any, any> {\n let ast = schema.ast\n\n // Handle Transformation (Schema.Class, TaggedClass)\n if (ast._tag === \"Transformation\") {\n ast = (ast as any).to\n }\n\n // Handle Declaration (Schema.Class wraps TypeLiteral in Declaration)\n if (ast._tag === \"Declaration\") {\n const typeParams = (ast as any).typeParameters\n if (typeParams && typeParams.length > 0 && typeParams[0]._tag === \"TypeLiteral\") {\n ast = typeParams[0]\n }\n }\n\n if (ast._tag === \"TypeLiteral\") {\n const fields: GraphQLFieldConfigMap<any, any> = {}\n\n for (const field of (ast as any).propertySignatures) {\n const fieldName = String(field.name)\n const fieldSchema = S.make(field.type)\n let fieldType = toGraphQLTypeWithRegistry(fieldSchema, ctx)\n\n // Make non-optional fields non-null (memoized)\n if (!field.isOptional) {\n fieldType = getNonNull(fieldType)\n }\n\n fields[fieldName] = { type: fieldType }\n }\n\n return fields\n }\n\n return {}\n}\n\n/**\n * Convert a schema to GraphQL input fields\n */\nexport function schemaToInputFields(\n schema: S.Schema<any, any, any>,\n enumRegistry: Map<string, GraphQLEnumType>,\n inputRegistry: Map<string, GraphQLInputObjectType>,\n inputs: Map<string, InputTypeRegistration>,\n enums: Map<string, EnumRegistration>,\n cache?: InputTypeLookupCache\n): GraphQLInputFieldConfigMap {\n const ast = schema.ast\n\n if (ast._tag === \"TypeLiteral\") {\n const fields: GraphQLInputFieldConfigMap = {}\n\n for (const field of ast.propertySignatures) {\n const fieldName = String(field.name)\n const fieldSchema = S.make(field.type)\n let fieldType = toGraphQLInputTypeWithRegistry(\n fieldSchema,\n enumRegistry,\n inputRegistry,\n inputs,\n enums,\n cache\n )\n\n // Make non-optional fields non-null (memoized)\n if (!field.isOptional) {\n fieldType = getNonNull(fieldType)\n }\n\n fields[fieldName] = { type: fieldType }\n }\n\n return fields\n }\n\n return {}\n}\n\n/**\n * Optional cache for input type lookups to enable O(1) resolution\n */\nexport interface InputTypeLookupCache {\n schemaToInputName?: Map<S.Schema<any, any, any>, string>\n astToInputName?: Map<AST.AST, string>\n literalToEnumName?: Map<string, string>\n enumSortedValues?: Map<string, readonly string[]>\n}\n\n/**\n * Build lookup caches for input type resolution\n */\nexport function buildInputTypeLookupCache(\n inputs: Map<string, InputTypeRegistration>,\n enums: Map<string, EnumRegistration>\n): InputTypeLookupCache {\n const cache: InputTypeLookupCache = {\n schemaToInputName: new Map(),\n astToInputName: new Map(),\n literalToEnumName: new Map(),\n enumSortedValues: new Map(),\n }\n\n // Build input type reverse lookups\n for (const [inputName, inputReg] of inputs) {\n cache.schemaToInputName!.set(inputReg.schema, inputName)\n cache.astToInputName!.set(inputReg.schema.ast, inputName)\n }\n\n // Build enum lookups\n for (const [enumName, enumReg] of enums) {\n cache.enumSortedValues!.set(enumName, [...enumReg.values].sort())\n for (const value of enumReg.values) {\n cache.literalToEnumName!.set(value, enumName)\n }\n }\n\n return cache\n}\n\n/**\n * Convert a schema to GraphQL input type, checking enum and input registries.\n * Uses O(1) reverse lookups when cache is provided.\n */\nexport function toGraphQLInputTypeWithRegistry(\n schema: S.Schema<any, any, any>,\n enumRegistry: Map<string, GraphQLEnumType>,\n inputRegistry: Map<string, GraphQLInputObjectType>,\n inputs: Map<string, InputTypeRegistration>,\n enums: Map<string, EnumRegistration>,\n cache?: InputTypeLookupCache\n): any {\n const ast = schema.ast\n\n // Handle transformations (like S.optional wrapping)\n if (ast._tag === \"Transformation\") {\n const toAst = (ast as any).to\n return toGraphQLInputTypeWithRegistry(\n S.make(toAst),\n enumRegistry,\n inputRegistry,\n inputs,\n enums,\n cache\n )\n }\n\n // Check if this schema matches a registered input type (O(1) with cache)\n if (cache?.schemaToInputName || cache?.astToInputName) {\n const inputName = cache.schemaToInputName?.get(schema) ?? cache.astToInputName?.get(ast)\n if (inputName) {\n const result = inputRegistry.get(inputName)\n if (result) return result\n }\n } else {\n // Fallback to linear scan if no cache\n for (const [inputName, inputReg] of inputs) {\n if (inputReg.schema.ast === ast || inputReg.schema === schema) {\n const result = inputRegistry.get(inputName)\n if (result) return result\n }\n }\n }\n\n // Check if this schema matches a registered enum\n if (ast._tag === \"Union\") {\n const unionAst = ast as any\n\n // Handle S.optional which creates Union(LiteralUnion, UndefinedKeyword)\n const nonUndefinedTypes = unionAst.types.filter((t: any) => t._tag !== \"UndefinedKeyword\")\n if (nonUndefinedTypes.length === 1 && nonUndefinedTypes[0]._tag === \"Union\") {\n return toGraphQLInputTypeWithRegistry(\n S.make(nonUndefinedTypes[0]),\n enumRegistry,\n inputRegistry,\n inputs,\n enums,\n cache\n )\n }\n\n // Check for nested input type inside optional\n if (nonUndefinedTypes.length === 1 && nonUndefinedTypes[0]._tag === \"TypeLiteral\") {\n return toGraphQLInputTypeWithRegistry(\n S.make(nonUndefinedTypes[0]),\n enumRegistry,\n inputRegistry,\n inputs,\n enums,\n cache\n )\n }\n\n const allLiterals = unionAst.types.every((t: any) => t._tag === \"Literal\")\n\n if (allLiterals) {\n const literalValues = unionAst.types.map((t: any) => String(t.literal)).sort()\n\n // Use cached sorted values if available\n for (const [enumName] of enums) {\n const enumValues =\n cache?.enumSortedValues?.get(enumName) ?? [...enums.get(enumName)!.values].sort()\n if (\n literalValues.length === enumValues.length &&\n literalValues.every((v: string, i: number) => v === enumValues[i])\n ) {\n const result = enumRegistry.get(enumName)\n if (result) return result\n }\n }\n }\n }\n\n // Check single literal (O(1) with cache)\n if (ast._tag === \"Literal\") {\n const literalValue = String((ast as any).literal)\n if (cache?.literalToEnumName) {\n const enumName = cache.literalToEnumName.get(literalValue)\n if (enumName) {\n const result = enumRegistry.get(enumName)\n if (result) return result\n }\n } else {\n // Fallback to linear scan if no cache\n for (const [enumName, enumReg] of enums) {\n if (enumReg.values.includes(literalValue)) {\n const result = enumRegistry.get(enumName)\n if (result) return result\n }\n }\n }\n }\n\n // Handle Suspend (recursive/self-referential schemas)\n if (ast._tag === \"Suspend\") {\n const innerAst = (ast as any).f()\n return toGraphQLInputTypeWithRegistry(\n S.make(innerAst),\n enumRegistry,\n inputRegistry,\n inputs,\n enums,\n cache\n )\n }\n\n // Fall back to default toGraphQLInputType\n return toGraphQLInputType(schema)\n}\n\n/**\n * Convert a schema to GraphQL arguments with registry support.\n * Uses O(1) reverse lookups when cache is provided.\n */\nexport function toGraphQLArgsWithRegistry(\n schema: S.Schema<any, any, any>,\n enumRegistry: Map<string, GraphQLEnumType>,\n inputRegistry: Map<string, GraphQLInputObjectType>,\n inputs: Map<string, InputTypeRegistration>,\n enums: Map<string, EnumRegistration>,\n cache?: InputTypeLookupCache\n): any {\n const ast = schema.ast\n\n if (ast._tag === \"TypeLiteral\") {\n const args: Record<string, { type: any }> = {}\n\n for (const field of (ast as any).propertySignatures) {\n const fieldName = String(field.name)\n const fieldSchema = S.make(field.type)\n let fieldType = toGraphQLInputTypeWithRegistry(\n fieldSchema,\n enumRegistry,\n inputRegistry,\n inputs,\n enums,\n cache\n )\n\n // Make non-optional fields non-null (memoized)\n if (!field.isOptional) {\n fieldType = getNonNull(fieldType)\n }\n\n args[fieldName] = { type: fieldType }\n }\n\n return args\n }\n\n // Fall back to default toGraphQLArgs\n return toGraphQLArgs(schema)\n}\n","import { Effect, Runtime, Stream, Queue, Fiber, Option } from \"effect\"\nimport { GraphQLFieldConfig, GraphQLResolveInfo } from \"graphql\"\nimport type {\n FieldRegistration,\n SubscriptionFieldRegistration,\n ObjectFieldRegistration,\n DirectiveRegistration,\n MiddlewareRegistration,\n MiddlewareContext,\n GraphQLEffectContext,\n} from \"./types\"\nimport {\n toGraphQLTypeWithRegistry,\n toGraphQLArgsWithRegistry,\n type TypeConversionContext,\n type InputTypeLookupCache,\n} from \"./type-registry\"\n\n/**\n * Context needed for building fields\n */\nexport interface FieldBuilderContext extends TypeConversionContext {\n directiveRegistrations: Map<string, DirectiveRegistration>\n middlewares: readonly MiddlewareRegistration[]\n inputTypeLookupCache?: InputTypeLookupCache\n}\n\n/**\n * Apply directives to an Effect by wrapping it with directive transformers\n */\nfunction applyDirectives<A, E, R>(\n effect: Effect.Effect<A, E, R>,\n directives: readonly { name: string; args?: Record<string, unknown> }[] | undefined,\n directiveRegistrations: Map<string, DirectiveRegistration>\n): Effect.Effect<A, E, any> {\n if (!directives) return effect\n\n let wrapped = effect\n for (const directiveApp of directives) {\n const directiveReg = directiveRegistrations.get(directiveApp.name)\n if (directiveReg?.apply) {\n wrapped = directiveReg.apply(directiveApp.args ?? {})(wrapped)\n }\n }\n return wrapped\n}\n\n/**\n * Apply middleware to an Effect by wrapping it with middleware transformers.\n *\n * Middleware executes in \"onion\" order - first registered middleware is the\n * outermost layer, meaning it runs first before and last after the resolver.\n *\n * Each middleware can optionally specify a `match` predicate to filter which\n * fields it applies to.\n */\nfunction applyMiddleware<A, E, R>(\n effect: Effect.Effect<A, E, R>,\n context: MiddlewareContext,\n middlewares: readonly MiddlewareRegistration[]\n): Effect.Effect<A, E, any> {\n if (middlewares.length === 0) return effect\n\n let wrapped = effect\n\n // Apply in reverse order so first registered is outermost\n // (executes first before, last after)\n for (let i = middlewares.length - 1; i >= 0; i--) {\n const middleware = middlewares[i]\n\n // Check if middleware should apply to this field\n if (middleware.match && !middleware.match(context.info)) {\n continue\n }\n\n wrapped = middleware.apply(wrapped, context)\n }\n\n return wrapped\n}\n\n/**\n * Build a GraphQL field config from a field registration (for queries/mutations)\n */\nexport function buildField(\n config: FieldRegistration,\n ctx: FieldBuilderContext\n): GraphQLFieldConfig<any, any> {\n const fieldConfig: GraphQLFieldConfig<any, any> = {\n type: toGraphQLTypeWithRegistry(config.type, ctx),\n resolve: async (\n _parent,\n args,\n context: GraphQLEffectContext<any>,\n info: GraphQLResolveInfo\n ) => {\n // Apply directives first (per-field, explicit)\n let effect = applyDirectives(\n config.resolve(args),\n config.directives,\n ctx.directiveRegistrations\n )\n\n // Apply middleware (global/pattern-matched)\n const middlewareContext: MiddlewareContext = { parent: _parent, args, info }\n effect = applyMiddleware(effect, middlewareContext, ctx.middlewares)\n\n return await Runtime.runPromise(context.runtime)(effect)\n },\n }\n\n if (config.args) {\n fieldConfig.args = toGraphQLArgsWithRegistry(\n config.args,\n ctx.enumRegistry,\n ctx.inputRegistry,\n ctx.inputs,\n ctx.enums,\n ctx.inputTypeLookupCache\n )\n }\n if (config.description) {\n fieldConfig.description = config.description\n }\n\n return fieldConfig\n}\n\n/**\n * Build a GraphQL field config for an object field (has parent param)\n */\nexport function buildObjectField(\n config: ObjectFieldRegistration,\n ctx: FieldBuilderContext\n): GraphQLFieldConfig<any, any> {\n const fieldConfig: GraphQLFieldConfig<any, any> = {\n type: toGraphQLTypeWithRegistry(config.type, ctx),\n resolve: async (parent, args, context: GraphQLEffectContext<any>, info: GraphQLResolveInfo) => {\n // Apply directives first (per-field, explicit)\n let effect = applyDirectives(\n config.resolve(parent, args),\n config.directives,\n ctx.directiveRegistrations\n )\n\n // Apply middleware (global/pattern-matched)\n const middlewareContext: MiddlewareContext = { parent, args, info }\n effect = applyMiddleware(effect, middlewareContext, ctx.middlewares)\n\n return await Runtime.runPromise(context.runtime)(effect)\n },\n }\n\n if (config.args) {\n fieldConfig.args = toGraphQLArgsWithRegistry(\n config.args,\n ctx.enumRegistry,\n ctx.inputRegistry,\n ctx.inputs,\n ctx.enums,\n ctx.inputTypeLookupCache\n )\n }\n if (config.description) {\n fieldConfig.description = config.description\n }\n\n return fieldConfig\n}\n\n/**\n * Build a GraphQL subscription field config.\n *\n * Subscriptions in GraphQL have a special structure:\n * - `subscribe` returns an AsyncIterator that yields the \"root value\" for each event\n * - `resolve` transforms each yielded value into the final result\n *\n * We convert Effect's Stream to an AsyncIterator using a Queue-based approach.\n */\nexport function buildSubscriptionField(\n config: SubscriptionFieldRegistration,\n ctx: FieldBuilderContext\n): GraphQLFieldConfig<any, any> {\n const fieldConfig: GraphQLFieldConfig<any, any> = {\n type: toGraphQLTypeWithRegistry(config.type, ctx),\n\n // The subscribe function returns an AsyncIterator\n subscribe: async (\n _parent,\n args,\n context: GraphQLEffectContext<any>,\n info: GraphQLResolveInfo\n ) => {\n // Get the Stream from the subscribe Effect\n let subscribeEffect = config.subscribe(args)\n\n // Apply directives to the subscribe effect\n subscribeEffect = applyDirectives(\n subscribeEffect,\n config.directives,\n ctx.directiveRegistrations\n ) as any\n\n // Apply middleware to the subscribe effect\n const middlewareContext: MiddlewareContext = { parent: _parent, args, info }\n subscribeEffect = applyMiddleware(subscribeEffect, middlewareContext, ctx.middlewares) as any\n\n const stream = await Runtime.runPromise(context.runtime)(subscribeEffect)\n\n // Convert Stream to AsyncIterator using queue-based approach\n return streamToAsyncIterator(stream, context.runtime)\n },\n\n // The resolve function transforms each yielded value\n // If no custom resolve is provided, return the payload directly\n resolve: config.resolve\n ? async (value, args, context: GraphQLEffectContext<any>, info: GraphQLResolveInfo) => {\n let effect = config.resolve!(value, args)\n\n // Apply middleware to the resolve effect\n const middlewareContext: MiddlewareContext = { parent: value, args, info }\n effect = applyMiddleware(effect, middlewareContext, ctx.middlewares)\n\n return await Runtime.runPromise(context.runtime)(effect)\n }\n : (value) => value,\n }\n\n if (config.args) {\n fieldConfig.args = toGraphQLArgsWithRegistry(\n config.args,\n ctx.enumRegistry,\n ctx.inputRegistry,\n ctx.inputs,\n ctx.enums,\n ctx.inputTypeLookupCache\n )\n }\n if (config.description) {\n fieldConfig.description = config.description\n }\n\n return fieldConfig\n}\n\n/**\n * Convert an Effect Stream to an AsyncIterator using a Queue-based approach.\n *\n * This is needed because Stream.toAsyncIterable() requires R = never,\n * but our streams may have service requirements that need to be provided\n * by the runtime context.\n */\nfunction streamToAsyncIterator<A, E, R>(\n stream: Stream.Stream<A, E, R>,\n runtime: Runtime.Runtime<R>\n): AsyncIterator<A> {\n // Create the queue synchronously via runSync since unbounded queue creation is synchronous\n let queue: Queue.Queue<Option.Option<A>>\n let fiber: Fiber.RuntimeFiber<void, E>\n let initialized = false\n let done = false\n\n const initialize = async () => {\n if (initialized) return\n initialized = true\n\n queue = await Runtime.runPromise(runtime)(Queue.unbounded<Option.Option<A>>())\n\n // Fork a fiber to run the stream and push values to the queue\n fiber = Runtime.runFork(runtime)(\n Effect.ensuring(\n Stream.runForEach(stream, (value) => Queue.offer(queue, Option.some(value))),\n // Signal completion by pushing None\n Queue.offer(queue, Option.none())\n )\n )\n }\n\n return {\n [Symbol.asyncIterator]() {\n return this\n },\n\n async next(): Promise<IteratorResult<A>> {\n await initialize()\n\n if (done) {\n return { done: true, value: undefined }\n }\n\n try {\n const optionValue = await Runtime.runPromise(runtime)(Queue.take(queue))\n\n if (Option.isNone(optionValue)) {\n done = true\n return { done: true, value: undefined }\n }\n\n return { done: false, value: optionValue.value }\n } catch (error) {\n done = true\n throw error\n }\n },\n\n async return(): Promise<IteratorResult<A>> {\n // Cleanup - interrupt the fiber and shutdown the queue\n done = true\n if (initialized) {\n try {\n await Runtime.runPromise(runtime)(\n Fiber.interrupt(fiber as unknown as Fiber.Fiber<any, any>)\n )\n await Runtime.runPromise(runtime)(Queue.shutdown(queue))\n } catch {\n // Ignore cleanup errors\n }\n }\n return { done: true, value: undefined }\n },\n } as AsyncIterator<A>\n}\n","import { Effect, Pipeable } from \"effect\"\nimport * as S from \"effect/Schema\"\nimport {\n GraphQLSchema,\n GraphQLObjectType,\n GraphQLInterfaceType,\n GraphQLEnumType,\n GraphQLUnionType,\n GraphQLInputObjectType,\n GraphQLFieldConfigMap,\n GraphQLDirective,\n DirectiveLocation,\n} from \"graphql\"\nimport type {\n FieldRegistration,\n TypeRegistration,\n InterfaceRegistration,\n EnumRegistration,\n UnionRegistration,\n InputTypeRegistration,\n DirectiveRegistration,\n DirectiveApplication,\n SubscriptionFieldRegistration,\n ObjectFieldRegistration,\n MiddlewareRegistration,\n MiddlewareContext,\n CacheHint,\n} from \"./types\"\nimport type { GraphQLExtension, ExecutionArgs } from \"../extensions\"\nimport type {\n GraphQLResolveInfo,\n DocumentNode,\n ExecutionResult,\n GraphQLError as GQLError,\n} from \"graphql\"\nimport type { FieldComplexity, FieldComplexityMap } from \"../server/complexity\"\nimport type { CacheHintMap } from \"../server/cache-control\"\nimport {\n getSchemaName,\n schemaToFields,\n schemaToInputFields,\n toGraphQLArgsWithRegistry,\n buildReverseLookups,\n buildInputTypeLookupCache,\n type TypeConversionContext,\n} from \"./type-registry\"\nimport {\n buildField,\n buildObjectField,\n buildSubscriptionField,\n type FieldBuilderContext,\n} from \"./field-builders\"\n\n/**\n * Internal state for the builder\n */\ninterface BuilderState {\n types: Map<string, TypeRegistration>\n interfaces: Map<string, InterfaceRegistration>\n enums: Map<string, EnumRegistration>\n unions: Map<string, UnionRegistration>\n inputs: Map<string, InputTypeRegistration>\n directives: Map<string, DirectiveRegistration>\n middlewares: readonly MiddlewareRegistration[] // Array to preserve registration order\n extensions: readonly GraphQLExtension<any>[] // Array to preserve registration order\n queries: Map<string, FieldRegistration>\n mutations: Map<string, FieldRegistration>\n subscriptions: Map<string, SubscriptionFieldRegistration>\n objectFields: Map<string, Map<string, ObjectFieldRegistration>>\n}\n\n/**\n * Create a new state with one map updated\n */\nfunction updateState<K extends keyof BuilderState>(\n state: BuilderState,\n key: K,\n value: BuilderState[K]\n): BuilderState {\n return { ...state, [key]: value }\n}\n\n/**\n * GraphQL Schema Builder with type-safe service requirements (Layer-per-Request Pattern)\n *\n * The type parameter R accumulates all service requirements from resolvers.\n * Unlike the runtime-in-context approach, this pattern builds the schema without\n * executing any Effects. At request time, you provide a Layer with all required services.\n */\nexport class GraphQLSchemaBuilder<R = never> implements Pipeable.Pipeable {\n private constructor(private readonly state: BuilderState) {}\n\n /**\n * Pipeable interface implementation - enables fluent .pipe() syntax\n */\n pipe<A>(this: A): A\n pipe<A, B>(this: A, ab: (a: A) => B): B\n pipe<A, B, C>(this: A, ab: (a: A) => B, bc: (b: B) => C): C\n pipe<A, B, C, D>(this: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D): D\n pipe<A, B, C, D, E>(\n this: A,\n ab: (a: A) => B,\n bc: (b: B) => C,\n cd: (c: C) => D,\n de: (d: D) => E\n ): E\n pipe<A, B, C, D, E, F>(\n this: A,\n ab: (a: A) => B,\n bc: (b: B) => C,\n cd: (c: C) => D,\n de: (d: D) => E,\n ef: (e: E) => F\n ): F\n pipe<A, B, C, D, E, F, G>(\n this: A,\n ab: (a: A) => B,\n bc: (b: B) => C,\n cd: (c: C) => D,\n de: (d: D) => E,\n ef: (e: E) => F,\n fg: (f: F) => G\n ): G\n pipe<A, B, C, D, E, F, G, H>(\n this: A,\n ab: (a: A) => B,\n bc: (b: B) => C,\n cd: (c: C) => D,\n de: (d: D) => E,\n ef: (e: E) => F,\n fg: (f: F) => G,\n gh: (g: G) => H\n ): H\n pipe<A, B, C, D, E, F, G, H, I>(\n this: A,\n ab: (a: A) => B,\n bc: (b: B) => C,\n cd: (c: C) => D,\n de: (d: D) => E,\n ef: (e: E) => F,\n fg: (f: F) => G,\n gh: (g: G) => H,\n hi: (h: H) => I\n ): I\n pipe() {\n return Pipeable.pipeArguments(this, arguments)\n }\n\n /**\n * Create an empty schema builder\n */\n static readonly empty = new GraphQLSchemaBuilder<never>({\n types: new Map(),\n interfaces: new Map(),\n enums: new Map(),\n unions: new Map(),\n inputs: new Map(),\n directives: new Map(),\n middlewares: [],\n extensions: [],\n queries: new Map(),\n mutations: new Map(),\n subscriptions: new Map(),\n objectFields: new Map(),\n })\n\n /**\n * Create a new builder with updated state\n */\n private with(newState: BuilderState): GraphQLSchemaBuilder<any> {\n return new GraphQLSchemaBuilder(newState)\n }\n\n // ============================================================================\n // Registration Methods\n // ============================================================================\n\n /**\n * Add a query field\n */\n query<A, E, R2, Args = void>(\n name: string,\n config: {\n type: S.Schema<A, any, any>\n args?: S.Schema<Args, any, any>\n description?: string\n directives?: readonly DirectiveApplication[]\n /**\n * Complexity cost of this field for query complexity limiting.\n * Can be a static number or a function that receives the resolved arguments.\n */\n complexity?: FieldComplexity\n /**\n * Cache control hint for this field.\n * Used to compute HTTP Cache-Control headers for the response.\n */\n cacheControl?: CacheHint\n resolve: (args: Args) => Effect.Effect<A, E, R2>\n }\n ): GraphQLSchemaBuilder<R | R2> {\n const newQueries = new Map(this.state.queries)\n newQueries.set(name, config)\n return this.with(updateState(this.state, \"queries\", newQueries))\n }\n\n /**\n * Add a mutation field\n */\n mutation<A, E, R2, Args = void>(\n name: string,\n config: {\n type: S.Schema<A, any, any>\n args?: S.Schema<Args, any, any>\n description?: string\n directives?: readonly DirectiveApplication[]\n /**\n * Complexity cost of this field for query complexity limiting.\n * Can be a static number or a function that receives the resolved arguments.\n */\n complexity?: FieldComplexity\n resolve: (args: Args) => Effect.Effect<A, E, R2>\n }\n ): GraphQLSchemaBuilder<R | R2> {\n const newMutations = new Map(this.state.mutations)\n newMutations.set(name, config)\n return this.with(updateState(this.state, \"mutations\", newMutations))\n }\n\n /**\n * Add a subscription field\n *\n * Subscriptions return a Stream that yields values over time.\n * The subscribe function returns an Effect that produces a Stream.\n *\n * @example\n * ```typescript\n * builder.subscription(\"userCreated\", {\n * type: User,\n * subscribe: Effect.gen(function*() {\n * const pubsub = yield* PubSubService\n * return pubsub.subscribe(\"USER_CREATED\")\n * }),\n * })\n * ```\n */\n subscription<A, E, R2, Args = void>(\n name: string,\n config: {\n type: S.Schema<A, any, any>\n args?: S.Schema<Args, any, any>\n description?: string\n directives?: readonly DirectiveApplication[]\n /**\n * Complexity cost of this subscription for query complexity limiting.\n * Can be a static number or a function that receives the resolved arguments.\n */\n complexity?: FieldComplexity\n /**\n * Cache control hint for this subscription.\n * Note: Subscriptions are typically not cached, but this can be used for initial response hints.\n */\n cacheControl?: CacheHint\n subscribe: (args: Args) => Effect.Effect<import(\"effect\").Stream.Stream<A, E, R2>, E, R2>\n resolve?: (value: A, args: Args) => Effect.Effect<A, E, R2>\n }\n ): GraphQLSchemaBuilder<R | R2> {\n const newSubscriptions = new Map(this.state.subscriptions)\n newSubscriptions.set(name, config)\n return this.with(updateState(this.state, \"subscriptions\", newSubscriptions))\n }\n\n /**\n * Register an object type from a schema\n */\n objectType<A, R2 = never>(config: {\n name?: string\n schema: S.Schema<A, any, any>\n description?: string\n implements?: readonly string[]\n directives?: readonly DirectiveApplication[]\n /**\n * Default cache control hint for all fields returning this type.\n * Can be overridden by field-level cacheControl.\n */\n cacheControl?: CacheHint\n fields?: Record<\n string,\n {\n type: S.Schema<any, any, any>\n args?: S.Schema<any, any, any>\n description?: string\n directives?: readonly DirectiveApplication[]\n /**\n * Complexity cost of this field for query complexity limiting.\n */\n complexity?: FieldComplexity\n /**\n * Cache control hint for this field.\n */\n cacheControl?: CacheHint\n resolve: (parent: A, args: any) => Effect.Effect<any, any, any>\n }\n >\n }): GraphQLSchemaBuilder<R | R2> {\n const {\n schema,\n description,\n implements: implementsInterfaces,\n directives,\n cacheControl,\n fields,\n } = config\n const name = config.name ?? getSchemaName(schema)\n if (!name) {\n throw new Error(\n \"objectType requires a name. Either provide one explicitly or use a TaggedStruct/TaggedClass/Schema.Class\"\n )\n }\n\n const newTypes = new Map(this.state.types)\n newTypes.set(name, {\n name,\n schema,\n description,\n implements: implementsInterfaces,\n directives,\n cacheControl,\n })\n\n let newObjectFields = this.state.objectFields\n if (fields) {\n newObjectFields = new Map(this.state.objectFields)\n const typeFields = new Map<string, ObjectFieldRegistration>()\n for (const [fieldName, fieldConfig] of Object.entries(fields)) {\n typeFields.set(fieldName, fieldConfig as ObjectFieldRegistration)\n }\n newObjectFields.set(name, typeFields)\n }\n\n return this.with({\n ...this.state,\n types: newTypes,\n objectFields: newObjectFields,\n })\n }\n\n /**\n * Register an interface type from a schema\n */\n interfaceType(config: {\n name?: string\n schema: S.Schema<any, any, any>\n resolveType?: (value: any) => string\n directives?: readonly DirectiveApplication[]\n }): GraphQLSchemaBuilder<R> {\n const { schema, resolveType, directives } = config\n const name = config.name ?? getSchemaName(schema)\n if (!name) {\n throw new Error(\n \"interfaceType requires a name. Either provide one explicitly or use a TaggedStruct/TaggedClass/Schema.Class\"\n )\n }\n\n const newInterfaces = new Map(this.state.interfaces)\n newInterfaces.set(name, {\n name,\n schema,\n resolveType: resolveType ?? ((value: any) => value._tag),\n directives,\n })\n\n return this.with(updateState(this.state, \"interfaces\", newInterfaces))\n }\n\n /**\n * Register an enum type\n */\n enumType(config: {\n name: string\n values: readonly string[]\n description?: string\n directives?: readonly DirectiveApplication[]\n }): GraphQLSchemaBuilder<R> {\n const { name, values, description, directives } = config\n const newEnums = new Map(this.state.enums)\n newEnums.set(name, { name, values, description, directives })\n return this.with(updateState(this.state, \"enums\", newEnums))\n }\n\n /**\n * Register a union type\n */\n unionType(config: {\n name: string\n types: readonly string[]\n resolveType?: (value: any) => string\n directives?: readonly DirectiveApplication[]\n }): GraphQLSchemaBuilder<R> {\n const { name, types, resolveType, directives } = config\n const newUnions = new Map(this.state.unions)\n newUnions.set(name, {\n name,\n types,\n resolveType: resolveType ?? ((value: any) => value._tag),\n directives,\n })\n return this.with(updateState(this.state, \"unions\", newUnions))\n }\n\n /**\n * Register an input type\n */\n inputType(config: {\n name?: string\n schema: S.Schema<any, any, any>\n description?: string\n directives?: readonly DirectiveApplication[]\n }): GraphQLSchemaBuilder<R> {\n const { schema, description, directives } = config\n const name = config.name ?? getSchemaName(schema)\n if (!name) {\n throw new Error(\n \"inputType requires a name. Either provide one explicitly or use a TaggedStruct/TaggedClass/Schema.Class\"\n )\n }\n\n const newInputs = new Map(this.state.inputs)\n newInputs.set(name, { name, schema, description, directives })\n return this.with(updateState(this.state, \"inputs\", newInputs))\n }\n\n /**\n * Register a directive\n */\n directive<Args = void, R2 = never>(config: {\n name: string\n description?: string\n locations: readonly DirectiveLocation[]\n args?: S.Schema<Args, any, any>\n apply?: (\n args: Args\n ) => <A, E, R3>(effect: Effect.Effect<A, E, R3>) => Effect.Effect<A, E, R2 | R3>\n }): GraphQLSchemaBuilder<R | R2> {\n const newDirectives = new Map(this.state.directives)\n newDirectives.set(config.name, config as DirectiveRegistration)\n return this.with(updateState(this.state, \"directives\", newDirectives))\n }\n\n /**\n * Register a middleware\n *\n * Middleware wraps all resolvers (or those matching a pattern) and executes\n * in an \"onion\" model - first registered middleware is the outermost layer.\n *\n * @param config.name - Middleware name (for debugging/logging)\n * @param config.description - Optional description\n * @param config.match - Optional predicate to filter which fields this applies to\n * @param config.apply - Function that transforms the resolver Effect\n *\n * @example\n * ```typescript\n * builder.middleware({\n * name: \"logging\",\n * apply: (effect, ctx) => Effect.gen(function*() {\n * yield* Effect.logInfo(`Resolving ${ctx.info.fieldName}`)\n * const start = Date.now()\n * const result = yield* effect\n * yield* Effect.logInfo(`Resolved in ${Date.now() - start}ms`)\n * return result\n * })\n * })\n * ```\n */\n middleware<R2 = never>(config: {\n name: string\n description?: string\n match?: (info: GraphQLResolveInfo) => boolean\n apply: <A, E, R3>(\n effect: Effect.Effect<A, E, R3>,\n context: MiddlewareContext\n ) => Effect.Effect<A, E, R2 | R3>\n }): GraphQLSchemaBuilder<R | R2> {\n const newMiddlewares = [...this.state.middlewares, config as MiddlewareRegistration]\n return this.with({ ...this.state, middlewares: newMiddlewares })\n }\n\n /**\n * Register an extension\n *\n * Extensions provide lifecycle hooks that run at each phase of request processing\n * (parse, validate, execute) and can contribute data to the response's extensions field.\n *\n * @param config.name - Extension name (for debugging/logging)\n * @param config.description - Optional description\n * @param config.onParse - Called after query parsing\n * @param config.onValidate - Called after validation\n * @param config.onExecuteStart - Called before execution begins\n * @param config.onExecuteEnd - Called after execution completes\n *\n * @example\n * ```typescript\n * builder.extension({\n * name: \"tracing\",\n * onExecuteStart: () => Effect.gen(function*() {\n * const ext = yield* ExtensionsService\n * yield* ext.set(\"tracing\", { startTime: Date.now() })\n * }),\n * onExecuteEnd: () => Effect.gen(function*() {\n * const ext = yield* ExtensionsService\n * yield* ext.merge(\"tracing\", { endTime: Date.now() })\n * }),\n * })\n * ```\n */\n extension<R2 = never>(config: {\n name: string\n description?: string\n onParse?: (source: string, document: DocumentNode) => Effect.Effect<void, never, R2>\n onValidate?: (\n document: DocumentNode,\n errors: readonly GQLError[]\n ) => Effect.Effect<void, never, R2>\n onExecuteStart?: (args: ExecutionArgs) => Effect.Effect<void, never, R2>\n onExecuteEnd?: (result: ExecutionResult) => Effect.Effect<void, never, R2>\n }): GraphQLSchemaBuilder<R | R2> {\n const newExtensions = [...this.state.extensions, config as GraphQLExtension<R2>]\n return this.with({ ...this.state, extensions: newExtensions })\n }\n\n /**\n * Get the registered extensions for use by the execution layer\n */\n getExtensions(): readonly GraphQLExtension<any>[] {\n return this.state.extensions\n }\n\n /**\n * Add a computed/relational field to an object type\n */\n field<Parent, A, E, R2, Args = void>(\n typeName: string,\n fieldName: string,\n config: {\n type: S.Schema<A, any, any>\n args?: S.Schema<Args, any, any>\n description?: string\n directives?: readonly DirectiveApplication[]\n /**\n * Complexity cost of this field for query complexity limiting.\n * Can be a static number or a function that receives the resolved arguments.\n */\n complexity?: FieldComplexity\n /**\n * Cache control hint for this field.\n * Used to compute HTTP Cache-Control headers for the response.\n */\n cacheControl?: CacheHint\n resolve: (parent: Parent, args: Args) => Effect.Effect<A, E, R2>\n }\n ): GraphQLSchemaBuilder<R | R2> {\n const newObjectFields = new Map(this.state.objectFields)\n const typeFields = newObjectFields.get(typeName) || new Map()\n typeFields.set(fieldName, config)\n newObjectFields.set(typeName, typeFields)\n return this.with(updateState(this.state, \"objectFields\", newObjectFields))\n }\n\n // ============================================================================\n // Schema Building\n // ============================================================================\n\n /**\n * Get the field complexity map for use in complexity validation.\n * Maps \"TypeName.fieldName\" to the complexity value or function.\n */\n getFieldComplexities(): FieldComplexityMap {\n const complexities: FieldComplexityMap = new Map()\n\n // Query fields\n for (const [name, config] of this.state.queries) {\n if (config.complexity !== undefined) {\n complexities.set(`Query.${name}`, config.complexity)\n }\n }\n\n // Mutation fields\n for (const [name, config] of this.state.mutations) {\n if (config.complexity !== undefined) {\n complexities.set(`Mutation.${name}`, config.complexity)\n }\n }\n\n // Subscription fields\n for (const [name, config] of this.state.subscriptions) {\n if (config.complexity !== undefined) {\n complexities.set(`Subscription.${name}`, config.complexity)\n }\n }\n\n // Object type fields\n for (const [typeName, fields] of this.state.objectFields) {\n for (const [fieldName, config] of fields) {\n if (config.complexity !== undefined) {\n complexities.set(`${typeName}.${fieldName}`, config.complexity)\n }\n }\n }\n\n return complexities\n }\n\n /**\n * Get the cache hint map for use in cache control calculation.\n * Maps \"TypeName.fieldName\" to the cache hint for field-level hints,\n * or \"TypeName\" to the cache hint for type-level hints.\n */\n getCacheHints(): CacheHintMap {\n const hints: CacheHintMap = new Map()\n\n // Type-level hints\n for (const [typeName, typeReg] of this.state.types) {\n if (typeReg.cacheControl !== undefined) {\n hints.set(typeName, typeReg.cacheControl)\n }\n }\n\n // Query fields\n for (const [name, config] of this.state.queries) {\n if (config.cacheControl !== undefined) {\n hints.set(`Query.${name}`, config.cacheControl)\n }\n }\n\n // Subscription fields\n for (const [name, config] of this.state.subscriptions) {\n if (config.cacheControl !== undefined) {\n hints.set(`Subscription.${name}`, config.cacheControl)\n }\n }\n\n // Object type fields\n for (const [typeName, fields] of this.state.objectFields) {\n for (const [fieldName, config] of fields) {\n if (config.cacheControl !== undefined) {\n hints.set(`${typeName}.${fieldName}`, config.cacheControl)\n }\n }\n }\n\n return hints\n }\n\n /**\n * Build the GraphQL schema (no services required)\n */\n buildSchema(): GraphQLSchema {\n // Build all registries\n const directiveRegistry = this.buildDirectiveRegistry()\n const enumRegistry = this.buildEnumRegistry()\n const inputRegistry = this.buildInputRegistry(enumRegistry)\n const interfaceRegistry = this.buildInterfaceRegistry(enumRegistry)\n const { typeRegistry, unionRegistry } = this.buildTypeAndUnionRegistries(\n enumRegistry,\n interfaceRegistry\n )\n\n // Build field builder context\n const fieldCtx = this.createFieldBuilderContext(\n typeRegistry,\n interfaceRegistry,\n enumRegistry,\n unionRegistry,\n inputRegistry\n )\n\n // Build root type fields\n const queryFields = this.buildQueryFields(fieldCtx)\n const mutationFields = this.buildMutationFields(fieldCtx)\n const subscriptionFields = this.buildSubscriptionFields(fieldCtx)\n\n // Assemble schema\n return this.assembleSchema({\n directiveRegistry,\n enumRegistry,\n inputRegistry,\n interfaceRegistry,\n typeRegistry,\n unionRegistry,\n queryFields,\n mutationFields,\n subscriptionFields,\n })\n }\n\n private buildDirectiveRegistry(): Map<string, GraphQLDirective> {\n const registry = new Map<string, GraphQLDirective>()\n\n // Build cache once for O(1) lookups across all directives\n const cache = buildInputTypeLookupCache(this.state.inputs, this.state.enums)\n\n for (const [name, reg] of this.state.directives) {\n const graphqlDirective = new GraphQLDirective({\n name,\n description: reg.description,\n locations: [...reg.locations],\n args: reg.args\n ? toGraphQLArgsWithRegistry(\n reg.args,\n new Map(),\n new Map(),\n this.state.inputs,\n this.state.enums,\n cache\n )\n : undefined,\n })\n registry.set(name, graphqlDirective)\n }\n\n return registry\n }\n\n private buildEnumRegistry(): Map<string, GraphQLEnumType> {\n const registry = new Map<string, GraphQLEnumType>()\n\n for (const [name, reg] of this.state.enums) {\n const enumValues: Record<string, { value: string }> = {}\n for (const value of reg.values) {\n enumValues[value] = { value }\n }\n registry.set(\n name,\n new GraphQLEnumType({\n name,\n values: enumValues,\n description: reg.description,\n extensions: reg.directives ? { directives: reg.directives } : undefined,\n })\n )\n }\n\n return registry\n }\n\n private buildInputRegistry(\n enumRegistry: Map<string, GraphQLEnumType>\n ): Map<string, GraphQLInputObjectType> {\n const registry = new Map<string, GraphQLInputObjectType>()\n\n // Build cache once for O(1) lookups across all input types\n const cache = buildInputTypeLookupCache(this.state.inputs, this.state.enums)\n\n for (const [name, reg] of this.state.inputs) {\n const inputType = new GraphQLInputObjectType({\n name,\n description: reg.description,\n fields: () =>\n schemaToInputFields(\n reg.schema,\n enumRegistry,\n registry,\n this.state.inputs,\n this.state.enums,\n cache\n ),\n extensions: reg.directives ? { directives: reg.directives } : undefined,\n })\n registry.set(name, inputType)\n }\n\n return registry\n }\n\n private buildInterfaceRegistry(\n enumRegistry: Map<string, GraphQLEnumType>\n ): Map<string, GraphQLInterfaceType> {\n const registry = new Map<string, GraphQLInterfaceType>()\n // We need type and union registries for interface fields, but they're built later\n // Use empty maps for now - interfaces shouldn't reference object types directly\n const typeRegistry = new Map<string, GraphQLObjectType>()\n const unionRegistry = new Map<string, GraphQLUnionType>()\n\n // Create shared TypeConversionContext once for all interface field builders\n const sharedCtx: TypeConversionContext = {\n types: this.state.types,\n interfaces: this.state.interfaces,\n enums: this.state.enums,\n unions: this.state.unions,\n inputs: this.state.inputs,\n typeRegistry,\n interfaceRegistry: registry,\n enumRegistry,\n unionRegistry,\n inputRegistry: new Map(),\n }\n // Pre-build reverse lookup maps once\n buildReverseLookups(sharedCtx)\n\n for (const [name, reg] of this.state.interfaces) {\n const interfaceType = new GraphQLInterfaceType({\n name,\n fields: () => schemaToFields(reg.schema, sharedCtx),\n resolveType: reg.resolveType,\n extensions: reg.directives ? { directives: reg.directives } : undefined,\n })\n registry.set(name, interfaceType)\n }\n\n return registry\n }\n\n private buildTypeAndUnionRegistries(\n enumRegistry: Map<string, GraphQLEnumType>,\n interfaceRegistry: Map<string, GraphQLInterfaceType>\n ): {\n typeRegistry: Map<string, GraphQLObjectType>\n unionRegistry: Map<string, GraphQLUnionType>\n } {\n const typeRegistry = new Map<string, GraphQLObjectType>()\n const unionRegistry = new Map<string, GraphQLUnionType>()\n\n // Create shared TypeConversionContext once and reuse for all lazy field builders\n const sharedCtx: TypeConversionContext = {\n types: this.state.types,\n interfaces: this.state.interfaces,\n enums: this.state.enums,\n unions: this.state.unions,\n inputs: this.state.inputs,\n typeRegistry,\n interfaceRegistry,\n enumRegistry,\n unionRegistry,\n inputRegistry: new Map(),\n }\n // Pre-build reverse lookup maps once\n buildReverseLookups(sharedCtx)\n\n // Create shared FieldBuilderContext for additional fields\n const sharedFieldCtx = this.createFieldBuilderContext(\n typeRegistry,\n interfaceRegistry,\n enumRegistry,\n unionRegistry,\n new Map()\n )\n\n // Build object types with lazy field builders (allows circular references)\n for (const [typeName, typeReg] of this.state.types) {\n const implementedInterfaces =\n typeReg.implements?.map((name) => interfaceRegistry.get(name)!).filter(Boolean) ?? []\n\n const graphqlType = new GraphQLObjectType({\n name: typeName,\n description: typeReg.description,\n fields: () => {\n const baseFields = schemaToFields(typeReg.schema, sharedCtx)\n const additionalFields = this.state.objectFields.get(typeName)\n\n if (additionalFields) {\n for (const [fieldName, fieldConfig] of additionalFields) {\n baseFields[fieldName] = buildObjectField(fieldConfig, sharedFieldCtx)\n }\n }\n\n return baseFields\n },\n interfaces: implementedInterfaces.length > 0 ? implementedInterfaces : undefined,\n extensions: typeReg.directives ? { directives: typeReg.directives } : undefined,\n })\n typeRegistry.set(typeName, graphqlType)\n }\n\n // Build union types (reference object types)\n for (const [name, reg] of this.state.unions) {\n const unionType = new GraphQLUnionType({\n name,\n types: () => reg.types.map((typeName) => typeRegistry.get(typeName)!).filter(Boolean),\n resolveType: reg.resolveType,\n extensions: reg.directives ? { directives: reg.directives } : undefined,\n })\n unionRegistry.set(name, unionType)\n }\n\n return { typeRegistry, unionRegistry }\n }\n\n private createFieldBuilderContext(\n typeRegistry: Map<string, GraphQLObjectType>,\n interfaceRegistry: Map<string, GraphQLInterfaceType>,\n enumRegistry: Map<string, GraphQLEnumType>,\n unionRegistry: Map<string, GraphQLUnionType>,\n inputRegistry: Map<string, GraphQLInputObjectType>\n ): FieldBuilderContext {\n // Build cache once for O(1) input type lookups across all fields\n const inputTypeLookupCache = buildInputTypeLookupCache(this.state.inputs, this.state.enums)\n\n return {\n types: this.state.types,\n interfaces: this.state.interfaces,\n enums: this.state.enums,\n unions: this.state.unions,\n inputs: this.state.inputs,\n typeRegistry,\n interfaceRegistry,\n enumRegistry,\n unionRegistry,\n inputRegistry,\n directiveRegistrations: this.state.directives,\n middlewares: this.state.middlewares,\n inputTypeLookupCache,\n }\n }\n\n private buildQueryFields(ctx: FieldBuilderContext): GraphQLFieldConfigMap<any, any> {\n const fields: GraphQLFieldConfigMap<any, any> = {}\n for (const [name, config] of this.state.queries) {\n fields[name] = buildField(config, ctx)\n }\n return fields\n }\n\n private buildMutationFields(ctx: FieldBuilderContext): GraphQLFieldConfigMap<any, any> {\n const fields: GraphQLFieldConfigMap<any, any> = {}\n for (const [name, config] of this.state.mutations) {\n fields[name] = buildField(config, ctx)\n }\n return fields\n }\n\n private buildSubscriptionFields(ctx: FieldBuilderContext): GraphQLFieldConfigMap<any, any> {\n const fields: GraphQLFieldConfigMap<any, any> = {}\n for (const [name, config] of this.state.subscriptions) {\n fields[name] = buildSubscriptionField(config, ctx)\n }\n return fields\n }\n\n private assembleSchema(registries: {\n directiveRegistry: Map<string, GraphQLDirective>\n enumRegistry: Map<string, GraphQLEnumType>\n inputRegistry: Map<string, GraphQLInputObjectType>\n interfaceRegistry: Map<string, GraphQLInterfaceType>\n typeRegistry: Map<string, GraphQLObjectType>\n unionRegistry: Map<string, GraphQLUnionType>\n queryFields: GraphQLFieldConfigMap<any, any>\n mutationFields: GraphQLFieldConfigMap<any, any>\n subscriptionFields: GraphQLFieldConfigMap<any, any>\n }): GraphQLSchema {\n const schemaConfig: any = {\n types: [\n ...Array.from(registries.enumRegistry.values()),\n ...Array.from(registries.inputRegistry.values()),\n ...Array.from(registries.interfaceRegistry.values()),\n ...Array.from(registries.typeRegistry.values()),\n ...Array.from(registries.unionRegistry.values()),\n ],\n directives:\n registries.directiveRegistry.size > 0\n ? [...Array.from(registries.directiveRegistry.values())]\n : undefined,\n }\n\n if (Object.keys(registries.queryFields).length > 0) {\n schemaConfig.query = new GraphQLObjectType({\n name: \"Query\",\n fields: registries.queryFields,\n })\n }\n\n if (Object.keys(registries.mutationFields).length > 0) {\n schemaConfig.mutation = new GraphQLObjectType({\n name: \"Mutation\",\n fields: registries.mutationFields,\n })\n }\n\n if (Object.keys(registries.subscriptionFields).length > 0) {\n schemaConfig.subscription = new GraphQLObjectType({\n name: \"Subscription\",\n fields: registries.subscriptionFields,\n })\n }\n\n return new GraphQLSchema(schemaConfig)\n }\n}\n","import { Effect, Stream } from \"effect\"\nimport * as S from \"effect/Schema\"\nimport {\n DirectiveLocation,\n GraphQLResolveInfo,\n DocumentNode,\n ExecutionResult,\n GraphQLError,\n} from \"graphql\"\nimport type { DirectiveApplication, MiddlewareContext, CacheHint } from \"./types\"\nimport type { ExecutionArgs } from \"../extensions\"\nimport { GraphQLSchemaBuilder } from \"./schema-builder\"\nimport type { FieldComplexity } from \"../server/complexity\"\n\n/**\n * Add an object type to the schema builder (pipe-able)\n * Name is optional if schema is TaggedStruct, TaggedClass, or Schema.Class\n */\nexport const objectType =\n <A, R2 = never>(config: {\n name?: string\n schema: S.Schema<A, any, any>\n description?: string\n implements?: readonly string[]\n directives?: readonly DirectiveApplication[]\n /**\n * Default cache control hint for all fields returning this type.\n * Can be overridden by field-level cacheControl.\n */\n cacheControl?: CacheHint\n fields?: Record<\n string,\n {\n type: S.Schema<any, any, any>\n args?: S.Schema<any, any, any>\n description?: string\n directives?: readonly DirectiveApplication[]\n complexity?: FieldComplexity\n cacheControl?: CacheHint\n resolve: (parent: A, args: any) => Effect.Effect<any, any, any>\n }\n >\n }) =>\n <R>(builder: GraphQLSchemaBuilder<R>): GraphQLSchemaBuilder<R | R2> =>\n builder.objectType(config)\n\n/**\n * Add an interface type to the schema builder (pipe-able)\n * Name is optional if schema is TaggedStruct, TaggedClass, or Schema.Class\n */\nexport const interfaceType =\n (config: {\n name?: string\n schema: S.Schema<any, any, any>\n resolveType?: (value: any) => string\n directives?: readonly DirectiveApplication[]\n }) =>\n <R>(builder: GraphQLSchemaBuilder<R>): GraphQLSchemaBuilder<R> =>\n builder.interfaceType(config)\n\n/**\n * Add an enum type to the schema builder (pipe-able)\n */\nexport const enumType =\n (config: {\n name: string\n values: readonly string[]\n description?: string\n directives?: readonly DirectiveApplication[]\n }) =>\n <R>(builder: GraphQLSchemaBuilder<R>): GraphQLSchemaBuilder<R> =>\n builder.enumType(config)\n\n/**\n * Add a union type to the schema builder (pipe-able)\n */\nexport const unionType =\n (config: {\n name: string\n types: readonly string[]\n resolveType?: (value: any) => string\n directives?: readonly DirectiveApplication[]\n }) =>\n <R>(builder: GraphQLSchemaBuilder<R>): GraphQLSchemaBuilder<R> =>\n builder.unionType(config)\n\n/**\n * Add an input type to the schema builder (pipe-able)\n * Name is optional if schema is TaggedStruct, TaggedClass, or Schema.Class\n */\nexport const inputType =\n (config: {\n name?: string\n schema: S.Schema<any, any, any>\n description?: string\n directives?: readonly DirectiveApplication[]\n }) =>\n <R>(builder: GraphQLSchemaBuilder<R>): GraphQLSchemaBuilder<R> =>\n builder.inputType(config)\n\n/**\n * Register a directive (pipe-able)\n *\n * @param config - Directive configuration\n * @param config.name - The directive name (without @)\n * @param config.description - Optional description\n * @param config.locations - Array of DirectiveLocation values where this directive can be applied\n * @param config.args - Optional Effect Schema for directive arguments\n * @param config.apply - Optional function to transform resolver Effects (for executable directives)\n */\nexport const directive =\n <Args = void, R2 = never>(config: {\n name: string\n description?: string\n locations: readonly DirectiveLocation[]\n args?: S.Schema<Args, any, any>\n apply?: (\n args: Args\n ) => <A, E, R3>(effect: Effect.Effect<A, E, R3>) => Effect.Effect<A, E, R2 | R3>\n }) =>\n <R>(builder: GraphQLSchemaBuilder<R>): GraphQLSchemaBuilder<R | R2> =>\n builder.directive(config)\n\n/**\n * Register a middleware (pipe-able)\n *\n * Middleware wraps all resolvers (or those matching a pattern) and executes\n * in an \"onion\" model - first registered middleware is the outermost layer.\n *\n * @param config.name - Middleware name (for debugging/logging)\n * @param config.description - Optional description\n * @param config.match - Optional predicate to filter which fields this applies to\n * @param config.apply - Function that transforms the resolver Effect\n *\n * @example\n * ```typescript\n * GraphQLSchemaBuilder.empty.pipe(\n * middleware({\n * name: \"logging\",\n * apply: (effect, ctx) => Effect.gen(function*() {\n * yield* Effect.logInfo(`Resolving ${ctx.info.fieldName}`)\n * return yield* effect\n * })\n * }),\n * middleware({\n * name: \"adminOnly\",\n * match: (info) => info.fieldName.startsWith(\"admin\"),\n * apply: (effect) => Effect.gen(function*() {\n * const auth = yield* AuthService\n * yield* auth.requireAdmin()\n * return yield* effect\n * })\n * })\n * )\n * ```\n */\nexport const middleware =\n <R2 = never>(config: {\n name: string\n description?: string\n match?: (info: GraphQLResolveInfo) => boolean\n apply: <A, E, R3>(\n effect: Effect.Effect<A, E, R3>,\n context: MiddlewareContext\n ) => Effect.Effect<A, E, R2 | R3>\n }) =>\n <R>(builder: GraphQLSchemaBuilder<R>): GraphQLSchemaBuilder<R | R2> =>\n builder.middleware(config)\n\n/**\n * Register an extension (pipe-able)\n *\n * Extensions provide lifecycle hooks that run at each phase of request processing\n * (parse, validate, execute) and can contribute data to the response's extensions field.\n *\n * @param config.name - Extension name (for debugging/logging)\n * @param config.description - Optional description\n * @param config.onParse - Called after query parsing\n * @param config.onValidate - Called after validation\n * @param config.onExecuteStart - Called before execution begins\n * @param config.onExecuteEnd - Called after execution completes\n *\n * @example\n * ```typescript\n * GraphQLSchemaBuilder.empty.pipe(\n * extension({\n * name: \"tracing\",\n * onExecuteStart: () => Effect.gen(function*() {\n * const ext = yield* ExtensionsService\n * yield* ext.set(\"tracing\", { startTime: Date.now() })\n * }),\n * onExecuteEnd: () => Effect.gen(function*() {\n * const ext = yield* ExtensionsService\n * yield* ext.merge(\"tracing\", { endTime: Date.now() })\n * }),\n * })\n * )\n * ```\n */\nexport const extension =\n <R2 = never>(config: {\n name: string\n description?: string\n onParse?: (source: string, document: DocumentNode) => Effect.Effect<void, never, R2>\n onValidate?: (\n document: DocumentNode,\n errors: readonly GraphQLError[]\n ) => Effect.Effect<void, never, R2>\n onExecuteStart?: (args: ExecutionArgs) => Effect.Effect<void, never, R2>\n onExecuteEnd?: (result: ExecutionResult) => Effect.Effect<void, never, R2>\n }) =>\n <R>(builder: GraphQLSchemaBuilder<R>): GraphQLSchemaBuilder<R | R2> =>\n builder.extension(config)\n\n/**\n * Add a query field to the schema builder (pipe-able)\n */\nexport const query =\n <A, E, R2, Args = void>(\n name: string,\n config: {\n type: S.Schema<A, any, any>\n args?: S.Schema<Args, any, any>\n description?: string\n directives?: readonly DirectiveApplication[]\n complexity?: FieldComplexity\n cacheControl?: CacheHint\n resolve: (args: Args) => Effect.Effect<A, E, R2>\n }\n ) =>\n <R>(builder: GraphQLSchemaBuilder<R>): GraphQLSchemaBuilder<R | R2> =>\n builder.query(name, config)\n\n/**\n * Add a mutation field to the schema builder (pipe-able)\n */\nexport const mutation =\n <A, E, R2, Args = void>(\n name: string,\n config: {\n type: S.Schema<A, any, any>\n args?: S.Schema<Args, any, any>\n description?: string\n directives?: readonly DirectiveApplication[]\n complexity?: FieldComplexity\n resolve: (args: Args) => Effect.Effect<A, E, R2>\n }\n ) =>\n <R>(builder: GraphQLSchemaBuilder<R>): GraphQLSchemaBuilder<R | R2> =>\n builder.mutation(name, config)\n\n/**\n * Add a subscription field to the schema builder (pipe-able)\n *\n * Subscriptions return a Stream that yields values over time.\n *\n * @example\n * ```typescript\n * GraphQLSchemaBuilder.empty.pipe(\n * subscription(\"userCreated\", {\n * type: User,\n * subscribe: Effect.gen(function*() {\n * const pubsub = yield* PubSubService\n * return pubsub.subscribe(\"USER_CREATED\")\n * }),\n * })\n * )\n * ```\n */\nexport const subscription =\n <A, E, R2, Args = void>(\n name: string,\n config: {\n type: S.Schema<A, any, any>\n args?: S.Schema<Args, any, any>\n description?: string\n directives?: readonly DirectiveApplication[]\n complexity?: FieldComplexity\n cacheControl?: CacheHint\n subscribe: (args: Args) => Effect.Effect<Stream.Stream<A, E, R2>, E, R2>\n resolve?: (value: A, args: Args) => Effect.Effect<A, E, R2>\n }\n ) =>\n <R>(builder: GraphQLSchemaBuilder<R>): GraphQLSchemaBuilder<R | R2> =>\n builder.subscription(name, config)\n\n/**\n * Add a field to an existing object type (pipe-able)\n */\nexport const field =\n <Parent, A, E, R2, Args = void>(\n typeName: string,\n fieldName: string,\n config: {\n type: S.Schema<A, any, any>\n args?: S.Schema<Args, any, any>\n description?: string\n directives?: readonly DirectiveApplication[]\n complexity?: FieldComplexity\n cacheControl?: CacheHint\n resolve: (parent: Parent, args: Args) => Effect.Effect<A, E, R2>\n }\n ) =>\n <R>(builder: GraphQLSchemaBuilder<R>): GraphQLSchemaBuilder<R | R2> =>\n builder.field(typeName, fieldName, config)\n\n/**\n * Compose multiple schema operations (helper for arrays)\n */\nexport const compose =\n <R>(...operations: Array<(builder: GraphQLSchemaBuilder<any>) => GraphQLSchemaBuilder<any>>) =>\n (builder: GraphQLSchemaBuilder<R>): GraphQLSchemaBuilder<any> =>\n operations.reduce((b, op) => op(b), builder)\n","import { Context, Effect, Ref } from \"effect\"\nimport type { DocumentNode, ExecutionResult, GraphQLError, GraphQLSchema } from \"graphql\"\nimport type { FieldComplexityMap } from \"./server/complexity\"\n\n/**\n * Execution arguments passed to onExecuteStart hook\n */\nexport interface ExecutionArgs {\n readonly source: string\n readonly document: DocumentNode\n readonly variableValues?: Record<string, unknown>\n readonly operationName?: string\n /** The GraphQL schema being executed against */\n readonly schema: GraphQLSchema\n /** Field complexity definitions from the schema builder */\n readonly fieldComplexities: FieldComplexityMap\n}\n\n/**\n * Configuration for a GraphQL extension\n *\n * Extensions provide lifecycle hooks that run at each phase of request processing,\n * and can contribute data to the response's `extensions` field.\n *\n * @example\n * ```typescript\n * // Tracing extension\n * extension({\n * name: \"tracing\",\n * onExecuteStart: () => Effect.gen(function*() {\n * const ext = yield* ExtensionsService\n * yield* ext.set(\"tracing\", { startTime: Date.now() })\n * }),\n * onExecuteEnd: () => Effect.gen(function*() {\n * const ext = yield* ExtensionsService\n * yield* ext.merge(\"tracing\", { endTime: Date.now() })\n * }),\n * })\n * ```\n */\nexport interface GraphQLExtension<R = never> {\n readonly name: string\n readonly description?: string\n\n /**\n * Called after the query source is parsed into a DocumentNode.\n * Useful for query analysis, caching parsed documents, etc.\n */\n readonly onParse?: (source: string, document: DocumentNode) => Effect.Effect<void, never, R>\n\n /**\n * Called after validation completes.\n * Receives the document and any validation errors.\n * Useful for complexity analysis, query whitelisting, etc.\n */\n readonly onValidate?: (\n document: DocumentNode,\n errors: readonly GraphQLError[]\n ) => Effect.Effect<void, never, R>\n\n /**\n * Called before execution begins.\n * Receives the full execution arguments.\n * Useful for setting up tracing, logging, etc.\n */\n readonly onExecuteStart?: (args: ExecutionArgs) => Effect.Effect<void, never, R>\n\n /**\n * Called after execution completes.\n * Receives the execution result (including data and errors).\n * Useful for recording metrics, finalizing traces, etc.\n */\n readonly onExecuteEnd?: (result: ExecutionResult) => Effect.Effect<void, never, R>\n}\n\n/**\n * Service for accumulating extension data during request processing.\n *\n * This service is automatically provided for each request and allows\n * extensions, middleware, and resolvers to contribute to the response\n * extensions field.\n *\n * @example\n * ```typescript\n * Effect.gen(function*() {\n * const ext = yield* ExtensionsService\n *\n * // Set a value (overwrites existing)\n * yield* ext.set(\"complexity\", { score: 42 })\n *\n * // Merge into existing value\n * yield* ext.merge(\"tracing\", { endTime: Date.now() })\n *\n * // Get all accumulated extensions\n * const all = yield* ext.get()\n * })\n * ```\n */\nexport interface ExtensionsService {\n /**\n * Set a key-value pair in the extensions.\n * Overwrites any existing value for this key.\n */\n readonly set: (key: string, value: unknown) => Effect.Effect<void>\n\n /**\n * Deep merge an object into an existing key's value.\n * If the key doesn't exist, sets the value.\n * If the existing value is not an object, overwrites it.\n */\n readonly merge: (key: string, value: Record<string, unknown>) => Effect.Effect<void>\n\n /**\n * Get all accumulated extensions as a record.\n */\n readonly get: () => Effect.Effect<Record<string, unknown>>\n}\n\n/**\n * Tag for the ExtensionsService\n */\nexport const ExtensionsService = Context.GenericTag<ExtensionsService>(\n \"@effect-gql/ExtensionsService\"\n)\n\n/**\n * Deep merge two objects\n */\nfunction deepMerge(\n target: Record<string, unknown>,\n source: Record<string, unknown>\n): Record<string, unknown> {\n const result = { ...target }\n for (const key of Object.keys(source)) {\n const sourceValue = source[key]\n const targetValue = result[key]\n\n if (\n typeof sourceValue === \"object\" &&\n sourceValue !== null &&\n !Array.isArray(sourceValue) &&\n typeof targetValue === \"object\" &&\n targetValue !== null &&\n !Array.isArray(targetValue)\n ) {\n result[key] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>\n )\n } else {\n result[key] = sourceValue\n }\n }\n return result\n}\n\n/**\n * Create a new ExtensionsService backed by a Ref\n */\nexport const makeExtensionsService = (): Effect.Effect<ExtensionsService, never, never> =>\n Effect.gen(function* () {\n const ref = yield* Ref.make<Record<string, unknown>>({})\n\n return ExtensionsService.of({\n set: (key, value) => Ref.update(ref, (current) => ({ ...current, [key]: value })),\n\n merge: (key, value) =>\n Ref.update(ref, (current) => {\n const existing = current[key]\n if (typeof existing === \"object\" && existing !== null && !Array.isArray(existing)) {\n return {\n ...current,\n [key]: deepMerge(existing as Record<string, unknown>, value),\n }\n }\n return { ...current, [key]: value }\n }),\n\n get: () => Ref.get(ref),\n })\n })\n\n/**\n * Generic helper to run extension hooks with error handling.\n * Filters extensions that have the specified hook, runs them,\n * and logs warnings if any hook fails.\n */\nconst runExtensionHooks = <R, K extends keyof GraphQLExtension<R>>(\n extensions: readonly GraphQLExtension<R>[],\n hookName: K,\n getHookEffect: (ext: GraphQLExtension<R>) => Effect.Effect<void, never, R>\n): Effect.Effect<void, never, R> =>\n Effect.forEach(\n extensions.filter((ext) => ext[hookName] !== undefined),\n (ext) =>\n getHookEffect(ext).pipe(\n Effect.catchAllCause((cause) =>\n Effect.logWarning(`Extension \"${ext.name}\" ${String(hookName)} hook failed`, cause)\n )\n ),\n { discard: true }\n ) as Effect.Effect<void, never, R>\n\n/**\n * Run all onParse hooks for registered extensions\n */\nexport const runParseHooks = <R>(\n extensions: readonly GraphQLExtension<R>[],\n source: string,\n document: DocumentNode\n): Effect.Effect<void, never, R> =>\n runExtensionHooks(extensions, \"onParse\", (ext) => ext.onParse!(source, document))\n\n/**\n * Run all onValidate hooks for registered extensions\n */\nexport const runValidateHooks = <R>(\n extensions: readonly GraphQLExtension<R>[],\n document: DocumentNode,\n errors: readonly GraphQLError[]\n): Effect.Effect<void, never, R> =>\n runExtensionHooks(extensions, \"onValidate\", (ext) => ext.onValidate!(document, errors))\n\n/**\n * Run all onExecuteStart hooks for registered extensions\n */\nexport const runExecuteStartHooks = <R>(\n extensions: readonly GraphQLExtension<R>[],\n args: ExecutionArgs\n): Effect.Effect<void, never, R> =>\n runExtensionHooks(extensions, \"onExecuteStart\", (ext) => ext.onExecuteStart!(args))\n\n/**\n * Run all onExecuteEnd hooks for registered extensions\n */\nexport const runExecuteEndHooks = <R>(\n extensions: readonly GraphQLExtension<R>[],\n result: ExecutionResult\n): Effect.Effect<void, never, R> =>\n runExtensionHooks(extensions, \"onExecuteEnd\", (ext) => ext.onExecuteEnd!(result))\n","import { Effect, Layer } from \"effect\"\nimport {\n GraphQLSchema,\n GraphQLError,\n parse,\n validate,\n execute as graphqlExecute,\n type ExecutionResult,\n type DocumentNode,\n} from \"graphql\"\nimport type { GraphQLEffectContext } from \"./types\"\nimport {\n type GraphQLExtension,\n ExtensionsService,\n makeExtensionsService,\n runParseHooks,\n runValidateHooks,\n runExecuteStartHooks,\n runExecuteEndHooks,\n} from \"../extensions\"\nimport type { FieldComplexityMap } from \"../server/complexity\"\n\n/**\n * Execute a GraphQL query with a service layer\n *\n * This is the layer-per-request execution model. Build the schema once,\n * then execute each request with its own layer (including request-scoped services).\n *\n * The execution follows these phases:\n * 1. Parse - Convert source string to DocumentNode\n * 2. Validate - Check document against schema\n * 3. Execute - Run resolvers and return result\n *\n * Extensions can hook into each phase via onParse, onValidate, onExecuteStart, onExecuteEnd.\n * Extension data is automatically merged into the response's extensions field.\n */\nexport const execute =\n <R>(\n schema: GraphQLSchema,\n layer: Layer.Layer<R>,\n extensions: readonly GraphQLExtension<any>[] = [],\n fieldComplexities: FieldComplexityMap = new Map()\n ) =>\n (\n source: string,\n variableValues?: Record<string, unknown>,\n operationName?: string\n ): Effect.Effect<ExecutionResult, Error> =>\n Effect.gen(function* () {\n // Create the ExtensionsService for this request\n const extensionsService = yield* makeExtensionsService()\n\n // Create runtime from the provided layer\n const runtime = yield* Effect.runtime<R>()\n\n // Phase 1: Parse\n let document: DocumentNode\n try {\n document = parse(source)\n } catch (parseError) {\n // Parse errors are returned as GraphQL errors, not thrown\n const extensionData = yield* extensionsService.get()\n return {\n errors: [\n parseError instanceof GraphQLError ? parseError : new GraphQLError(String(parseError)),\n ],\n extensions: Object.keys(extensionData).length > 0 ? extensionData : undefined,\n } as ExecutionResult\n }\n\n // Run onParse hooks\n yield* runParseHooks(extensions, source, document).pipe(\n Effect.provideService(ExtensionsService, extensionsService)\n )\n\n // Phase 2: Validate\n const validationErrors = validate(schema, document)\n\n // Run onValidate hooks\n yield* runValidateHooks(extensions, document, validationErrors).pipe(\n Effect.provideService(ExtensionsService, extensionsService)\n )\n\n // If validation failed, return errors without executing\n if (validationErrors.length > 0) {\n const extensionData = yield* extensionsService.get()\n return {\n errors: validationErrors,\n extensions: Object.keys(extensionData).length > 0 ? extensionData : undefined,\n } as ExecutionResult\n }\n\n // Phase 3: Execute\n const executionArgs = {\n source,\n document,\n variableValues,\n operationName,\n schema,\n fieldComplexities,\n }\n\n // Run onExecuteStart hooks\n yield* runExecuteStartHooks(extensions, executionArgs).pipe(\n Effect.provideService(ExtensionsService, extensionsService)\n )\n\n // Execute the GraphQL query\n const executeResult = yield* Effect.try({\n try: () =>\n graphqlExecute({\n schema,\n document,\n variableValues,\n operationName,\n contextValue: { runtime } satisfies GraphQLEffectContext<R>,\n }),\n catch: (error) => new Error(String(error)),\n })\n\n // Await result if it's a promise (for subscriptions, it might be)\n const resolvedResult: Awaited<typeof executeResult> =\n executeResult && typeof executeResult === \"object\" && \"then\" in executeResult\n ? yield* Effect.promise(() => executeResult)\n : executeResult\n\n // Run onExecuteEnd hooks\n yield* runExecuteEndHooks(extensions, resolvedResult).pipe(\n Effect.provideService(ExtensionsService, extensionsService)\n )\n\n // Merge extension data into result\n const extensionData = yield* extensionsService.get()\n if (Object.keys(extensionData).length > 0) {\n return {\n ...resolvedResult,\n extensions: {\n ...resolvedResult.extensions,\n ...extensionData,\n },\n }\n }\n\n return resolvedResult\n }).pipe(Effect.provide(layer)) as Effect.Effect<ExecutionResult, Error>\n\n/**\n * Execute a GraphQL query with a service layer (simple version without extensions)\n *\n * @deprecated Use execute() instead, which now supports extensions as an optional parameter\n */\nexport const executeSimple = <R>(schema: GraphQLSchema, layer: Layer.Layer<R>) =>\n execute(schema, layer, [])\n","import { Data } from \"effect\"\n\n/**\n * Base class for GraphQL errors in Effect\n */\nexport class GraphQLError extends Data.TaggedError(\"GraphQLError\")<{\n message: string\n extensions?: Record<string, unknown>\n}> {}\n\n/**\n * Validation error for input validation failures\n */\nexport class ValidationError extends Data.TaggedError(\"ValidationError\")<{\n message: string\n field?: string\n}> {}\n\n/**\n * Authorization error for access control failures\n */\nexport class AuthorizationError extends Data.TaggedError(\"AuthorizationError\")<{\n message: string\n}> {}\n\n/**\n * Not found error for missing resources\n */\nexport class NotFoundError extends Data.TaggedError(\"NotFoundError\")<{\n message: string\n resource?: string\n}> {}\n","import { Context, Layer } from \"effect\"\n\n/**\n * GraphQL request context containing request-specific data\n */\nexport interface GraphQLRequestContext {\n readonly request: {\n readonly headers: Record<string, string>\n readonly query: string\n readonly variables?: Record<string, unknown>\n readonly operationName?: string\n }\n}\n\nexport const GraphQLRequestContext =\n Context.GenericTag<GraphQLRequestContext>(\"GraphQLRequestContext\")\n\n/**\n * Create a layer from request context\n */\nexport const makeRequestContextLayer = (\n context: GraphQLRequestContext\n): Layer.Layer<GraphQLRequestContext> => Layer.succeed(GraphQLRequestContext, context)\n","import { Effect, Context, Layer } from \"effect\"\nimport DataLoader from \"dataloader\"\n\n/**\n * Ergonomic DataLoader helpers for Effect-based GraphQL\n *\n * This module provides a type-safe, declarative way to define DataLoaders\n * that integrate seamlessly with Effect's service system.\n *\n * @example\n * ```typescript\n * // Define loaders\n * const loaders = Loader.define({\n * UserById: Loader.single<string, User>({\n * batch: (ids) => db.getUsersByIds(ids),\n * key: (user) => user.id,\n * }),\n *\n * PostsByAuthorId: Loader.grouped<string, Post>({\n * batch: (ids) => db.getPostsForAuthors(ids),\n * groupBy: (post) => post.authorId,\n * }),\n * })\n *\n * // Use in resolvers\n * resolve: (parent) => loaders.load(\"UserById\", parent.authorId)\n * ```\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Configuration for a single-value loader (one key -> one value)\n */\nexport interface SingleLoaderDef<K, V, R> {\n readonly _tag: \"single\"\n readonly batch: (keys: readonly K[]) => Effect.Effect<readonly V[], Error, R>\n readonly key: (value: V) => K\n}\n\n/**\n * Configuration for a grouped loader (one key -> many values)\n */\nexport interface GroupedLoaderDef<K, V, R> {\n readonly _tag: \"grouped\"\n readonly batch: (keys: readonly K[]) => Effect.Effect<readonly V[], Error, R>\n readonly groupBy: (value: V) => K\n}\n\ntype LoaderDef<K, V, R> = SingleLoaderDef<K, V, R> | GroupedLoaderDef<K, V, R>\n\n/**\n * Runtime DataLoader instances\n */\ntype LoaderInstances<Defs extends Record<string, LoaderDef<any, any, any>>> = {\n [Name in keyof Defs]: Defs[Name] extends SingleLoaderDef<infer K, infer V, any>\n ? DataLoader<K, V>\n : Defs[Name] extends GroupedLoaderDef<infer K, infer V, any>\n ? DataLoader<K, V[]>\n : never\n}\n\n/**\n * Extract the value type for a loader (accounting for grouped loaders)\n */\ntype LoaderValue<Def> =\n Def extends SingleLoaderDef<any, infer V, any>\n ? V\n : Def extends GroupedLoaderDef<any, infer V, any>\n ? V[]\n : never\n\n/**\n * Extract the key type for a loader\n */\ntype LoaderKey<Def> = Def extends LoaderDef<infer K, any, any> ? K : never\n\n/**\n * Extract combined requirements from all loaders\n */\ntype LoaderRequirements<Defs extends Record<string, LoaderDef<any, any, any>>> = {\n [K in keyof Defs]: Defs[K] extends LoaderDef<any, any, infer R> ? R : never\n}[keyof Defs]\n\n// ============================================================================\n// Loader Builders\n// ============================================================================\n\n/**\n * Create a single-value loader definition.\n * One key maps to one value.\n *\n * @example\n * ```typescript\n * Loader.single<string, User>({\n * batch: (ids) => db.getUsersByIds(ids),\n * key: (user) => user.id,\n * })\n * ```\n */\nfunction single<K, V, R = never>(config: {\n batch: (keys: readonly K[]) => Effect.Effect<readonly V[], Error, R>\n key: (value: V) => K\n}): SingleLoaderDef<K, V, R> {\n return {\n _tag: \"single\",\n batch: config.batch,\n key: config.key,\n }\n}\n\n/**\n * Create a grouped loader definition.\n * One key maps to many values.\n *\n * @example\n * ```typescript\n * Loader.grouped<string, Post>({\n * batch: (authorIds) => db.getPostsForAuthors(authorIds),\n * groupBy: (post) => post.authorId,\n * })\n * ```\n */\nfunction grouped<K, V, R = never>(config: {\n batch: (keys: readonly K[]) => Effect.Effect<readonly V[], Error, R>\n groupBy: (value: V) => K\n}): GroupedLoaderDef<K, V, R> {\n return {\n _tag: \"grouped\",\n batch: config.batch,\n groupBy: config.groupBy,\n }\n}\n\n// ============================================================================\n// Loader Registry\n// ============================================================================\n\n/**\n * A registry of loader definitions with methods to create instances and layers\n */\nclass LoaderRegistry<Defs extends Record<string, LoaderDef<any, any, any>>> {\n readonly _tag = \"LoaderRegistry\"\n\n /**\n * The Effect service tag for this loader registry\n */\n readonly Service: Context.Tag<LoaderInstances<Defs>, LoaderInstances<Defs>>\n\n constructor(readonly definitions: Defs) {\n this.Service = Context.GenericTag<LoaderInstances<Defs>>(\n `DataLoaders(${Object.keys(definitions).join(\", \")})`\n )\n }\n\n /**\n * Create a Layer that provides fresh DataLoader instances.\n * Call this once per request to get request-scoped loaders.\n */\n toLayer(): Layer.Layer<LoaderInstances<Defs>, never, LoaderRequirements<Defs>> {\n const self = this\n return Layer.effect(\n this.Service,\n Effect.gen(function* () {\n // Build loader instances dynamically from definitions\n // The type cast at the end is necessary because we're building the object dynamically\n const instances: Partial<LoaderInstances<Defs>> = {}\n\n for (const name of Object.keys(self.definitions) as Array<keyof Defs & string>) {\n const def = self.definitions[name]\n // Type assertion needed here as we're building a heterogeneous record dynamically\n instances[name] = (yield* createDataLoader(def)) as LoaderInstances<Defs>[typeof name]\n }\n\n return instances as LoaderInstances<Defs>\n })\n ) as Layer.Layer<LoaderInstances<Defs>, never, LoaderRequirements<Defs>>\n }\n\n /**\n * Helper to use loaders in a resolver with a callback.\n */\n use<A>(\n fn: (loaders: LoaderInstances<Defs>) => Promise<A>\n ): Effect.Effect<A, Error, LoaderInstances<Defs>> {\n const self = this\n return Effect.gen(function* () {\n const loaders = yield* self.Service\n return yield* Effect.promise(() => fn(loaders))\n })\n }\n\n /**\n * Load a single value by key.\n * This is the most common operation in resolvers.\n *\n * @internal The internal cast is safe because LoaderInstances<Defs> guarantees\n * that loaders[name] is a DataLoader with the correct key/value types.\n */\n load<Name extends keyof Defs & string>(\n name: Name,\n key: LoaderKey<Defs[Name]>\n ): Effect.Effect<LoaderValue<Defs[Name]>, Error, LoaderInstances<Defs>> {\n const self = this\n return Effect.gen(function* () {\n const loaders = yield* self.Service\n // Safe cast: LoaderInstances maps name to the correctly-typed DataLoader\n const loader = loaders[name] as DataLoader<LoaderKey<Defs[Name]>, LoaderValue<Defs[Name]>>\n return yield* Effect.promise(() => loader.load(key))\n })\n }\n\n /**\n * Load multiple values by keys.\n * All keys are batched into a single request.\n *\n * @internal The internal cast is safe because LoaderInstances<Defs> guarantees\n * that loaders[name] is a DataLoader with the correct key/value types.\n */\n loadMany<Name extends keyof Defs & string>(\n name: Name,\n keys: readonly LoaderKey<Defs[Name]>[]\n ): Effect.Effect<readonly LoaderValue<Defs[Name]>[], Error, LoaderInstances<Defs>> {\n const self = this\n return Effect.gen(function* () {\n const loaders = yield* self.Service\n // Safe cast: LoaderInstances maps name to the correctly-typed DataLoader\n const loader = loaders[name] as DataLoader<LoaderKey<Defs[Name]>, LoaderValue<Defs[Name]>>\n const results = yield* Effect.promise(() => loader.loadMany(keys))\n // Convert any errors to a failure\n for (const result of results) {\n if (result instanceof Error) {\n return yield* Effect.fail(result)\n }\n }\n return results as readonly LoaderValue<Defs[Name]>[]\n })\n }\n}\n\n/**\n * Create a DataLoader from a single loader definition.\n */\nfunction createSingleDataLoader<K, V, R>(\n def: SingleLoaderDef<K, V, R>,\n context: Context.Context<R>\n): DataLoader<K, V | Error> {\n return new DataLoader<K, V | Error>(async (keys) => {\n const items = await Effect.runPromise(def.batch(keys).pipe(Effect.provide(context)))\n // Map items back to keys in order\n return keys.map((key) => {\n const item = items.find((i) => def.key(i) === key)\n if (!item) return new Error(`Not found: ${key}`)\n return item\n })\n })\n}\n\n/**\n * Create a DataLoader from a grouped loader definition.\n */\nfunction createGroupedDataLoader<K, V, R>(\n def: GroupedLoaderDef<K, V, R>,\n context: Context.Context<R>\n): DataLoader<K, V[]> {\n return new DataLoader<K, V[]>(async (keys) => {\n const items = await Effect.runPromise(def.batch(keys).pipe(Effect.provide(context)))\n // Group items by key with lazy array initialization\n const map = new Map<K, V[]>()\n for (const item of items) {\n const key = def.groupBy(item)\n let arr = map.get(key)\n if (!arr) {\n arr = []\n map.set(key, arr)\n }\n arr.push(item)\n }\n // Return results in key order, defaulting to empty array for missing keys\n return keys.map((key) => map.get(key) ?? [])\n })\n}\n\n/**\n * Create a DataLoader from a loader definition.\n * Single loaders return V | Error, grouped loaders return V[].\n *\n * @internal The return type uses a union because we need to handle both loader types.\n * The calling code should use the appropriate type based on the definition's _tag.\n */\nfunction createDataLoader<K, V, R>(\n def: LoaderDef<K, V, R>\n): Effect.Effect<DataLoader<K, V | Error> | DataLoader<K, V[]>, never, R> {\n return Effect.gen(function* () {\n // Capture context for use in batch function\n const context = yield* Effect.context<R>()\n\n if (def._tag === \"single\") {\n return createSingleDataLoader(def, context)\n } else {\n return createGroupedDataLoader(def, context)\n }\n })\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Define a set of loaders.\n *\n * @example\n * ```typescript\n * const loaders = Loader.define({\n * UserById: Loader.single<string, User>({\n * batch: (ids) => db.getUsersByIds(ids),\n * key: (user) => user.id,\n * }),\n * PostsByAuthorId: Loader.grouped<string, Post>({\n * batch: (ids) => db.getPostsForAuthors(ids),\n * groupBy: (post) => post.authorId,\n * }),\n * })\n *\n * // In resolvers:\n * loaders.load(\"UserById\", \"123\")\n * loaders.loadMany(\"UserById\", [\"1\", \"2\", \"3\"])\n * ```\n */\nfunction define<Defs extends Record<string, LoaderDef<any, any, any>>>(\n definitions: Defs\n): LoaderRegistry<Defs> {\n return new LoaderRegistry(definitions)\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Map an array of items to match requested keys.\n * Returns items in the same order as keys, with errors for missing items.\n */\nfunction mapByKey<K, V>(\n keys: readonly K[],\n items: readonly V[],\n keyFn: (item: V) => K\n): (V | Error)[] {\n const map = new Map<K, V>()\n for (const item of items) {\n map.set(keyFn(item), item)\n }\n return keys.map((key) => map.get(key) ?? new Error(`Not found: ${key}`))\n}\n\n/**\n * Group an array of items by a key function.\n * Returns a Map from key to array of matching items.\n * Guarantees an entry (possibly empty) for each requested key.\n */\nfunction groupByKey<K, V>(\n keys: readonly K[],\n items: readonly V[],\n keyFn: (item: V) => K\n): Map<K, V[]> {\n const map = new Map<K, V[]>()\n // Initialize empty arrays for all requested keys\n for (const key of keys) {\n map.set(key, [])\n }\n // Fill in items\n for (const item of items) {\n const key = keyFn(item)\n const arr = map.get(key)\n if (arr) arr.push(item)\n }\n return map\n}\n\n// ============================================================================\n// Export\n// ============================================================================\n\nexport const Loader = {\n define,\n single,\n grouped,\n mapByKey,\n groupByKey,\n} as const\n\nexport type { LoaderRegistry, LoaderDef, LoaderInstances }\n","import { Effect, Context, Layer, Ref, Option, HashMap } from \"effect\"\n\n/**\n * A type-safe context system for passing values through the resolver hierarchy.\n *\n * Unlike simple property bags, this provides:\n * - Type-safe slots that know their value type\n * - Clear errors when required context is missing\n * - Request-scoped storage that works across nested resolvers\n *\n * @example\n * ```typescript\n * // Define a context slot\n * const AuthPrincipal = ResolverContext.make<User>(\"AuthPrincipal\")\n *\n * // Provide in a directive\n * .directive({\n * name: \"auth\",\n * apply: () => (effect) => Effect.gen(function*() {\n * const user = yield* validateJwt()\n * yield* ResolverContext.set(AuthPrincipal, user)\n * return yield* effect\n * }),\n * })\n *\n * // Access in any nested resolver\n * .field(\"User\", \"posts\", {\n * resolve: (parent) => Effect.gen(function*() {\n * const user = yield* ResolverContext.get(AuthPrincipal)\n * // ...\n * }),\n * })\n * ```\n */\n\n/**\n * Error thrown when trying to access a context value that hasn't been set\n */\nexport class MissingResolverContextError extends Error {\n readonly _tag = \"MissingResolverContextError\"\n\n constructor(readonly contextName: string) {\n super(\n `Resolver context \"${contextName}\" was not provided. Ensure a parent resolver or directive provides this context.`\n )\n this.name = \"MissingResolverContextError\"\n }\n}\n\n/**\n * A typed context slot that can hold a value of type A\n */\nexport interface ResolverContextSlot<A> {\n readonly _tag: \"ResolverContextSlot\"\n readonly name: string\n readonly _A: A // Phantom type for type inference\n}\n\n/**\n * Internal storage for resolver context values.\n * This is a request-scoped service that holds all context values.\n */\nexport interface ResolverContextStore {\n readonly ref: Ref.Ref<HashMap.HashMap<string, unknown>>\n}\n\nexport const ResolverContextStore = Context.GenericTag<ResolverContextStore>(\n \"effect-gql/ResolverContextStore\"\n)\n\n/**\n * Create a Layer that provides the ResolverContextStore.\n * This should be included in the request layer.\n */\nexport const makeStoreLayer = (): Effect.Effect<Layer.Layer<ResolverContextStore>> =>\n Effect.map(Ref.make(HashMap.empty<string, unknown>()), (ref) =>\n Layer.succeed(ResolverContextStore, { ref })\n )\n\n/**\n * Create a Layer that provides an empty ResolverContextStore.\n * Convenience function for creating a fresh store layer.\n */\nexport const storeLayer: Layer.Layer<ResolverContextStore> = Layer.effect(\n ResolverContextStore,\n Effect.map(Ref.make(HashMap.empty<string, unknown>()), (ref) => ({ ref }))\n)\n\n/**\n * Create a new resolver context slot.\n *\n * The name is used for error messages when the context is accessed but not set.\n *\n * @example\n * ```typescript\n * const AuthPrincipal = ResolverContext.make<User>(\"AuthPrincipal\")\n * const TenantId = ResolverContext.make<string>(\"TenantId\")\n * ```\n */\nexport const make = <A>(name: string): ResolverContextSlot<A> => ({\n _tag: \"ResolverContextSlot\",\n name,\n _A: undefined as unknown as A,\n})\n\n/**\n * Get a value from the resolver context.\n *\n * Fails with MissingResolverContextError if the context was not set\n * by a parent resolver or directive.\n *\n * @example\n * ```typescript\n * const effect = Effect.gen(function*() {\n * const user = yield* ResolverContext.get(AuthPrincipal)\n * // user is typed as User\n * })\n * ```\n */\nexport const get = <A>(\n slot: ResolverContextSlot<A>\n): Effect.Effect<A, MissingResolverContextError, ResolverContextStore> =>\n Effect.flatMap(ResolverContextStore, (store) =>\n Effect.flatMap(Ref.get(store.ref), (map) => {\n const value = HashMap.get(map, slot.name)\n return Option.match(value, {\n onNone: () => Effect.fail(new MissingResolverContextError(slot.name)),\n onSome: (v) => Effect.succeed(v as A),\n })\n })\n )\n\n/**\n * Get a value from the resolver context as an Option.\n *\n * Returns None if the context was not set, instead of failing.\n * Useful when context is optional.\n */\nexport const getOption = <A>(\n slot: ResolverContextSlot<A>\n): Effect.Effect<Option.Option<A>, never, ResolverContextStore> =>\n Effect.flatMap(ResolverContextStore, (store) =>\n Effect.map(Ref.get(store.ref), (map) => HashMap.get(map, slot.name) as Option.Option<A>)\n )\n\n/**\n * Set a value in the resolver context.\n *\n * The value will be available to all subsequent resolver calls in this request.\n * This mutates the request-scoped store, so nested resolvers will see the value.\n *\n * @example\n * ```typescript\n * // In a directive\n * const withAuth = (effect) => Effect.gen(function*() {\n * const user = yield* validateJwt()\n * yield* ResolverContext.set(AuthPrincipal, user)\n * return yield* effect\n * })\n * ```\n */\nexport const set = <A>(\n slot: ResolverContextSlot<A>,\n value: A\n): Effect.Effect<void, never, ResolverContextStore> =>\n Effect.flatMap(ResolverContextStore, (store) =>\n Ref.update(store.ref, (map) => HashMap.set(map, slot.name, value))\n )\n\n/**\n * Set multiple context values at once.\n */\nexport const setMany = (\n values: ReadonlyArray<readonly [ResolverContextSlot<any>, any]>\n): Effect.Effect<void, never, ResolverContextStore> =>\n Effect.flatMap(ResolverContextStore, (store) =>\n Ref.update(store.ref, (map) => {\n let result = map\n for (const [slot, value] of values) {\n result = HashMap.set(result, slot.name, value)\n }\n return result\n })\n )\n\n/**\n * Check if a context slot has a value set.\n */\nexport const has = <A>(\n slot: ResolverContextSlot<A>\n): Effect.Effect<boolean, never, ResolverContextStore> =>\n Effect.flatMap(ResolverContextStore, (store) =>\n Effect.map(Ref.get(store.ref), (map) => HashMap.has(map, slot.name))\n )\n\n/**\n * Get a value or return a default if not set.\n */\nexport const getOrElse = <A>(\n slot: ResolverContextSlot<A>,\n orElse: () => A\n): Effect.Effect<A, never, ResolverContextStore> =>\n Effect.flatMap(ResolverContextStore, (store) =>\n Effect.map(Ref.get(store.ref), (map) =>\n Option.getOrElse(HashMap.get(map, slot.name) as Option.Option<A>, orElse)\n )\n )\n\n/**\n * Run an effect with a temporary context value.\n * The value is set before the effect runs and removed after.\n * Useful for scoped context that shouldn't persist.\n */\nexport const scoped =\n <A>(slot: ResolverContextSlot<A>, value: A) =>\n <B, E, R>(effect: Effect.Effect<B, E, R>): Effect.Effect<B, E, R | ResolverContextStore> =>\n Effect.flatMap(ResolverContextStore, (store) =>\n Effect.acquireUseRelease(\n // Acquire: save current value and set new one\n Effect.flatMap(Ref.get(store.ref), (map) => {\n const previous = HashMap.get(map, slot.name)\n return Effect.as(Ref.set(store.ref, HashMap.set(map, slot.name, value)), previous)\n }),\n // Use: run the effect\n () => effect,\n // Release: restore previous value\n (previous) =>\n Ref.update(store.ref, (map) =>\n Option.match(previous, {\n onNone: () => HashMap.remove(map, slot.name),\n onSome: (v) => HashMap.set(map, slot.name, v),\n })\n )\n )\n )\n\n/**\n * Namespace for ResolverContext functions\n */\nexport const ResolverContext = {\n make,\n get,\n getOption,\n set,\n setMany,\n has,\n getOrElse,\n scoped,\n storeLayer,\n makeStoreLayer,\n Store: ResolverContextStore,\n MissingResolverContextError,\n} as const\n","import { Config, Option } from \"effect\"\nimport type { ComplexityConfig } from \"./complexity\"\nimport type { CacheControlConfig } from \"./cache-control\"\n\n/**\n * Configuration for the GraphiQL UI\n */\nexport interface GraphiQLConfig {\n /** Path where GraphiQL UI is served (default: \"/graphiql\") */\n readonly path: string\n /** URL where GraphiQL sends requests (default: same as graphql path) */\n readonly endpoint: string\n /** WebSocket URL for subscriptions (default: same as endpoint) */\n readonly subscriptionEndpoint?: string\n}\n\n/**\n * Configuration for the GraphQL router\n */\nexport interface GraphQLRouterConfig {\n /** Path for GraphQL endpoint (default: \"/graphql\") */\n readonly path: string\n /** GraphiQL configuration, or false to disable */\n readonly graphiql: false | GraphiQLConfig\n /** Query complexity limiting configuration */\n readonly complexity?: ComplexityConfig\n /** Enable introspection queries (default: true). Set to false in production. */\n readonly introspection: boolean\n /** Cache control configuration for HTTP Cache-Control headers */\n readonly cacheControl?: CacheControlConfig\n}\n\n/**\n * Default configuration values\n */\nexport const defaultConfig: GraphQLRouterConfig = {\n path: \"/graphql\",\n graphiql: false,\n complexity: undefined,\n introspection: true,\n cacheControl: undefined,\n}\n\n/**\n * Normalize user-provided config (which may use boolean shorthand for graphiql)\n * into the full GraphQLRouterConfig format\n */\nexport interface GraphQLRouterConfigInput {\n readonly path?: string\n readonly graphiql?: boolean | Partial<GraphiQLConfig>\n /** Query complexity limiting configuration */\n readonly complexity?: ComplexityConfig\n /** Enable introspection queries (default: true). Set to false in production. */\n readonly introspection?: boolean\n /** Cache control configuration for HTTP Cache-Control headers */\n readonly cacheControl?: CacheControlConfig\n}\n\nexport const normalizeConfig = (input: GraphQLRouterConfigInput = {}): GraphQLRouterConfig => {\n const path = input.path ?? defaultConfig.path\n\n let graphiql: false | GraphiQLConfig = false\n if (input.graphiql === true) {\n graphiql = { path: \"/graphiql\", endpoint: path }\n } else if (input.graphiql && typeof input.graphiql === \"object\") {\n graphiql = {\n path: input.graphiql.path ?? \"/graphiql\",\n endpoint: input.graphiql.endpoint ?? path,\n }\n }\n\n return {\n path,\n graphiql,\n complexity: input.complexity,\n introspection: input.introspection ?? true,\n cacheControl: input.cacheControl,\n }\n}\n\n/**\n * Effect Config for loading GraphQL router configuration from environment variables.\n *\n * Environment variables:\n * - GRAPHQL_PATH: Path for GraphQL endpoint (default: \"/graphql\")\n * - GRAPHQL_INTROSPECTION: Enable introspection queries (default: true)\n * - GRAPHIQL_ENABLED: Enable GraphiQL UI (default: false)\n * - GRAPHIQL_PATH: Path for GraphiQL UI (default: \"/graphiql\")\n * - GRAPHIQL_ENDPOINT: URL where GraphiQL sends requests (default: same as GRAPHQL_PATH)\n * - GRAPHQL_MAX_DEPTH: Maximum query depth (optional)\n * - GRAPHQL_MAX_COMPLEXITY: Maximum complexity score (optional)\n * - GRAPHQL_MAX_ALIASES: Maximum number of aliases (optional)\n * - GRAPHQL_MAX_FIELDS: Maximum number of fields (optional)\n * - GRAPHQL_DEFAULT_FIELD_COMPLEXITY: Default field complexity (default: 1)\n * - GRAPHQL_CACHE_CONTROL_ENABLED: Enable cache control headers (default: false)\n * - GRAPHQL_CACHE_CONTROL_DEFAULT_MAX_AGE: Default maxAge for root fields (default: 0)\n * - GRAPHQL_CACHE_CONTROL_DEFAULT_SCOPE: Default scope - PUBLIC or PRIVATE (default: PUBLIC)\n */\nexport const GraphQLRouterConfigFromEnv: Config.Config<GraphQLRouterConfig> = Config.all({\n path: Config.string(\"GRAPHQL_PATH\").pipe(Config.withDefault(\"/graphql\")),\n introspection: Config.boolean(\"GRAPHQL_INTROSPECTION\").pipe(Config.withDefault(true)),\n graphiqlEnabled: Config.boolean(\"GRAPHIQL_ENABLED\").pipe(Config.withDefault(false)),\n graphiqlPath: Config.string(\"GRAPHIQL_PATH\").pipe(Config.withDefault(\"/graphiql\")),\n graphiqlEndpoint: Config.string(\"GRAPHIQL_ENDPOINT\").pipe(Config.option),\n maxDepth: Config.number(\"GRAPHQL_MAX_DEPTH\").pipe(Config.option),\n maxComplexity: Config.number(\"GRAPHQL_MAX_COMPLEXITY\").pipe(Config.option),\n maxAliases: Config.number(\"GRAPHQL_MAX_ALIASES\").pipe(Config.option),\n maxFields: Config.number(\"GRAPHQL_MAX_FIELDS\").pipe(Config.option),\n defaultFieldComplexity: Config.number(\"GRAPHQL_DEFAULT_FIELD_COMPLEXITY\").pipe(\n Config.withDefault(1)\n ),\n cacheControlEnabled: Config.boolean(\"GRAPHQL_CACHE_CONTROL_ENABLED\").pipe(\n Config.withDefault(false)\n ),\n cacheControlDefaultMaxAge: Config.number(\"GRAPHQL_CACHE_CONTROL_DEFAULT_MAX_AGE\").pipe(\n Config.withDefault(0)\n ),\n cacheControlDefaultScope: Config.string(\"GRAPHQL_CACHE_CONTROL_DEFAULT_SCOPE\").pipe(\n Config.withDefault(\"PUBLIC\")\n ),\n}).pipe(\n Config.map(\n ({\n path,\n introspection,\n graphiqlEnabled,\n graphiqlPath,\n graphiqlEndpoint,\n maxDepth,\n maxComplexity,\n maxAliases,\n maxFields,\n defaultFieldComplexity,\n cacheControlEnabled,\n cacheControlDefaultMaxAge,\n cacheControlDefaultScope,\n }) => {\n // Check if any complexity option is set\n const hasComplexity =\n Option.isSome(maxDepth) ||\n Option.isSome(maxComplexity) ||\n Option.isSome(maxAliases) ||\n Option.isSome(maxFields)\n\n return {\n path,\n introspection,\n graphiql: graphiqlEnabled\n ? {\n path: graphiqlPath,\n endpoint: Option.isSome(graphiqlEndpoint) ? graphiqlEndpoint.value : path,\n }\n : (false as const),\n complexity: hasComplexity\n ? {\n maxDepth: Option.getOrUndefined(maxDepth),\n maxComplexity: Option.getOrUndefined(maxComplexity),\n maxAliases: Option.getOrUndefined(maxAliases),\n maxFields: Option.getOrUndefined(maxFields),\n defaultFieldComplexity,\n }\n : undefined,\n cacheControl: cacheControlEnabled\n ? {\n enabled: true,\n defaultMaxAge: cacheControlDefaultMaxAge,\n defaultScope: (cacheControlDefaultScope === \"PRIVATE\"\n ? \"PRIVATE\"\n : \"PUBLIC\") as import(\"../builder/types\").CacheControlScope,\n calculateHttpHeaders: true,\n }\n : undefined,\n }\n }\n )\n)\n","/**\n * Generate HTML for GraphiQL IDE, loading dependencies from CDN\n */\nexport const graphiqlHtml = (\n endpoint: string,\n subscriptionEndpoint?: string\n): string => `<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>GraphiQL</title>\n <link\n rel=\"stylesheet\"\n href=\"https://unpkg.com/graphiql@3/graphiql.min.css\"\n />\n </head>\n <body style=\"margin: 0; overflow: hidden;\">\n <div id=\"graphiql\" style=\"height: 100vh;\"></div>\n <script\n crossorigin\n src=\"https://unpkg.com/react@18/umd/react.production.min.js\"\n ></script>\n <script\n crossorigin\n src=\"https://unpkg.com/react-dom@18/umd/react-dom.production.min.js\"\n ></script>\n <script\n crossorigin\n src=\"https://unpkg.com/graphiql@3/graphiql.min.js\"\n ></script>\n <script>\n const fetcher = GraphiQL.createFetcher({\n url: ${JSON.stringify(endpoint)},\n subscriptionUrl: ${JSON.stringify(subscriptionEndpoint ?? endpoint)},\n });\n ReactDOM.createRoot(document.getElementById('graphiql')).render(\n React.createElement(GraphiQL, { fetcher })\n );\n </script>\n </body>\n</html>`\n","import { Effect, Option, Config, Data } from \"effect\"\nimport {\n DocumentNode,\n OperationDefinitionNode,\n FieldNode,\n FragmentDefinitionNode,\n FragmentSpreadNode,\n InlineFragmentNode,\n SelectionSetNode,\n GraphQLSchema,\n GraphQLObjectType,\n GraphQLOutputType,\n GraphQLNonNull,\n GraphQLList,\n Kind,\n parse,\n} from \"graphql\"\n\n// ============================================================================\n// Errors\n// ============================================================================\n\n/**\n * Error thrown when query complexity exceeds configured limits\n */\nexport class ComplexityLimitExceededError extends Data.TaggedError(\"ComplexityLimitExceededError\")<{\n readonly message: string\n readonly limit: number\n readonly actual: number\n readonly limitType: \"depth\" | \"complexity\" | \"aliases\" | \"fields\"\n}> {}\n\n/**\n * Error thrown when complexity analysis fails\n */\nexport class ComplexityAnalysisError extends Data.TaggedError(\"ComplexityAnalysisError\")<{\n readonly message: string\n readonly cause?: unknown\n}> {}\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Result of complexity analysis for a GraphQL operation\n */\nexport interface ComplexityResult {\n /** Maximum depth of the query */\n readonly depth: number\n /** Total complexity score */\n readonly complexity: number\n /** Number of field selections (including nested) */\n readonly fieldCount: number\n /** Number of aliased fields */\n readonly aliasCount: number\n}\n\n/**\n * Information provided to complexity calculators\n */\nexport interface ComplexityAnalysisInfo {\n /** Parsed GraphQL document */\n readonly document: DocumentNode\n /** The operation being executed */\n readonly operation: OperationDefinitionNode\n /** Variables provided with the query */\n readonly variables?: Record<string, unknown>\n /** The GraphQL schema */\n readonly schema: GraphQLSchema\n /** Field complexity definitions from the builder */\n readonly fieldComplexities: FieldComplexityMap\n}\n\n/**\n * Information provided when complexity limit is exceeded\n */\nexport interface ComplexityExceededInfo {\n /** The computed complexity result */\n readonly result: ComplexityResult\n /** Which limit was exceeded */\n readonly exceededLimit: \"depth\" | \"complexity\" | \"aliases\" | \"fields\"\n /** The limit value */\n readonly limit: number\n /** The actual value */\n readonly actual: number\n /** The query that exceeded limits */\n readonly query: string\n /** Operation name if provided */\n readonly operationName?: string\n}\n\n/**\n * Complexity value for a field - can be static or dynamic based on arguments\n */\nexport type FieldComplexity = number | ((args: Record<string, unknown>) => number)\n\n/**\n * Map of type.field -> complexity\n */\nexport type FieldComplexityMap = Map<string, FieldComplexity>\n\n/**\n * Custom complexity calculator function.\n * Must be self-contained (no service requirements).\n */\nexport type ComplexityCalculator = (\n info: ComplexityAnalysisInfo\n) => Effect.Effect<ComplexityResult, ComplexityAnalysisError, never>\n\n/**\n * Configuration for query complexity limiting\n */\nexport interface ComplexityConfig {\n /**\n * Maximum allowed query depth.\n * Depth is the deepest nesting level in the query.\n * @example\n * // Depth 3:\n * // { user { posts { comments { text } } } }\n */\n readonly maxDepth?: number\n\n /**\n * Maximum allowed total complexity score.\n * Complexity is calculated by summing field costs.\n */\n readonly maxComplexity?: number\n\n /**\n * Maximum number of field aliases allowed.\n * Prevents response explosion attacks via aliases.\n */\n readonly maxAliases?: number\n\n /**\n * Maximum total number of fields in the query.\n * Includes all nested field selections.\n */\n readonly maxFields?: number\n\n /**\n * Default complexity cost for fields without explicit costs.\n * @default 1\n */\n readonly defaultFieldComplexity?: number\n\n /**\n * Custom complexity calculator.\n * If provided, this is used instead of the default calculator.\n * Can be used to implement custom cost algorithms.\n */\n readonly calculator?: ComplexityCalculator\n\n /**\n * Hook called when a limit is exceeded.\n * Useful for logging, metrics, or custom handling.\n * This is called BEFORE the error is thrown.\n * Must be self-contained (no service requirements).\n */\n readonly onExceeded?: (info: ComplexityExceededInfo) => Effect.Effect<void, never, never>\n}\n\n// ============================================================================\n// Default Calculator\n// ============================================================================\n\n/**\n * Default complexity calculator that walks the AST and computes:\n * - depth: Maximum nesting level\n * - complexity: Sum of field costs\n * - fieldCount: Total number of field selections\n * - aliasCount: Number of aliased fields\n */\nexport const defaultComplexityCalculator = (defaultCost: number = 1): ComplexityCalculator => {\n return (info: ComplexityAnalysisInfo) =>\n Effect.try({\n try: () => {\n const fragments = new Map<string, FragmentDefinitionNode>()\n\n // Collect fragment definitions\n for (const definition of info.document.definitions) {\n if (definition.kind === Kind.FRAGMENT_DEFINITION) {\n fragments.set(definition.name.value, definition)\n }\n }\n\n // Get the root type for the operation\n const rootType = getRootType(info.schema, info.operation.operation)\n if (!rootType) {\n throw new Error(`No root type found for operation: ${info.operation.operation}`)\n }\n\n // Analyze the selection set\n const result = analyzeSelectionSet(\n info.operation.selectionSet,\n rootType,\n info.schema,\n fragments,\n info.fieldComplexities,\n info.variables ?? {},\n defaultCost,\n 1, // Starting depth\n new Set() // Visited fragments to prevent infinite loops\n )\n\n return result\n },\n catch: (error) =>\n new ComplexityAnalysisError({\n message: `Failed to analyze query complexity: ${error}`,\n cause: error,\n }),\n })\n}\n\n/**\n * Get the root type for an operation\n */\nfunction getRootType(\n schema: GraphQLSchema,\n operation: \"query\" | \"mutation\" | \"subscription\"\n): GraphQLObjectType | null {\n switch (operation) {\n case \"query\":\n return schema.getQueryType() ?? null\n case \"mutation\":\n return schema.getMutationType() ?? null\n case \"subscription\":\n return schema.getSubscriptionType() ?? null\n }\n}\n\n/**\n * Get the named type from a potentially wrapped type\n */\nfunction getNamedType(type: GraphQLOutputType): GraphQLObjectType | null {\n if (type instanceof GraphQLNonNull || type instanceof GraphQLList) {\n return getNamedType(type.ofType as GraphQLOutputType)\n }\n if (type instanceof GraphQLObjectType) {\n return type\n }\n return null\n}\n\n/**\n * Merge a child result into an accumulator (mutates accumulator)\n */\nfunction accumulateResult(\n acc: { maxDepth: number; complexity: number; fieldCount: number; aliasCount: number },\n result: ComplexityResult\n): void {\n acc.maxDepth = Math.max(acc.maxDepth, result.depth)\n acc.complexity += result.complexity\n acc.fieldCount += result.fieldCount\n acc.aliasCount += result.aliasCount\n}\n\n/**\n * Analysis context passed through the recursive analysis functions\n */\ninterface AnalysisContext {\n readonly schema: GraphQLSchema\n readonly fragments: Map<string, FragmentDefinitionNode>\n readonly fieldComplexities: FieldComplexityMap\n readonly variables: Record<string, unknown>\n readonly defaultCost: number\n}\n\n/**\n * Analyze a selection set and return complexity metrics\n */\nfunction analyzeSelectionSet(\n selectionSet: SelectionSetNode,\n parentType: GraphQLObjectType,\n schema: GraphQLSchema,\n fragments: Map<string, FragmentDefinitionNode>,\n fieldComplexities: FieldComplexityMap,\n variables: Record<string, unknown>,\n defaultCost: number,\n currentDepth: number,\n visitedFragments: Set<string>\n): ComplexityResult {\n const ctx: AnalysisContext = { schema, fragments, fieldComplexities, variables, defaultCost }\n const acc = { maxDepth: currentDepth, complexity: 0, fieldCount: 0, aliasCount: 0 }\n\n for (const selection of selectionSet.selections) {\n const result = analyzeSelection(selection, parentType, ctx, currentDepth, visitedFragments)\n accumulateResult(acc, result)\n }\n\n return {\n depth: acc.maxDepth,\n complexity: acc.complexity,\n fieldCount: acc.fieldCount,\n aliasCount: acc.aliasCount,\n }\n}\n\n/**\n * Analyze a single selection node (field, fragment spread, or inline fragment)\n */\nfunction analyzeSelection(\n selection: FieldNode | FragmentSpreadNode | InlineFragmentNode,\n parentType: GraphQLObjectType,\n ctx: AnalysisContext,\n currentDepth: number,\n visitedFragments: Set<string>\n): ComplexityResult {\n switch (selection.kind) {\n case Kind.FIELD:\n return analyzeField(selection, parentType, ctx, currentDepth, visitedFragments)\n case Kind.FRAGMENT_SPREAD:\n return analyzeFragmentSpread(selection, ctx, currentDepth, visitedFragments)\n case Kind.INLINE_FRAGMENT:\n return analyzeInlineFragment(selection, parentType, ctx, currentDepth, visitedFragments)\n }\n}\n\n/**\n * Analyze a field node\n */\nfunction analyzeField(\n field: FieldNode,\n parentType: GraphQLObjectType,\n ctx: AnalysisContext,\n currentDepth: number,\n visitedFragments: Set<string>\n): ComplexityResult {\n const fieldName = field.name.value\n const aliasCount = field.alias ? 1 : 0\n\n // Introspection fields\n if (fieldName.startsWith(\"__\")) {\n return { depth: currentDepth, complexity: 0, fieldCount: 1, aliasCount }\n }\n\n // Get the field from the schema\n const schemaField = parentType.getFields()[fieldName]\n if (!schemaField) {\n // Field not found - skip (will be caught by validation)\n return { depth: currentDepth, complexity: ctx.defaultCost, fieldCount: 1, aliasCount }\n }\n\n // Calculate field arguments\n const args = resolveFieldArguments(field, ctx.variables)\n\n // Get field complexity\n const complexityKey = `${parentType.name}.${fieldName}`\n const fieldComplexity = ctx.fieldComplexities.get(complexityKey)\n const cost =\n fieldComplexity !== undefined\n ? typeof fieldComplexity === \"function\"\n ? fieldComplexity(args)\n : fieldComplexity\n : ctx.defaultCost\n\n // If the field has a selection set, analyze it\n if (field.selectionSet) {\n const fieldType = getNamedType(schemaField.type)\n if (fieldType) {\n const nestedResult = analyzeSelectionSet(\n field.selectionSet,\n fieldType,\n ctx.schema,\n ctx.fragments,\n ctx.fieldComplexities,\n ctx.variables,\n ctx.defaultCost,\n currentDepth + 1,\n visitedFragments\n )\n return {\n depth: nestedResult.depth,\n complexity: cost + nestedResult.complexity,\n fieldCount: 1 + nestedResult.fieldCount,\n aliasCount: aliasCount + nestedResult.aliasCount,\n }\n }\n }\n\n return { depth: currentDepth, complexity: cost, fieldCount: 1, aliasCount }\n}\n\n/**\n * Analyze a fragment spread\n */\nfunction analyzeFragmentSpread(\n spread: FragmentSpreadNode,\n ctx: AnalysisContext,\n currentDepth: number,\n visitedFragments: Set<string>\n): ComplexityResult {\n const fragmentName = spread.name.value\n\n // Prevent infinite loops with fragment cycles\n if (visitedFragments.has(fragmentName)) {\n return { depth: currentDepth, complexity: 0, fieldCount: 0, aliasCount: 0 }\n }\n\n const fragment = ctx.fragments.get(fragmentName)\n if (!fragment) {\n return { depth: currentDepth, complexity: 0, fieldCount: 0, aliasCount: 0 }\n }\n\n const fragmentType = ctx.schema.getType(fragment.typeCondition.name.value)\n if (!(fragmentType instanceof GraphQLObjectType)) {\n return { depth: currentDepth, complexity: 0, fieldCount: 0, aliasCount: 0 }\n }\n\n const newVisited = new Set(visitedFragments)\n newVisited.add(fragmentName)\n\n return analyzeSelectionSet(\n fragment.selectionSet,\n fragmentType,\n ctx.schema,\n ctx.fragments,\n ctx.fieldComplexities,\n ctx.variables,\n ctx.defaultCost,\n currentDepth,\n newVisited\n )\n}\n\n/**\n * Analyze an inline fragment\n */\nfunction analyzeInlineFragment(\n fragment: InlineFragmentNode,\n parentType: GraphQLObjectType,\n ctx: AnalysisContext,\n currentDepth: number,\n visitedFragments: Set<string>\n): ComplexityResult {\n let targetType = parentType\n\n if (fragment.typeCondition) {\n const conditionType = ctx.schema.getType(fragment.typeCondition.name.value)\n if (conditionType instanceof GraphQLObjectType) {\n targetType = conditionType\n }\n }\n\n return analyzeSelectionSet(\n fragment.selectionSet,\n targetType,\n ctx.schema,\n ctx.fragments,\n ctx.fieldComplexities,\n ctx.variables,\n ctx.defaultCost,\n currentDepth,\n visitedFragments\n )\n}\n\n/**\n * Resolve field arguments, substituting variables\n */\nfunction resolveFieldArguments(\n field: FieldNode,\n variables: Record<string, unknown>\n): Record<string, unknown> {\n const args: Record<string, unknown> = {}\n\n if (!field.arguments) {\n return args\n }\n\n for (const arg of field.arguments) {\n const value = arg.value\n switch (value.kind) {\n case Kind.VARIABLE:\n args[arg.name.value] = variables[value.name.value]\n break\n case Kind.INT:\n args[arg.name.value] = parseInt(value.value, 10)\n break\n case Kind.FLOAT:\n args[arg.name.value] = parseFloat(value.value)\n break\n case Kind.STRING:\n args[arg.name.value] = value.value\n break\n case Kind.BOOLEAN:\n args[arg.name.value] = value.value\n break\n case Kind.NULL:\n args[arg.name.value] = null\n break\n case Kind.ENUM:\n args[arg.name.value] = value.value\n break\n case Kind.LIST:\n // Simplified - just use empty array for complexity calculation\n args[arg.name.value] = []\n break\n case Kind.OBJECT:\n // Simplified - just use empty object for complexity calculation\n args[arg.name.value] = {}\n break\n }\n }\n\n return args\n}\n\n// ============================================================================\n// Validation\n// ============================================================================\n\n/**\n * Validate query complexity against configured limits.\n * Returns the complexity result if within limits, or fails with ComplexityLimitExceededError.\n */\nexport const validateComplexity = (\n query: string,\n operationName: string | undefined,\n variables: Record<string, unknown> | undefined,\n schema: GraphQLSchema,\n fieldComplexities: FieldComplexityMap,\n config: ComplexityConfig\n): Effect.Effect<ComplexityResult, ComplexityLimitExceededError | ComplexityAnalysisError, never> =>\n Effect.gen(function* () {\n // Parse the query\n const document = yield* Effect.try({\n try: () => parse(query),\n catch: (error) =>\n new ComplexityAnalysisError({\n message: `Failed to parse query: ${error}`,\n cause: error,\n }),\n })\n\n // Find the operation\n const operation = yield* Effect.try({\n try: () => {\n const operations = document.definitions.filter(\n (d): d is OperationDefinitionNode => d.kind === Kind.OPERATION_DEFINITION\n )\n\n if (operations.length === 0) {\n throw new Error(\"No operation found in query\")\n }\n\n if (operationName) {\n const op = operations.find((o) => o.name?.value === operationName)\n if (!op) {\n throw new Error(`Operation \"${operationName}\" not found`)\n }\n return op\n }\n\n if (operations.length > 1) {\n throw new Error(\"Multiple operations found - operationName required\")\n }\n\n return operations[0]\n },\n catch: (error) =>\n new ComplexityAnalysisError({\n message: String(error),\n cause: error,\n }),\n })\n\n // Calculate complexity\n const calculator =\n config.calculator ?? defaultComplexityCalculator(config.defaultFieldComplexity ?? 1)\n\n const result = yield* calculator({\n document,\n operation,\n variables,\n schema,\n fieldComplexities,\n })\n\n // Check limits\n const checkLimit = (\n limitType: \"depth\" | \"complexity\" | \"aliases\" | \"fields\",\n limit: number | undefined,\n actual: number\n ) =>\n Effect.gen(function* () {\n if (limit !== undefined && actual > limit) {\n const exceededInfo: ComplexityExceededInfo = {\n result,\n exceededLimit: limitType,\n limit,\n actual,\n query,\n operationName,\n }\n\n // Call onExceeded hook if provided\n if (config.onExceeded) {\n yield* config.onExceeded(exceededInfo)\n }\n\n yield* Effect.fail(\n new ComplexityLimitExceededError({\n message: `Query ${limitType} of ${actual} exceeds maximum allowed ${limitType} of ${limit}`,\n limit,\n actual,\n limitType,\n })\n )\n }\n })\n\n yield* checkLimit(\"depth\", config.maxDepth, result.depth)\n yield* checkLimit(\"complexity\", config.maxComplexity, result.complexity)\n yield* checkLimit(\"aliases\", config.maxAliases, result.aliasCount)\n yield* checkLimit(\"fields\", config.maxFields, result.fieldCount)\n\n return result\n })\n\n// ============================================================================\n// Environment Configuration\n// ============================================================================\n\n/**\n * Effect Config for loading complexity configuration from environment variables.\n *\n * Environment variables:\n * - GRAPHQL_MAX_DEPTH: Maximum query depth\n * - GRAPHQL_MAX_COMPLEXITY: Maximum complexity score\n * - GRAPHQL_MAX_ALIASES: Maximum number of aliases\n * - GRAPHQL_MAX_FIELDS: Maximum number of fields\n * - GRAPHQL_DEFAULT_FIELD_COMPLEXITY: Default field complexity (default: 1)\n */\nexport const ComplexityConfigFromEnv: Config.Config<ComplexityConfig> = Config.all({\n maxDepth: Config.number(\"GRAPHQL_MAX_DEPTH\").pipe(Config.option),\n maxComplexity: Config.number(\"GRAPHQL_MAX_COMPLEXITY\").pipe(Config.option),\n maxAliases: Config.number(\"GRAPHQL_MAX_ALIASES\").pipe(Config.option),\n maxFields: Config.number(\"GRAPHQL_MAX_FIELDS\").pipe(Config.option),\n defaultFieldComplexity: Config.number(\"GRAPHQL_DEFAULT_FIELD_COMPLEXITY\").pipe(\n Config.withDefault(1)\n ),\n}).pipe(\n Config.map(({ maxDepth, maxComplexity, maxAliases, maxFields, defaultFieldComplexity }) => ({\n maxDepth: Option.getOrUndefined(maxDepth),\n maxComplexity: Option.getOrUndefined(maxComplexity),\n maxAliases: Option.getOrUndefined(maxAliases),\n maxFields: Option.getOrUndefined(maxFields),\n defaultFieldComplexity,\n }))\n)\n\n// ============================================================================\n// Utility Calculators\n// ============================================================================\n\n/**\n * A simple depth-only calculator that only tracks query depth.\n * Use this when you only care about depth limiting and want fast validation.\n */\nexport const depthOnlyCalculator: ComplexityCalculator = (info) =>\n Effect.try({\n try: () => {\n const fragments = new Map<string, FragmentDefinitionNode>()\n for (const definition of info.document.definitions) {\n if (definition.kind === Kind.FRAGMENT_DEFINITION) {\n fragments.set(definition.name.value, definition)\n }\n }\n\n const depth = calculateMaxDepth(info.operation.selectionSet, fragments, 1, new Set())\n\n return {\n depth,\n complexity: 0,\n fieldCount: 0,\n aliasCount: 0,\n }\n },\n catch: (error) =>\n new ComplexityAnalysisError({\n message: `Failed to analyze query depth: ${error}`,\n cause: error,\n }),\n })\n\nfunction calculateMaxDepth(\n selectionSet: SelectionSetNode,\n fragments: Map<string, FragmentDefinitionNode>,\n currentDepth: number,\n visitedFragments: Set<string>\n): number {\n let maxDepth = currentDepth\n\n for (const selection of selectionSet.selections) {\n switch (selection.kind) {\n case Kind.FIELD:\n if (selection.selectionSet) {\n const nestedDepth = calculateMaxDepth(\n selection.selectionSet,\n fragments,\n currentDepth + 1,\n visitedFragments\n )\n maxDepth = Math.max(maxDepth, nestedDepth)\n }\n break\n\n case Kind.FRAGMENT_SPREAD: {\n const fragmentName = selection.name.value\n if (!visitedFragments.has(fragmentName)) {\n const fragment = fragments.get(fragmentName)\n if (fragment) {\n const newVisited = new Set(visitedFragments)\n newVisited.add(fragmentName)\n const fragmentDepth = calculateMaxDepth(\n fragment.selectionSet,\n fragments,\n currentDepth,\n newVisited\n )\n maxDepth = Math.max(maxDepth, fragmentDepth)\n }\n }\n break\n }\n\n case Kind.INLINE_FRAGMENT: {\n const inlineDepth = calculateMaxDepth(\n selection.selectionSet,\n fragments,\n currentDepth,\n visitedFragments\n )\n maxDepth = Math.max(maxDepth, inlineDepth)\n break\n }\n }\n }\n\n return maxDepth\n}\n\n/**\n * Combine multiple calculators - returns the maximum values from all calculators.\n */\nexport const combineCalculators = (\n ...calculators: ComplexityCalculator[]\n): ComplexityCalculator => {\n return (info) =>\n Effect.gen(function* () {\n let maxDepth = 0\n let maxComplexity = 0\n let maxFieldCount = 0\n let maxAliasCount = 0\n\n for (const calculator of calculators) {\n const result = yield* calculator(info)\n maxDepth = Math.max(maxDepth, result.depth)\n maxComplexity = Math.max(maxComplexity, result.complexity)\n maxFieldCount = Math.max(maxFieldCount, result.fieldCount)\n maxAliasCount = Math.max(maxAliasCount, result.aliasCount)\n }\n\n return {\n depth: maxDepth,\n complexity: maxComplexity,\n fieldCount: maxFieldCount,\n aliasCount: maxAliasCount,\n }\n })\n}\n","import { Effect, Config } from \"effect\"\nimport {\n DocumentNode,\n OperationDefinitionNode,\n FieldNode,\n FragmentDefinitionNode,\n SelectionSetNode,\n GraphQLSchema,\n GraphQLObjectType,\n GraphQLOutputType,\n GraphQLNonNull,\n GraphQLList,\n GraphQLScalarType,\n GraphQLEnumType,\n Kind,\n parse,\n} from \"graphql\"\nimport type { CacheHint, CacheControlScope } from \"../builder/types\"\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Map of type.field -> cache hint, or type -> cache hint for type-level hints\n */\nexport type CacheHintMap = Map<string, CacheHint>\n\n/**\n * Computed cache policy for a GraphQL response\n */\nexport interface CachePolicy {\n /**\n * Maximum age in seconds the response can be cached.\n * This is the minimum maxAge of all resolved fields.\n * If 0, the response should not be cached.\n */\n readonly maxAge: number\n\n /**\n * Cache scope - PUBLIC means CDN-cacheable, PRIVATE means browser-only.\n * If any field is PRIVATE, the entire response is PRIVATE.\n */\n readonly scope: CacheControlScope\n}\n\n/**\n * Configuration for cache control\n */\nexport interface CacheControlConfig {\n /**\n * Enable cache control header calculation.\n * @default true\n */\n readonly enabled?: boolean\n\n /**\n * Default maxAge for root fields (Query, Mutation).\n * @default 0 (no caching)\n */\n readonly defaultMaxAge?: number\n\n /**\n * Default scope for fields without explicit scope.\n * @default \"PUBLIC\"\n */\n readonly defaultScope?: CacheControlScope\n\n /**\n * Whether to set HTTP Cache-Control headers on responses.\n * @default true\n */\n readonly calculateHttpHeaders?: boolean\n}\n\n/**\n * Information provided to cache policy calculation\n */\nexport interface CachePolicyAnalysisInfo {\n /** Parsed GraphQL document */\n readonly document: DocumentNode\n /** The operation being executed */\n readonly operation: OperationDefinitionNode\n /** The GraphQL schema */\n readonly schema: GraphQLSchema\n /** Cache hints from the builder (type.field -> hint or type -> hint) */\n readonly cacheHints: CacheHintMap\n /** Configuration options */\n readonly config: CacheControlConfig\n}\n\n// ============================================================================\n// Cache Policy Computation\n// ============================================================================\n\n/**\n * Compute the cache policy for a GraphQL response based on the fields resolved.\n *\n * The policy is computed by walking the selection set and aggregating hints:\n * - maxAge: Use the minimum maxAge of all resolved fields\n * - scope: If any field is PRIVATE, the entire response is PRIVATE\n *\n * Default behaviors (matching Apollo):\n * - Root fields default to maxAge: 0 (unless configured otherwise)\n * - Object-returning fields default to maxAge: 0\n * - Scalar fields inherit their parent's maxAge\n * - Fields with inheritMaxAge: true inherit from parent\n */\nexport const computeCachePolicy = (\n info: CachePolicyAnalysisInfo\n): Effect.Effect<CachePolicy, never, never> =>\n Effect.sync(() => {\n const fragments = new Map<string, FragmentDefinitionNode>()\n\n // Collect fragment definitions\n for (const definition of info.document.definitions) {\n if (definition.kind === Kind.FRAGMENT_DEFINITION) {\n fragments.set(definition.name.value, definition)\n }\n }\n\n // Get the root type for the operation\n const rootType = getRootType(info.schema, info.operation.operation)\n if (!rootType) {\n // No root type - return no-cache\n return { maxAge: 0, scope: \"PUBLIC\" as const }\n }\n\n const defaultMaxAge = info.config.defaultMaxAge ?? 0\n const defaultScope = info.config.defaultScope ?? \"PUBLIC\"\n\n // Analyze the selection set\n const result = analyzeSelectionSet(\n info.operation.selectionSet,\n rootType,\n info.schema,\n fragments,\n info.cacheHints,\n defaultMaxAge,\n defaultScope,\n undefined, // No parent maxAge for root\n new Set()\n )\n\n return result\n })\n\n/**\n * Compute cache policy from a query string\n */\nexport const computeCachePolicyFromQuery = (\n query: string,\n operationName: string | undefined,\n schema: GraphQLSchema,\n cacheHints: CacheHintMap,\n config: CacheControlConfig = {}\n): Effect.Effect<CachePolicy, Error, never> =>\n Effect.gen(function* () {\n // Parse the query\n const document = yield* Effect.try({\n try: () => parse(query),\n catch: (error) => new Error(`Failed to parse query: ${error}`),\n })\n\n // Find the operation\n const operation = yield* Effect.try({\n try: () => {\n const operations = document.definitions.filter(\n (d): d is OperationDefinitionNode => d.kind === Kind.OPERATION_DEFINITION\n )\n\n if (operations.length === 0) {\n throw new Error(\"No operation found in query\")\n }\n\n if (operationName) {\n const op = operations.find((o) => o.name?.value === operationName)\n if (!op) {\n throw new Error(`Operation \"${operationName}\" not found`)\n }\n return op\n }\n\n if (operations.length > 1) {\n throw new Error(\"Multiple operations found - operationName required\")\n }\n\n return operations[0]\n },\n catch: (error) => error as Error,\n })\n\n return yield* computeCachePolicy({\n document,\n operation,\n schema,\n cacheHints,\n config,\n })\n })\n\n/**\n * Convert a cache policy to an HTTP Cache-Control header value\n */\nexport const toCacheControlHeader = (policy: CachePolicy): string => {\n if (policy.maxAge === 0) {\n return \"no-store\"\n }\n\n const directives: string[] = []\n directives.push(policy.scope === \"PRIVATE\" ? \"private\" : \"public\")\n directives.push(`max-age=${policy.maxAge}`)\n\n return directives.join(\", \")\n}\n\n// ============================================================================\n// Internal Helpers\n// ============================================================================\n\n/**\n * Get the root type for an operation\n */\nfunction getRootType(\n schema: GraphQLSchema,\n operation: \"query\" | \"mutation\" | \"subscription\"\n): GraphQLObjectType | null {\n switch (operation) {\n case \"query\":\n return schema.getQueryType() ?? null\n case \"mutation\":\n return schema.getMutationType() ?? null\n case \"subscription\":\n return schema.getSubscriptionType() ?? null\n }\n}\n\n/**\n * Get the named type from a potentially wrapped type\n */\nfunction getNamedType(\n type: GraphQLOutputType\n): GraphQLObjectType | GraphQLScalarType | GraphQLEnumType | null {\n if (type instanceof GraphQLNonNull || type instanceof GraphQLList) {\n return getNamedType(type.ofType as GraphQLOutputType)\n }\n if (\n type instanceof GraphQLObjectType ||\n type instanceof GraphQLScalarType ||\n type instanceof GraphQLEnumType\n ) {\n return type\n }\n return null\n}\n\n/**\n * Check if a type is a scalar or enum (leaf type)\n */\nfunction isLeafType(type: GraphQLOutputType): boolean {\n const namedType = getNamedType(type)\n return namedType instanceof GraphQLScalarType || namedType instanceof GraphQLEnumType\n}\n\n/**\n * Context passed through the analysis functions\n */\ninterface AnalysisContext {\n schema: GraphQLSchema\n fragments: Map<string, FragmentDefinitionNode>\n cacheHints: CacheHintMap\n defaultMaxAge: number\n defaultScope: CacheControlScope\n}\n\n/**\n * Mutable state for aggregating cache policies\n */\ninterface PolicyAccumulator {\n minMaxAge: number | undefined\n hasPrivate: boolean\n}\n\n/**\n * Aggregate a field policy into the accumulator\n */\nfunction aggregatePolicy(acc: PolicyAccumulator, policy: CachePolicy): void {\n if (acc.minMaxAge === undefined) {\n acc.minMaxAge = policy.maxAge\n } else {\n acc.minMaxAge = Math.min(acc.minMaxAge, policy.maxAge)\n }\n if (policy.scope === \"PRIVATE\") {\n acc.hasPrivate = true\n }\n}\n\n/**\n * Analyze a fragment spread and return its cache policy\n */\nfunction analyzeFragmentSpread(\n fragmentName: string,\n ctx: AnalysisContext,\n parentMaxAge: number | undefined,\n visitedFragments: Set<string>\n): CachePolicy | undefined {\n // Prevent infinite loops with fragment cycles\n if (visitedFragments.has(fragmentName)) {\n return undefined\n }\n\n const fragment = ctx.fragments.get(fragmentName)\n if (!fragment) {\n return undefined\n }\n\n const fragmentType = ctx.schema.getType(fragment.typeCondition.name.value)\n if (!(fragmentType instanceof GraphQLObjectType)) {\n return undefined\n }\n\n const newVisited = new Set(visitedFragments)\n newVisited.add(fragmentName)\n\n return analyzeSelectionSet(fragment.selectionSet, fragmentType, ctx, parentMaxAge, newVisited)\n}\n\n/**\n * Analyze an inline fragment and return its cache policy\n */\nfunction analyzeInlineFragment(\n selection: { typeCondition?: { name: { value: string } }; selectionSet: SelectionSetNode },\n parentType: GraphQLObjectType,\n ctx: AnalysisContext,\n parentMaxAge: number | undefined,\n visitedFragments: Set<string>\n): CachePolicy {\n let targetType = parentType\n\n if (selection.typeCondition) {\n const conditionType = ctx.schema.getType(selection.typeCondition.name.value)\n if (conditionType instanceof GraphQLObjectType) {\n targetType = conditionType\n }\n }\n\n return analyzeSelectionSet(\n selection.selectionSet,\n targetType,\n ctx,\n parentMaxAge,\n visitedFragments\n )\n}\n\n/**\n * Look up the effective cache hint for a field (field-level > type-level > undefined)\n */\nfunction lookupEffectiveCacheHint(\n parentTypeName: string,\n fieldName: string,\n returnType: GraphQLOutputType,\n cacheHints: CacheHintMap\n): CacheHint | undefined {\n // Priority: field-level hint > type-level hint\n const fieldKey = `${parentTypeName}.${fieldName}`\n const fieldHint = cacheHints.get(fieldKey)\n if (fieldHint) return fieldHint\n\n // Check type-level hint on return type\n const namedType = getNamedType(returnType)\n return namedType ? cacheHints.get(namedType.name) : undefined\n}\n\n/**\n * Compute the maxAge for a field based on hint, inheritance, and field type\n */\nfunction computeFieldMaxAge(\n hint: CacheHint | undefined,\n fieldType: GraphQLOutputType,\n parentMaxAge: number | undefined,\n defaultMaxAge: number\n): number {\n if (hint) {\n // Use explicit hint\n if (hint.inheritMaxAge && parentMaxAge !== undefined) {\n return parentMaxAge\n }\n if (hint.maxAge !== undefined) {\n return hint.maxAge\n }\n // Fall through to default logic\n }\n\n // Scalar/enum fields inherit parent maxAge by default\n if (isLeafType(fieldType) && parentMaxAge !== undefined) {\n return parentMaxAge\n }\n\n // Root and object fields default to defaultMaxAge (typically 0)\n return defaultMaxAge\n}\n\n/**\n * Analyze a selection set and return the aggregated cache policy.\n * Overload with AnalysisContext for internal use.\n */\nfunction analyzeSelectionSet(\n selectionSet: SelectionSetNode,\n parentType: GraphQLObjectType,\n ctx: AnalysisContext,\n parentMaxAge: number | undefined,\n visitedFragments: Set<string>\n): CachePolicy\nfunction analyzeSelectionSet(\n selectionSet: SelectionSetNode,\n parentType: GraphQLObjectType,\n schema: GraphQLSchema,\n fragments: Map<string, FragmentDefinitionNode>,\n cacheHints: CacheHintMap,\n defaultMaxAge: number,\n defaultScope: CacheControlScope,\n parentMaxAge: number | undefined,\n visitedFragments: Set<string>\n): CachePolicy\nfunction analyzeSelectionSet(\n selectionSet: SelectionSetNode,\n parentType: GraphQLObjectType,\n schemaOrCtx: GraphQLSchema | AnalysisContext,\n fragmentsOrParentMaxAge: Map<string, FragmentDefinitionNode> | number | undefined,\n cacheHintsOrVisited?: CacheHintMap | Set<string>,\n defaultMaxAge?: number,\n defaultScope?: CacheControlScope,\n parentMaxAge?: number | undefined,\n visitedFragments?: Set<string>\n): CachePolicy {\n // Normalize arguments - support both old and new signatures\n let ctx: AnalysisContext\n let actualParentMaxAge: number | undefined\n let actualVisitedFragments: Set<string>\n\n if (schemaOrCtx instanceof GraphQLSchema) {\n // Old signature\n ctx = {\n schema: schemaOrCtx,\n fragments: fragmentsOrParentMaxAge as Map<string, FragmentDefinitionNode>,\n cacheHints: cacheHintsOrVisited as CacheHintMap,\n defaultMaxAge: defaultMaxAge!,\n defaultScope: defaultScope!,\n }\n actualParentMaxAge = parentMaxAge\n actualVisitedFragments = visitedFragments!\n } else {\n // New signature with AnalysisContext\n ctx = schemaOrCtx\n actualParentMaxAge = fragmentsOrParentMaxAge as number | undefined\n actualVisitedFragments = cacheHintsOrVisited as Set<string>\n }\n\n const acc: PolicyAccumulator = { minMaxAge: undefined, hasPrivate: false }\n\n for (const selection of selectionSet.selections) {\n let fieldPolicy: CachePolicy | undefined\n\n switch (selection.kind) {\n case Kind.FIELD:\n fieldPolicy = analyzeField(\n selection,\n parentType,\n ctx,\n actualParentMaxAge,\n actualVisitedFragments\n )\n break\n\n case Kind.FRAGMENT_SPREAD:\n fieldPolicy = analyzeFragmentSpread(\n selection.name.value,\n ctx,\n actualParentMaxAge,\n actualVisitedFragments\n )\n break\n\n case Kind.INLINE_FRAGMENT:\n fieldPolicy = analyzeInlineFragment(\n selection,\n parentType,\n ctx,\n actualParentMaxAge,\n actualVisitedFragments\n )\n break\n }\n\n if (fieldPolicy) {\n aggregatePolicy(acc, fieldPolicy)\n }\n }\n\n return {\n maxAge: acc.minMaxAge ?? ctx.defaultMaxAge,\n scope: acc.hasPrivate ? \"PRIVATE\" : ctx.defaultScope,\n }\n}\n\n/**\n * Analyze a field node and return its cache policy\n */\nfunction analyzeField(\n field: FieldNode,\n parentType: GraphQLObjectType,\n ctx: AnalysisContext,\n parentMaxAge: number | undefined,\n visitedFragments: Set<string>\n): CachePolicy {\n const fieldName = field.name.value\n\n // Introspection fields - don't affect caching\n if (fieldName.startsWith(\"__\")) {\n return { maxAge: Infinity, scope: \"PUBLIC\" }\n }\n\n // Get the field from the schema\n const schemaField = parentType.getFields()[fieldName]\n if (!schemaField) {\n return { maxAge: ctx.defaultMaxAge, scope: ctx.defaultScope }\n }\n\n // Look up effective cache hint\n const effectiveHint = lookupEffectiveCacheHint(\n parentType.name,\n fieldName,\n schemaField.type,\n ctx.cacheHints\n )\n\n // Compute field maxAge\n const fieldMaxAge = computeFieldMaxAge(\n effectiveHint,\n schemaField.type,\n parentMaxAge,\n ctx.defaultMaxAge\n )\n const fieldScope: CacheControlScope = effectiveHint?.scope ?? ctx.defaultScope\n\n // If the field has a selection set, analyze it\n const namedType = getNamedType(schemaField.type)\n if (field.selectionSet && namedType instanceof GraphQLObjectType) {\n const nestedPolicy = analyzeSelectionSet(\n field.selectionSet,\n namedType,\n ctx,\n fieldMaxAge,\n visitedFragments\n )\n\n return {\n maxAge: Math.min(fieldMaxAge, nestedPolicy.maxAge),\n scope: fieldScope === \"PRIVATE\" || nestedPolicy.scope === \"PRIVATE\" ? \"PRIVATE\" : \"PUBLIC\",\n }\n }\n\n return { maxAge: fieldMaxAge, scope: fieldScope }\n}\n\n// ============================================================================\n// Environment Configuration\n// ============================================================================\n\n/**\n * Effect Config for loading cache control configuration from environment variables.\n *\n * Environment variables:\n * - GRAPHQL_CACHE_CONTROL_ENABLED: Enable cache control (default: true)\n * - GRAPHQL_CACHE_CONTROL_DEFAULT_MAX_AGE: Default maxAge for root fields (default: 0)\n * - GRAPHQL_CACHE_CONTROL_DEFAULT_SCOPE: Default scope (PUBLIC or PRIVATE, default: PUBLIC)\n * - GRAPHQL_CACHE_CONTROL_HTTP_HEADERS: Set HTTP headers (default: true)\n */\nexport const CacheControlConfigFromEnv: Config.Config<CacheControlConfig> = Config.all({\n enabled: Config.boolean(\"GRAPHQL_CACHE_CONTROL_ENABLED\").pipe(Config.withDefault(true)),\n defaultMaxAge: Config.number(\"GRAPHQL_CACHE_CONTROL_DEFAULT_MAX_AGE\").pipe(Config.withDefault(0)),\n defaultScope: Config.string(\"GRAPHQL_CACHE_CONTROL_DEFAULT_SCOPE\").pipe(\n Config.withDefault(\"PUBLIC\"),\n Config.map((s) => (s === \"PRIVATE\" ? \"PRIVATE\" : \"PUBLIC\") as CacheControlScope)\n ),\n calculateHttpHeaders: Config.boolean(\"GRAPHQL_CACHE_CONTROL_HTTP_HEADERS\").pipe(\n Config.withDefault(true)\n ),\n})\n","import {\n HttpRouter,\n HttpServerRequest,\n HttpServerResponse,\n HttpIncomingMessage,\n HttpServerError,\n HttpBody,\n} from \"@effect/platform\"\nimport { Cause, Context, Effect, Layer, ParseResult, Schema } from \"effect\"\nimport {\n GraphQLSchema,\n parse,\n validate,\n specifiedRules,\n NoSchemaIntrospectionCustomRule,\n execute as graphqlExecute,\n Kind,\n type DocumentNode,\n type OperationDefinitionNode,\n} from \"graphql\"\nimport type { GraphQLEffectContext } from \"../builder/types\"\nimport { graphiqlHtml } from \"./graphiql\"\nimport { normalizeConfig, type GraphQLRouterConfigInput } from \"./config\"\nimport {\n validateComplexity,\n ComplexityLimitExceededError,\n type FieldComplexityMap,\n} from \"./complexity\"\nimport { computeCachePolicy, toCacheControlHeader, type CacheHintMap } from \"./cache-control\"\nimport {\n type GraphQLExtension,\n ExtensionsService,\n makeExtensionsService,\n runParseHooks,\n runValidateHooks,\n runExecuteStartHooks,\n runExecuteEndHooks,\n} from \"../extensions\"\n\n/**\n * Error handler function type for handling uncaught errors during GraphQL execution.\n * Receives the error cause and should return an HTTP response.\n */\nexport type ErrorHandler = (\n cause: Cause.Cause<unknown>\n) => Effect.Effect<HttpServerResponse.HttpServerResponse, never, never>\n\n/**\n * Default error handler that returns a 500 Internal Server Error.\n * In non-production environments, it logs the full error for debugging.\n */\nexport const defaultErrorHandler: ErrorHandler = (cause) =>\n (process.env.NODE_ENV !== \"production\"\n ? Effect.logError(\"GraphQL error\", cause)\n : Effect.void\n ).pipe(\n Effect.andThen(\n HttpServerResponse.json(\n {\n errors: [\n {\n message: \"An error occurred processing your request\",\n },\n ],\n },\n { status: 500 }\n ).pipe(Effect.orDie)\n )\n )\n\n/**\n * Schema for GraphQL request body.\n */\nconst GraphQLRequestBodySchema = Schema.Struct({\n query: Schema.String,\n variables: Schema.optionalWith(Schema.Record({ key: Schema.String, value: Schema.Unknown }), {\n as: \"Option\",\n }),\n operationName: Schema.optionalWith(Schema.String, { as: \"Option\" }),\n})\n\n/**\n * Request body for GraphQL queries.\n */\ninterface GraphQLRequestBody {\n readonly query: string\n readonly variables?: Record<string, unknown>\n readonly operationName?: string\n}\n\n/**\n * Decode the request body from JSON using the schema.\n */\nconst decodeRequestBody = HttpIncomingMessage.schemaBodyJson(GraphQLRequestBodySchema)\n\n/**\n * Union of all possible errors that can occur during GraphQL request handling.\n */\ntype GraphQLHandlerError =\n | HttpServerError.RequestError\n | HttpBody.HttpBodyError\n | ParseResult.ParseError\n | ComplexityLimitExceededError\n | Error\n\n/**\n * Result type for parseGraphQLQuery\n */\ntype ParseGraphQLQueryResult =\n | { ok: true; document: DocumentNode }\n | { ok: false; response: HttpServerResponse.HttpServerResponse }\n\n/**\n * Parse a GraphQL query string into a DocumentNode.\n * Returns the document or an error response if parsing fails.\n */\nconst parseGraphQLQuery = (\n query: string,\n extensionsService: Context.Tag.Service<typeof ExtensionsService>\n): Effect.Effect<ParseGraphQLQueryResult, never, never> => {\n try {\n const document = parse(query)\n return Effect.succeed({ ok: true as const, document })\n } catch (parseError) {\n return extensionsService.get().pipe(\n Effect.flatMap(\n (extensionData): Effect.Effect<ParseGraphQLQueryResult, never, never> =>\n HttpServerResponse.json({\n errors: [{ message: String(parseError) }],\n extensions: Object.keys(extensionData).length > 0 ? extensionData : undefined,\n }).pipe(\n Effect.orDie,\n Effect.map((response) => ({ ok: false as const, response }))\n )\n )\n )\n }\n}\n\n/**\n * Run complexity validation if configured.\n * Logs warnings for analysis errors but doesn't block execution.\n */\nconst runComplexityValidation = (\n body: GraphQLRequestBody,\n schema: GraphQLSchema,\n fieldComplexities: FieldComplexityMap,\n complexityConfig: { maxDepth?: number; maxComplexity?: number } | undefined\n): Effect.Effect<void, ComplexityLimitExceededError, never> => {\n if (!complexityConfig) {\n return Effect.void\n }\n\n return validateComplexity(\n body.query,\n body.operationName,\n body.variables,\n schema,\n fieldComplexities,\n complexityConfig\n ).pipe(\n Effect.catchTag(\"ComplexityLimitExceededError\", (error) => Effect.fail(error)),\n Effect.catchTag(\"ComplexityAnalysisError\", (error) =>\n Effect.logWarning(\"Complexity analysis failed\", error)\n )\n )\n}\n\n/**\n * Type guard to check if a value is a Promise-like object.\n */\nconst isPromiseLike = <T>(value: unknown): value is PromiseLike<T> =>\n value !== null && typeof value === \"object\" && \"then\" in value && typeof value.then === \"function\"\n\n/**\n * Execute a GraphQL query and handle async results.\n */\nconst executeGraphQLQuery = <R>(\n schema: GraphQLSchema,\n document: DocumentNode,\n variables: Record<string, unknown> | undefined,\n operationName: string | undefined,\n runtime: import(\"effect\").Runtime.Runtime<R>\n): Effect.Effect<import(\"graphql\").ExecutionResult, Error, never> => {\n type ExecutionResult = import(\"graphql\").ExecutionResult\n\n const tryExecute = Effect.try({\n try: () =>\n graphqlExecute({\n schema,\n document,\n variableValues: variables,\n operationName,\n contextValue: { runtime } satisfies GraphQLEffectContext<R>,\n }),\n catch: (error) => new Error(String(error)),\n })\n\n return tryExecute.pipe(\n Effect.flatMap((executeResult): Effect.Effect<ExecutionResult, never, never> => {\n if (isPromiseLike<ExecutionResult>(executeResult)) {\n return Effect.promise(() => executeResult)\n }\n return Effect.succeed(executeResult)\n })\n )\n}\n\n/**\n * Compute cache control header for the response if applicable.\n */\nconst computeCacheControlHeader = (\n document: DocumentNode,\n operationName: string | undefined,\n schema: GraphQLSchema,\n cacheHints: CacheHintMap,\n cacheControlConfig:\n | { enabled?: boolean; calculateHttpHeaders?: boolean; defaultMaxAge?: number }\n | undefined\n): Effect.Effect<string | undefined, never, never> => {\n if (cacheControlConfig?.enabled === false || cacheControlConfig?.calculateHttpHeaders === false) {\n return Effect.succeed(undefined)\n }\n\n // Find the operation from the document\n const operations = document.definitions.filter(\n (d): d is OperationDefinitionNode => d.kind === Kind.OPERATION_DEFINITION\n )\n const operation = operationName\n ? operations.find((o) => o.name?.value === operationName)\n : operations[0]\n\n if (!operation || operation.operation === \"mutation\") {\n // Mutations should not be cached\n return Effect.succeed(undefined)\n }\n\n return computeCachePolicy({\n document,\n operation,\n schema,\n cacheHints,\n config: cacheControlConfig ?? {},\n }).pipe(Effect.map(toCacheControlHeader))\n}\n\n/**\n * Build the final GraphQL response with extensions merged in.\n */\nconst buildGraphQLResponse = (\n result: import(\"graphql\").ExecutionResult,\n extensionData: Record<string, unknown>,\n cacheControlHeader: string | undefined\n): Effect.Effect<HttpServerResponse.HttpServerResponse, never, never> => {\n const finalResult =\n Object.keys(extensionData).length > 0\n ? {\n ...result,\n extensions: {\n ...result.extensions,\n ...extensionData,\n },\n }\n : result\n\n const responseHeaders = cacheControlHeader ? { \"cache-control\": cacheControlHeader } : undefined\n\n return HttpServerResponse.json(finalResult, { headers: responseHeaders }).pipe(Effect.orDie)\n}\n\n/**\n * Handle complexity limit exceeded error, returning appropriate response.\n */\nconst handleComplexityError = (\n error: ComplexityLimitExceededError\n): Effect.Effect<HttpServerResponse.HttpServerResponse, never, never> =>\n HttpServerResponse.json(\n {\n errors: [\n {\n message: error.message,\n extensions: {\n code: \"COMPLEXITY_LIMIT_EXCEEDED\",\n limitType: error.limitType,\n limit: error.limit,\n actual: error.actual,\n },\n },\n ],\n },\n { status: 400 }\n ).pipe(Effect.orDie)\n\n/**\n * Options for makeGraphQLRouter\n */\nexport interface MakeGraphQLRouterOptions extends GraphQLRouterConfigInput {\n /**\n * Field complexity definitions from the schema builder.\n * If using toRouter(), this is automatically extracted from the builder.\n * If using makeGraphQLRouter() directly, call builder.getFieldComplexities().\n */\n readonly fieldComplexities?: FieldComplexityMap\n\n /**\n * Cache hint definitions from the schema builder.\n * If using toRouter(), this is automatically extracted from the builder.\n * If using makeGraphQLRouter() directly, call builder.getCacheHints().\n */\n readonly cacheHints?: CacheHintMap\n\n /**\n * GraphQL extensions for lifecycle hooks.\n * If using toRouter(), this is automatically extracted from the builder.\n * If using makeGraphQLRouter() directly, call builder.getExtensions().\n */\n readonly extensions?: readonly GraphQLExtension<any>[]\n\n /**\n * Custom error handler for uncaught errors during GraphQL execution.\n * Receives the error cause and should return an HTTP response.\n * Defaults to returning a 500 Internal Server Error with a generic message.\n */\n readonly errorHandler?: ErrorHandler\n}\n\n/**\n * Create an HttpRouter configured for GraphQL\n *\n * The router handles:\n * - POST requests to the GraphQL endpoint\n * - GET requests to the GraphiQL UI (if enabled)\n * - Query complexity validation (if configured)\n * - Extension lifecycle hooks (onParse, onValidate, onExecuteStart, onExecuteEnd)\n *\n * @param schema - The GraphQL schema\n * @param layer - Effect layer providing services required by resolvers\n * @param options - Optional configuration for paths, GraphiQL, complexity, and extensions\n * @returns An HttpRouter that can be composed with other routes\n *\n * @example\n * ```typescript\n * const router = makeGraphQLRouter(schema, Layer.empty, {\n * path: \"/graphql\",\n * graphiql: { path: \"/graphiql\" },\n * complexity: { maxDepth: 10, maxComplexity: 1000 },\n * fieldComplexities: builder.getFieldComplexities(),\n * extensions: builder.getExtensions()\n * })\n *\n * // Compose with other routes\n * const app = HttpRouter.empty.pipe(\n * HttpRouter.get(\"/health\", HttpServerResponse.json({ status: \"ok\" })),\n * HttpRouter.concat(router)\n * )\n * ```\n */\nexport const makeGraphQLRouter = <R>(\n schema: GraphQLSchema,\n layer: Layer.Layer<R>,\n options: MakeGraphQLRouterOptions = {}\n): HttpRouter.HttpRouter<never, never> => {\n const resolvedConfig = normalizeConfig(options)\n const fieldComplexities = options.fieldComplexities ?? new Map()\n const cacheHints = options.cacheHints ?? new Map()\n const extensions = options.extensions ?? []\n const errorHandler = options.errorHandler ?? defaultErrorHandler\n\n // GraphQL POST handler - typed as returning HttpServerResponse with all errors handled\n const graphqlHandler = Effect.gen(function* () {\n const extensionsService = yield* makeExtensionsService()\n const runtime = yield* Effect.runtime<R>()\n\n // Parse request body\n const request = yield* HttpServerRequest.HttpServerRequest\n const parsedBody = yield* decodeRequestBody(request)\n const body: GraphQLRequestBody = {\n query: parsedBody.query,\n variables: parsedBody.variables._tag === \"Some\" ? parsedBody.variables.value : undefined,\n operationName:\n parsedBody.operationName._tag === \"Some\" ? parsedBody.operationName.value : undefined,\n }\n\n // Phase 1: Parse\n const parseResult = yield* parseGraphQLQuery(body.query, extensionsService)\n if (!parseResult.ok) {\n return parseResult.response\n }\n const document = parseResult.document\n\n yield* runParseHooks(extensions, body.query, document).pipe(\n Effect.provideService(ExtensionsService, extensionsService)\n )\n\n // Phase 2: Validate\n const validationRules = resolvedConfig.introspection\n ? undefined\n : specifiedRules.concat(NoSchemaIntrospectionCustomRule)\n const validationErrors = validate(schema, document, validationRules)\n\n yield* runValidateHooks(extensions, document, validationErrors).pipe(\n Effect.provideService(ExtensionsService, extensionsService)\n )\n\n if (validationErrors.length > 0) {\n const extensionData = yield* extensionsService.get()\n return yield* HttpServerResponse.json(\n {\n errors: validationErrors.map((e) => ({\n message: e.message,\n locations: e.locations,\n path: e.path,\n })),\n extensions: Object.keys(extensionData).length > 0 ? extensionData : undefined,\n },\n { status: 400 }\n )\n }\n\n // Complexity validation\n yield* runComplexityValidation(body, schema, fieldComplexities, resolvedConfig.complexity)\n\n // Phase 3: Execute\n yield* runExecuteStartHooks(extensions, {\n source: body.query,\n document,\n variableValues: body.variables,\n operationName: body.operationName,\n schema,\n fieldComplexities,\n }).pipe(Effect.provideService(ExtensionsService, extensionsService))\n\n const result = yield* executeGraphQLQuery(\n schema,\n document,\n body.variables,\n body.operationName,\n runtime\n )\n\n yield* runExecuteEndHooks(extensions, result).pipe(\n Effect.provideService(ExtensionsService, extensionsService)\n )\n\n // Build response\n const extensionData = yield* extensionsService.get()\n const cacheControlHeader = yield* computeCacheControlHeader(\n document,\n body.operationName,\n schema,\n cacheHints,\n resolvedConfig.cacheControl\n )\n\n return yield* buildGraphQLResponse(result, extensionData, cacheControlHeader)\n }).pipe(\n Effect.provide(layer),\n Effect.catchAll((error: GraphQLHandlerError) => {\n if (error instanceof ComplexityLimitExceededError) {\n return handleComplexityError(error)\n }\n return Effect.fail(error)\n }),\n Effect.catchAllCause(errorHandler)\n )\n\n // Build router\n let router = HttpRouter.empty.pipe(\n HttpRouter.post(resolvedConfig.path as HttpRouter.PathInput, graphqlHandler)\n )\n\n if (resolvedConfig.graphiql) {\n const { path, endpoint, subscriptionEndpoint } = resolvedConfig.graphiql\n router = router.pipe(\n HttpRouter.get(\n path as HttpRouter.PathInput,\n HttpServerResponse.html(graphiqlHtml(endpoint, subscriptionEndpoint))\n )\n )\n }\n\n return router\n}\n","import { Layer } from \"effect\"\nimport { HttpRouter } from \"@effect/platform\"\nimport { GraphQLSchemaBuilder } from \"../builder/schema-builder\"\nimport { makeGraphQLRouter, type MakeGraphQLRouterOptions } from \"./router\"\n\n/**\n * Convert a GraphQLSchemaBuilder to an HttpRouter.\n *\n * This bridges the GraphQL schema builder with the @effect/platform HTTP server.\n * Field complexities and cache hints are automatically extracted from the builder.\n *\n * @param builder - The GraphQL schema builder\n * @param layer - Effect layer providing services required by resolvers\n * @param options - Optional configuration for paths, GraphiQL, complexity, and caching\n * @returns An HttpRouter that can be composed with other routes\n *\n * @example\n * ```typescript\n * import { GraphQLSchemaBuilder, query, toRouter } from \"@effect-gql/core\"\n * import { Layer, Effect } from \"effect\"\n * import * as S from \"effect/Schema\"\n *\n * const builder = GraphQLSchemaBuilder.empty.pipe(\n * query(\"hello\", { type: S.String, resolve: () => Effect.succeed(\"world\") })\n * )\n *\n * // Basic usage\n * const router = toRouter(builder, Layer.empty, { graphiql: true })\n *\n * // With complexity limiting\n * const routerWithLimits = toRouter(builder, Layer.empty, {\n * graphiql: true,\n * complexity: { maxDepth: 10, maxComplexity: 1000 }\n * })\n *\n * // With cache control\n * const routerWithCaching = toRouter(builder, Layer.empty, {\n * cacheControl: { enabled: true, defaultMaxAge: 0 }\n * })\n * ```\n */\nexport const toRouter = <R, R2>(\n builder: GraphQLSchemaBuilder<R>,\n layer: Layer.Layer<R2>,\n options?: Omit<MakeGraphQLRouterOptions, \"fieldComplexities\" | \"cacheHints\">\n): HttpRouter.HttpRouter<never, never> => {\n const schema = builder.buildSchema()\n const fieldComplexities = builder.getFieldComplexities()\n const cacheHints = builder.getCacheHints()\n return makeGraphQLRouter(schema, layer, { ...options, fieldComplexities, cacheHints })\n}\n","import { Data, Effect, Runtime, Stream } from \"effect\"\nimport type { ComplexityConfig, FieldComplexityMap } from \"./complexity\"\n\n/**\n * Error type for WebSocket operations\n */\nexport class WebSocketError extends Data.TaggedError(\"WebSocketError\")<{\n readonly cause: unknown\n}> {}\n\n/**\n * WebSocket close event information\n */\nexport interface CloseEvent {\n readonly code: number\n readonly reason: string\n}\n\n/**\n * Platform-neutral WebSocket interface using Effect types.\n *\n * This interface abstracts WebSocket operations across different platforms\n * (Node.js ws, Bun built-in, browser WebSocket). Platform packages implement\n * this interface to bridge their specific WebSocket implementations.\n */\nexport interface EffectWebSocket {\n /**\n * Send a message to the client.\n * Returns an Effect that completes when the message is sent.\n */\n readonly send: (data: string) => Effect.Effect<void, WebSocketError>\n\n /**\n * Close the WebSocket connection.\n * @param code - Optional close code (default: 1000)\n * @param reason - Optional close reason\n */\n readonly close: (code?: number, reason?: string) => Effect.Effect<void, WebSocketError>\n\n /**\n * Stream of incoming messages from the client.\n * The stream completes when the connection closes.\n */\n readonly messages: Stream.Stream<string, WebSocketError>\n\n /**\n * Effect that completes with CloseEvent when the connection closes.\n * Use this to detect client disconnection.\n */\n readonly closed: Effect.Effect<CloseEvent, WebSocketError>\n\n /**\n * The WebSocket subprotocol negotiated during handshake.\n * For GraphQL subscriptions, this should be \"graphql-transport-ws\".\n */\n readonly protocol: string\n}\n\n/**\n * Context available during a WebSocket connection.\n * This is passed to lifecycle hooks.\n */\nexport interface ConnectionContext<R> {\n /**\n * The Effect runtime for this connection.\n * Use this to run Effects within the connection scope.\n */\n readonly runtime: Runtime.Runtime<R>\n\n /**\n * Connection parameters sent by the client during CONNECTION_INIT.\n * Often used for authentication tokens.\n */\n readonly connectionParams: Record<string, unknown>\n\n /**\n * The underlying WebSocket for this connection.\n */\n readonly socket: EffectWebSocket\n}\n\n/**\n * Options for configuring the GraphQL WebSocket handler.\n *\n * @template R - Service requirements for lifecycle hooks\n */\nexport interface GraphQLWSOptions<R> {\n /**\n * Query complexity limiting configuration.\n * When provided, subscriptions are validated against complexity limits\n * before execution begins.\n */\n readonly complexity?: ComplexityConfig\n\n /**\n * Field complexity definitions from the schema builder.\n * If using the platform serve() functions with subscriptions config,\n * this is typically passed automatically.\n */\n readonly fieldComplexities?: FieldComplexityMap\n\n /**\n * Called when a client initiates a connection (CONNECTION_INIT message).\n *\n * Use this for authentication. Return:\n * - `true` to accept the connection\n * - `false` to reject the connection\n * - An object to accept and provide additional context\n *\n * The returned object (or true) is merged into the GraphQL context.\n *\n * @example\n * ```typescript\n * onConnect: (params) => Effect.gen(function* () {\n * const token = params.authToken as string\n * const user = yield* AuthService.validateToken(token)\n * return { user } // Available in GraphQL context\n * })\n * ```\n */\n readonly onConnect?: (\n params: Record<string, unknown>\n ) => Effect.Effect<boolean | Record<string, unknown>, unknown, R>\n\n /**\n * Called when a client disconnects.\n * Use this for cleanup (e.g., removing user from active connections).\n */\n readonly onDisconnect?: (ctx: ConnectionContext<R>) => Effect.Effect<void, never, R>\n\n /**\n * Called when a client starts a subscription (SUBSCRIBE message).\n * Use this for per-subscription authorization or logging.\n *\n * Note: If complexity validation is enabled, it runs before this hook.\n * Throw an error to reject the subscription.\n */\n readonly onSubscribe?: (\n ctx: ConnectionContext<R>,\n message: SubscribeMessage\n ) => Effect.Effect<void, unknown, R>\n\n /**\n * Called when a subscription completes or is stopped.\n */\n readonly onComplete?: (\n ctx: ConnectionContext<R>,\n message: CompleteMessage\n ) => Effect.Effect<void, never, R>\n\n /**\n * Called when an error occurs during subscription execution.\n */\n readonly onError?: (ctx: ConnectionContext<R>, error: unknown) => Effect.Effect<void, never, R>\n}\n\n/**\n * GraphQL WebSocket SUBSCRIBE message payload\n */\nexport interface SubscribeMessage {\n readonly id: string\n readonly payload: {\n readonly query: string\n readonly variables?: Record<string, unknown>\n readonly operationName?: string\n readonly extensions?: Record<string, unknown>\n }\n}\n\n/**\n * GraphQL WebSocket COMPLETE message payload\n */\nexport interface CompleteMessage {\n readonly id: string\n}\n\n/**\n * Configuration for the WebSocket endpoint\n */\nexport interface GraphQLWSConfig {\n /**\n * Path for WebSocket connections.\n * @default \"/graphql\"\n */\n readonly path?: string\n\n /**\n * How long to wait for CONNECTION_INIT message before closing.\n * @default 5000 (5 seconds)\n */\n readonly connectionInitWaitTimeout?: number\n}\n","import { Effect, Layer, Runtime, Stream, Queue, Fiber, Deferred } from \"effect\"\nimport { GraphQLSchema, subscribe, GraphQLError } from \"graphql\"\nimport { makeServer, type ServerOptions } from \"graphql-ws\"\nimport type { GraphQLEffectContext } from \"../builder/types\"\nimport type {\n EffectWebSocket,\n GraphQLWSOptions,\n ConnectionContext,\n CloseEvent,\n WebSocketError,\n} from \"./ws-types\"\nimport { validateComplexity, type FieldComplexityMap } from \"./complexity\"\n\n/**\n * Extra context passed through graphql-ws.\n * This is the `extra` field in graphql-ws Context.\n */\ninterface WSExtra<R> {\n socket: EffectWebSocket\n runtime: Runtime.Runtime<R>\n connectionParams: Record<string, unknown>\n}\n\n/**\n * Create a ConnectionContext from WSExtra for use in lifecycle hooks.\n */\nconst createConnectionContext = <R>(extra: WSExtra<R>): ConnectionContext<R> => ({\n runtime: extra.runtime,\n connectionParams: extra.connectionParams,\n socket: extra.socket,\n})\n\n/**\n * Create the onConnect handler for graphql-ws.\n */\nconst makeOnConnectHandler = <R>(\n options: GraphQLWSOptions<R> | undefined\n): ServerOptions<Record<string, unknown>, WSExtra<R>>[\"onConnect\"] => {\n if (!options?.onConnect) return undefined\n\n return async (ctx) => {\n const extra = ctx.extra as WSExtra<R>\n try {\n const result = await Runtime.runPromise(extra.runtime)(\n options.onConnect!(ctx.connectionParams ?? {})\n )\n if (typeof result === \"object\" && result !== null) {\n Object.assign(extra.connectionParams, result)\n }\n return result !== false\n } catch {\n return false\n }\n }\n}\n\n/**\n * Create the onDisconnect handler for graphql-ws.\n */\nconst makeOnDisconnectHandler = <R>(\n options: GraphQLWSOptions<R> | undefined\n): ServerOptions<Record<string, unknown>, WSExtra<R>>[\"onDisconnect\"] => {\n if (!options?.onDisconnect) return undefined\n\n return async (ctx) => {\n const extra = ctx.extra as WSExtra<R>\n await Runtime.runPromise(extra.runtime)(\n options.onDisconnect!(createConnectionContext(extra))\n ).catch(() => {\n // Ignore cleanup errors\n })\n }\n}\n\n/**\n * Create the onSubscribe handler for graphql-ws with complexity validation.\n */\nconst makeOnSubscribeHandler = <R>(\n options: GraphQLWSOptions<R> | undefined,\n schema: GraphQLSchema,\n complexityConfig: GraphQLWSOptions<R>[\"complexity\"],\n fieldComplexities: FieldComplexityMap\n): ServerOptions<Record<string, unknown>, WSExtra<R>>[\"onSubscribe\"] => {\n // graphql-ws 6.0: signature changed from (ctx, msg) to (ctx, id, payload)\n return async (ctx, id, payload) => {\n const extra = ctx.extra as WSExtra<R>\n const connectionCtx = createConnectionContext(extra)\n\n // Validate complexity if configured\n if (complexityConfig) {\n const validationEffect = validateComplexity(\n payload.query,\n payload.operationName ?? undefined,\n payload.variables ?? undefined,\n schema,\n fieldComplexities,\n complexityConfig\n ).pipe(\n Effect.catchAll((error) => {\n if (error._tag === \"ComplexityLimitExceededError\") {\n throw new GraphQLError(error.message, {\n extensions: {\n code: \"COMPLEXITY_LIMIT_EXCEEDED\",\n limitType: error.limitType,\n limit: error.limit,\n actual: error.actual,\n },\n })\n }\n return Effect.logWarning(\"Complexity analysis failed for subscription\", error)\n })\n )\n\n await Effect.runPromise(validationEffect)\n }\n\n // Call user's onSubscribe hook if provided\n if (options?.onSubscribe) {\n await Runtime.runPromise(extra.runtime)(\n options.onSubscribe(connectionCtx, {\n id,\n payload: {\n query: payload.query,\n variables: payload.variables ?? undefined,\n operationName: payload.operationName ?? undefined,\n extensions: payload.extensions ?? undefined,\n },\n })\n )\n }\n }\n}\n\n/**\n * Create the onComplete handler for graphql-ws.\n */\nconst makeOnCompleteHandler = <R>(\n options: GraphQLWSOptions<R> | undefined\n): ServerOptions<Record<string, unknown>, WSExtra<R>>[\"onComplete\"] => {\n if (!options?.onComplete) return undefined\n\n // graphql-ws 6.0: signature changed from (ctx, msg) to (ctx, id, payload)\n return async (ctx, id, _payload) => {\n const extra = ctx.extra as WSExtra<R>\n await Runtime.runPromise(extra.runtime)(\n options.onComplete!(createConnectionContext(extra), { id })\n ).catch(() => {\n // Ignore cleanup errors\n })\n }\n}\n\n/**\n * Create the onError handler for graphql-ws.\n */\nconst makeOnErrorHandler = <R>(\n options: GraphQLWSOptions<R> | undefined\n): ServerOptions<Record<string, unknown>, WSExtra<R>>[\"onError\"] => {\n if (!options?.onError) return undefined\n\n // graphql-ws 6.0: signature changed from (ctx, msg, errors) to (ctx, id, payload, errors)\n return async (ctx, _id, _payload, errors) => {\n const extra = ctx.extra as WSExtra<R>\n await Runtime.runPromise(extra.runtime)(\n options.onError!(createConnectionContext(extra), errors)\n ).catch(() => {\n // Ignore error handler errors\n })\n }\n}\n\n/**\n * Create a graphql-ws compatible socket adapter from an EffectWebSocket.\n */\nconst createGraphqlWsSocketAdapter = <R>(socket: EffectWebSocket, runtime: Runtime.Runtime<R>) => {\n let messageCallback: ((message: string) => Promise<void>) | null = null\n\n return {\n adapter: {\n protocol: socket.protocol,\n\n send: (data: string) =>\n Runtime.runPromise(runtime)(\n socket\n .send(data)\n .pipe(Effect.catchAll((error) => Effect.logError(\"WebSocket send error\", error)))\n ),\n\n close: (code?: number, reason?: string) => {\n Runtime.runPromise(runtime)(socket.close(code, reason)).catch(() => {\n // Ignore close errors\n })\n },\n\n onMessage: (cb: (message: string) => Promise<void>) => {\n messageCallback = cb\n },\n\n onPong: (_payload: Record<string, unknown> | undefined) => {\n // Pong handling - can be used for keepalive\n },\n },\n dispatchMessage: async (message: string) => {\n if (messageCallback) {\n await messageCallback(message)\n }\n },\n }\n}\n\n/**\n * Run the connection lifecycle - manages message queue, fibers, and cleanup.\n */\nconst runConnectionLifecycle = <R>(\n socket: EffectWebSocket,\n wsServer: ReturnType<typeof makeServer<Record<string, unknown>, WSExtra<R>>>,\n extra: WSExtra<R>\n): Effect.Effect<void, never, never> =>\n Effect.gen(function* () {\n // Create message queue for bridging Stream to callback\n const messageQueue = yield* Queue.unbounded<string>()\n const closedDeferred = yield* Deferred.make<CloseEvent, WebSocketError>()\n\n // Fork fiber to consume socket messages and push to queue\n const messageFiber = yield* Effect.fork(\n Stream.runForEach(socket.messages, (msg) => Queue.offer(messageQueue, msg)).pipe(\n Effect.catchAll((error) => Deferred.fail(closedDeferred, error))\n )\n )\n\n // Fork fiber to handle socket close\n const closeFiber = yield* Effect.fork(\n socket.closed.pipe(\n Effect.tap((event) => Deferred.succeed(closedDeferred, event)),\n Effect.catchAll((error) => Deferred.fail(closedDeferred, error))\n )\n )\n\n // Create the graphql-ws socket adapter\n const { adapter, dispatchMessage } = createGraphqlWsSocketAdapter(socket, extra.runtime)\n\n // Open the connection with graphql-ws\n const closedHandler = wsServer.opened(adapter, extra)\n\n // Fork fiber to process messages from queue\n const processMessagesFiber = yield* Effect.fork(\n Effect.gen(function* () {\n while (true) {\n const message = yield* Queue.take(messageQueue)\n yield* Effect.tryPromise({\n try: () => dispatchMessage(message),\n catch: (error) => error,\n }).pipe(Effect.catchAll(() => Effect.void))\n }\n })\n )\n\n // Wait for connection to close\n yield* Deferred.await(closedDeferred).pipe(\n Effect.catchAll(() => Effect.succeed({ code: 1000, reason: \"Error\" }))\n )\n\n // Cleanup\n closedHandler(1000, \"Connection closed\")\n yield* Fiber.interrupt(messageFiber)\n yield* Fiber.interrupt(closeFiber)\n yield* Fiber.interrupt(processMessagesFiber)\n yield* Queue.shutdown(messageQueue)\n }).pipe(\n Effect.catchAllCause(() => Effect.void),\n Effect.scoped\n )\n\n/**\n * Create a WebSocket handler for GraphQL subscriptions using the graphql-ws protocol.\n *\n * This function creates a handler that can be used with any WebSocket implementation\n * that conforms to the EffectWebSocket interface. Platform packages (node, bun, express)\n * provide adapters that convert their native WebSocket to EffectWebSocket.\n *\n * The handler:\n * - Uses the graphql-ws protocol for client communication\n * - Creates an Effect runtime from the provided layer for each connection\n * - Executes subscriptions using GraphQL's subscribe() function\n * - Properly cleans up resources when connections close\n *\n * @param schema - The GraphQL schema with subscription definitions\n * @param layer - Effect layer providing services required by resolvers\n * @param options - Optional lifecycle hooks for connection/subscription events\n * @returns A function that handles individual WebSocket connections\n *\n * @example\n * ```typescript\n * import { makeGraphQLWSHandler } from \"@effect-gql/core\"\n *\n * const handler = makeGraphQLWSHandler(schema, serviceLayer, {\n * onConnect: (params) => Effect.gen(function* () {\n * const user = yield* AuthService.validateToken(params.authToken)\n * return { user }\n * }),\n * })\n *\n * // In platform-specific code:\n * const effectSocket = toEffectWebSocket(rawWebSocket)\n * await Effect.runPromise(handler(effectSocket))\n * ```\n */\nexport const makeGraphQLWSHandler = <R>(\n schema: GraphQLSchema,\n layer: Layer.Layer<R>,\n options?: GraphQLWSOptions<R>\n): ((socket: EffectWebSocket) => Effect.Effect<void, never, never>) => {\n const complexityConfig = options?.complexity\n const fieldComplexities: FieldComplexityMap = options?.fieldComplexities ?? new Map()\n\n // Build server options using extracted handler factories\n const serverOptions: ServerOptions<Record<string, unknown>, WSExtra<R>> = {\n schema,\n\n context: async (ctx): Promise<GraphQLEffectContext<R> & Record<string, unknown>> => {\n const extra = ctx.extra as WSExtra<R>\n return {\n runtime: extra.runtime,\n ...extra.connectionParams,\n }\n },\n\n subscribe: async (args) => subscribe(args),\n\n onConnect: makeOnConnectHandler(options),\n onDisconnect: makeOnDisconnectHandler(options),\n onSubscribe: makeOnSubscribeHandler(options, schema, complexityConfig, fieldComplexities),\n onComplete: makeOnCompleteHandler(options),\n onError: makeOnErrorHandler(options),\n }\n\n const wsServer = makeServer(serverOptions)\n\n // Return the connection handler\n return (socket: EffectWebSocket): Effect.Effect<void, never, never> =>\n Effect.gen(function* () {\n const runtime = yield* Effect.provide(Effect.runtime<R>(), layer)\n\n const extra: WSExtra<R> = {\n socket,\n runtime,\n connectionParams: {},\n }\n\n yield* runConnectionLifecycle(socket, wsServer, extra)\n }).pipe(\n Effect.catchAllCause(() => Effect.void),\n Effect.scoped\n )\n}\n","import { Effect, Stream, Queue, Deferred } from \"effect\"\nimport type { EffectWebSocket, CloseEvent } from \"./ws-types\"\nimport { WebSocketError } from \"./ws-types\"\n\n/**\n * Interface for the 'ws' library WebSocket.\n * This allows type-safe usage without requiring core to depend on 'ws'.\n */\nexport interface WsWebSocket {\n readonly protocol: string\n readonly readyState: number\n send(data: string, callback?: (error?: Error) => void): void\n close(code?: number, reason?: string): void\n on(event: \"message\", listener: (data: Buffer | string) => void): void\n on(event: \"error\", listener: (error: Error) => void): void\n on(event: \"close\", listener: (code: number, reason: Buffer) => void): void\n removeListener(event: string, listener: (...args: any[]) => void): void\n}\n\n/** WebSocket.CLOSED constant from 'ws' library */\nexport const WS_CLOSED = 3\n\n/**\n * Convert a WebSocket from the 'ws' library to an EffectWebSocket.\n *\n * This creates an Effect-based wrapper around the ws WebSocket instance,\n * providing a Stream for incoming messages and Effect-based send/close operations.\n *\n * This utility is used by platform packages (node, express) that integrate\n * with the 'ws' library for WebSocket support.\n *\n * @param ws - The WebSocket instance from the 'ws' library\n * @returns An EffectWebSocket that can be used with makeGraphQLWSHandler\n *\n * @example\n * ```typescript\n * import { toEffectWebSocketFromWs } from \"@effect-gql/core\"\n * import { WebSocket } from \"ws\"\n *\n * wss.on(\"connection\", (ws: WebSocket) => {\n * const effectSocket = toEffectWebSocketFromWs(ws)\n * Effect.runPromise(handler(effectSocket))\n * })\n * ```\n */\nexport const toEffectWebSocketFromWs = (ws: WsWebSocket): EffectWebSocket => {\n // Create the message stream using a queue\n const messagesEffect = Effect.gen(function* () {\n const queue = yield* Queue.unbounded<string>()\n const closed = yield* Deferred.make<CloseEvent, WebSocketError>()\n\n // Set up message listener\n ws.on(\"message\", (data) => {\n const message = data.toString()\n Effect.runPromise(Queue.offer(queue, message)).catch(() => {\n // Queue might be shutdown\n })\n })\n\n // Set up error listener\n ws.on(\"error\", (error) => {\n Effect.runPromise(Deferred.fail(closed, new WebSocketError({ cause: error }))).catch(() => {\n // Already completed\n })\n })\n\n // Set up close listener\n ws.on(\"close\", (code, reason) => {\n Effect.runPromise(\n Queue.shutdown(queue).pipe(\n Effect.andThen(Deferred.succeed(closed, { code, reason: reason.toString() }))\n )\n ).catch(() => {\n // Already completed\n })\n })\n\n return { queue, closed }\n })\n\n // Create the message stream\n const messages: Stream.Stream<string, WebSocketError> = Stream.unwrap(\n messagesEffect.pipe(\n Effect.map(({ queue }) => Stream.fromQueue(queue).pipe(Stream.catchAll(() => Stream.empty)))\n )\n )\n\n return {\n protocol: ws.protocol || \"graphql-transport-ws\",\n\n send: (data: string) =>\n Effect.async<void, WebSocketError>((resume) => {\n ws.send(data, (error) => {\n if (error) {\n resume(Effect.fail(new WebSocketError({ cause: error })))\n } else {\n resume(Effect.succeed(undefined))\n }\n })\n }),\n\n close: (code?: number, reason?: string) =>\n Effect.sync(() => {\n ws.close(code ?? 1000, reason ?? \"\")\n }),\n\n messages,\n\n closed: Effect.async<CloseEvent, WebSocketError>((resume) => {\n if (ws.readyState === WS_CLOSED) {\n resume(Effect.succeed({ code: 1000, reason: \"\" }))\n return\n }\n\n const onClose = (code: number, reason: Buffer) => {\n cleanup()\n resume(Effect.succeed({ code, reason: reason.toString() }))\n }\n\n const onError = (error: Error) => {\n cleanup()\n resume(Effect.fail(new WebSocketError({ cause: error })))\n }\n\n const cleanup = () => {\n ws.removeListener(\"close\", onClose)\n ws.removeListener(\"error\", onError)\n }\n\n ws.on(\"close\", onClose)\n ws.on(\"error\", onError)\n\n return Effect.sync(cleanup)\n }),\n }\n}\n","import { Data, Effect, Runtime, Stream } from \"effect\"\nimport type { ExecutionResult } from \"graphql\"\nimport type { ComplexityConfig, FieldComplexityMap } from \"./complexity\"\n\n/**\n * Standard SSE response headers following the graphql-sse protocol.\n * Use these headers when writing SSE responses in platform adapters.\n */\nexport const SSE_HEADERS: Record<string, string> = {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"X-Accel-Buffering\": \"no\", // Disable nginx buffering\n} as const\n\n/**\n * Error type for SSE operations\n */\nexport class SSEError extends Data.TaggedError(\"SSEError\")<{\n readonly cause: unknown\n}> {}\n\n/**\n * SSE event types following the graphql-sse protocol (distinct connections mode).\n * @see https://github.com/enisdenjo/graphql-sse/blob/master/PROTOCOL.md\n */\nexport type SSEEventType = \"next\" | \"error\" | \"complete\"\n\n/**\n * An SSE event to be sent to the client.\n */\nexport interface SSEEvent {\n readonly event: SSEEventType\n readonly data: string\n}\n\n/**\n * Platform-neutral SSE response interface using Effect types.\n *\n * This interface abstracts SSE operations across different platforms\n * (Node.js, Bun, Deno, Workers). Platform packages implement this\n * interface to bridge their specific HTTP response implementations.\n *\n * Unlike WebSocket which is bidirectional, SSE is unidirectional\n * (server to client only). The subscription query is provided\n * upfront when creating the SSE connection.\n */\nexport interface EffectSSE {\n /**\n * Send an SSE event to the client.\n * The platform adapter formats this as proper SSE format:\n * ```\n * event: next\n * data: {\"data\":{\"field\":\"value\"}}\n *\n * ```\n */\n readonly sendEvent: (event: SSEEvent) => Effect.Effect<void, SSEError>\n\n /**\n * Effect that completes when the client disconnects.\n * Use this to detect client disconnection and cleanup.\n */\n readonly closed: Effect.Effect<void, SSEError>\n}\n\n/**\n * The GraphQL request payload for SSE subscriptions.\n * Same as a regular GraphQL HTTP request.\n */\nexport interface SSESubscriptionRequest {\n readonly query: string\n readonly variables?: Record<string, unknown>\n readonly operationName?: string\n readonly extensions?: Record<string, unknown>\n}\n\n/**\n * Context available during an SSE subscription.\n * This is passed to lifecycle hooks.\n */\nexport interface SSEConnectionContext<R> {\n /**\n * The Effect runtime for this connection.\n * Use this to run Effects within the connection scope.\n */\n readonly runtime: Runtime.Runtime<R>\n\n /**\n * The original subscription request.\n */\n readonly request: SSESubscriptionRequest\n\n /**\n * Optional authentication/authorization context.\n * Populated by the onConnect hook.\n */\n readonly connectionContext: Record<string, unknown>\n}\n\n/**\n * Options for configuring the GraphQL SSE handler.\n *\n * @template R - Service requirements for lifecycle hooks\n */\nexport interface GraphQLSSEOptions<R> {\n /**\n * Query complexity limiting configuration.\n * When provided, subscriptions are validated against complexity limits\n * before execution begins.\n */\n readonly complexity?: ComplexityConfig\n\n /**\n * Field complexity definitions from the schema builder.\n * If using the platform serve() functions, this is typically\n * passed automatically.\n */\n readonly fieldComplexities?: FieldComplexityMap\n\n /**\n * Called before a subscription starts.\n *\n * Use this for authentication/authorization. Return:\n * - A context object to accept the subscription\n * - Throw/fail to reject the subscription\n *\n * The returned object is available in the GraphQL context.\n *\n * @example\n * ```typescript\n * onConnect: (request, headers) => Effect.gen(function* () {\n * const token = headers.get(\"authorization\")\n * const user = yield* AuthService.validateToken(token)\n * return { user } // Available in GraphQL context\n * })\n * ```\n */\n readonly onConnect?: (\n request: SSESubscriptionRequest,\n headers: Headers\n ) => Effect.Effect<Record<string, unknown>, unknown, R>\n\n /**\n * Called when the subscription starts streaming.\n */\n readonly onSubscribe?: (ctx: SSEConnectionContext<R>) => Effect.Effect<void, never, R>\n\n /**\n * Called when the subscription completes (normally or due to error).\n */\n readonly onComplete?: (ctx: SSEConnectionContext<R>) => Effect.Effect<void, never, R>\n\n /**\n * Called when the client disconnects.\n */\n readonly onDisconnect?: (ctx: SSEConnectionContext<R>) => Effect.Effect<void, never, R>\n\n /**\n * Called when an error occurs during subscription execution.\n */\n readonly onError?: (ctx: SSEConnectionContext<R>, error: unknown) => Effect.Effect<void, never, R>\n}\n\n/**\n * Configuration for the SSE endpoint\n */\nexport interface GraphQLSSEConfig {\n /**\n * Path for SSE connections.\n * @default \"/graphql/stream\"\n */\n readonly path?: string\n}\n\n/**\n * Result of SSE subscription handler creation.\n * This is used by platform packages to implement their SSE response.\n */\nexport interface SSESubscriptionResult {\n /**\n * Stream of SSE events to send to the client.\n * The platform adapter should consume this stream and send events.\n */\n readonly events: Stream.Stream<SSEEvent, SSEError>\n\n /**\n * Effect that should be run when client disconnects.\n * This allows cleanup of resources.\n */\n readonly cleanup: Effect.Effect<void, never, never>\n}\n\n/**\n * Format an ExecutionResult as an SSE \"next\" event.\n */\nexport const formatNextEvent = (result: ExecutionResult): SSEEvent => ({\n event: \"next\",\n data: JSON.stringify(result),\n})\n\n/**\n * Format errors as an SSE \"error\" event.\n */\nexport const formatErrorEvent = (errors: readonly unknown[]): SSEEvent => ({\n event: \"error\",\n data: JSON.stringify({ errors }),\n})\n\n/**\n * Format a \"complete\" event.\n */\nexport const formatCompleteEvent = (): SSEEvent => ({\n event: \"complete\",\n data: \"\",\n})\n\n/**\n * Format an SSE event to the wire format.\n * Each event is formatted as:\n * ```\n * event: <type>\n * data: <json>\n *\n * ```\n */\nexport const formatSSEMessage = (event: SSEEvent): string => {\n const lines = [`event: ${event.event}`]\n if (event.data) {\n lines.push(`data: ${event.data}`)\n }\n lines.push(\"\", \"\") // Two newlines to end the event\n return lines.join(\"\\n\")\n}\n","import { Effect, Layer, Stream } from \"effect\"\nimport {\n GraphQLSchema,\n parse,\n validate,\n subscribe,\n GraphQLError,\n Kind,\n type ExecutionResult,\n type DocumentNode,\n type OperationDefinitionNode,\n} from \"graphql\"\nimport type { GraphQLEffectContext } from \"../builder/types\"\nimport {\n SSEError,\n type GraphQLSSEOptions,\n type SSEConnectionContext,\n type SSESubscriptionRequest,\n type SSEEvent,\n formatNextEvent,\n formatErrorEvent,\n formatCompleteEvent,\n} from \"./sse-types\"\nimport { validateComplexity, type FieldComplexityMap } from \"./complexity\"\n\n/**\n * Create a subscription event stream for SSE.\n *\n * This function handles the GraphQL subscription lifecycle:\n * 1. Parse and validate the query\n * 2. Check complexity limits if configured\n * 3. Execute the subscription\n * 4. Stream results as SSE events\n *\n * @param schema - The GraphQL schema with subscription definitions\n * @param layer - Effect layer providing services required by resolvers\n * @param request - The subscription request (query, variables, operationName)\n * @param headers - HTTP headers from the request (for auth)\n * @param options - Optional lifecycle hooks and configuration\n * @returns A Stream of SSE events to send to the client\n *\n * @example\n * ```typescript\n * const eventStream = makeSSESubscriptionStream(\n * schema,\n * serviceLayer,\n * { query: \"subscription { tick { count } }\" },\n * new Headers(),\n * { onConnect: (req, headers) => Effect.succeed({ user: \"alice\" }) }\n * )\n *\n * // In platform-specific code, consume and send events:\n * Stream.runForEach(eventStream, (event) =>\n * Effect.sync(() => res.write(formatSSEMessage(event)))\n * )\n * ```\n */\nexport const makeSSESubscriptionStream = <R>(\n schema: GraphQLSchema,\n layer: Layer.Layer<R>,\n request: SSESubscriptionRequest,\n headers: Headers,\n options?: GraphQLSSEOptions<R>\n): Stream.Stream<SSEEvent, SSEError> => {\n const complexityConfig = options?.complexity\n const fieldComplexities: FieldComplexityMap = options?.fieldComplexities ?? new Map()\n\n return Stream.unwrap(\n Effect.gen(function* () {\n // Create a runtime from the layer\n const runtime = yield* Effect.provide(Effect.runtime<R>(), layer)\n\n // Run onConnect hook if provided\n let connectionContext: Record<string, unknown> = {}\n if (options?.onConnect) {\n try {\n connectionContext = yield* Effect.provide(options.onConnect(request, headers), layer)\n } catch {\n // Connection rejected\n return Stream.make(\n formatErrorEvent([\n new GraphQLError(\"Subscription connection rejected\", {\n extensions: { code: \"CONNECTION_REJECTED\" },\n }),\n ]),\n formatCompleteEvent()\n )\n }\n }\n\n // Parse the query\n let document: DocumentNode\n try {\n document = parse(request.query)\n } catch (syntaxError) {\n return Stream.make(formatErrorEvent([syntaxError]), formatCompleteEvent())\n }\n\n // Validate the query\n const validationErrors = validate(schema, document)\n if (validationErrors.length > 0) {\n return Stream.make(formatErrorEvent(validationErrors), formatCompleteEvent())\n }\n\n // Find the subscription operation\n const operations = document.definitions.filter(\n (d): d is OperationDefinitionNode => d.kind === Kind.OPERATION_DEFINITION\n )\n\n const operation = request.operationName\n ? operations.find((o) => o.name?.value === request.operationName)\n : operations[0]\n\n if (!operation) {\n return Stream.make(\n formatErrorEvent([new GraphQLError(\"No operation found in query\")]),\n formatCompleteEvent()\n )\n }\n\n if (operation.operation !== \"subscription\") {\n return Stream.make(\n formatErrorEvent([\n new GraphQLError(\n `SSE endpoint only supports subscriptions, received: ${operation.operation}`,\n { extensions: { code: \"OPERATION_NOT_SUPPORTED\" } }\n ),\n ]),\n formatCompleteEvent()\n )\n }\n\n // Validate complexity if configured\n if (complexityConfig) {\n const complexityResult = yield* validateComplexity(\n request.query,\n request.operationName,\n request.variables,\n schema,\n fieldComplexities,\n complexityConfig\n ).pipe(\n Effect.map(() => null),\n Effect.catchAll((error) => {\n if (error._tag === \"ComplexityLimitExceededError\") {\n return Effect.succeed(\n new GraphQLError(error.message, {\n extensions: {\n code: \"COMPLEXITY_LIMIT_EXCEEDED\",\n limitType: error.limitType,\n limit: error.limit,\n actual: error.actual,\n },\n })\n )\n }\n // Log analysis errors but don't block (fail open)\n return Effect.logWarning(\"Complexity analysis failed for SSE subscription\", error).pipe(\n Effect.map(() => null)\n )\n })\n )\n\n if (complexityResult) {\n return Stream.make(formatErrorEvent([complexityResult]), formatCompleteEvent())\n }\n }\n\n // Build the context for the subscription\n const ctx: SSEConnectionContext<R> = {\n runtime,\n request,\n connectionContext,\n }\n\n // Call onSubscribe hook if provided\n if (options?.onSubscribe) {\n yield* Effect.provide(options.onSubscribe(ctx), layer).pipe(\n Effect.catchAll(() => Effect.void)\n )\n }\n\n // Execute the subscription\n const graphqlContext: GraphQLEffectContext<R> & Record<string, unknown> = {\n runtime,\n ...connectionContext,\n }\n\n const subscriptionResult = yield* Effect.tryPromise({\n try: () =>\n subscribe({\n schema,\n document,\n variableValues: request.variables,\n operationName: request.operationName ?? undefined,\n contextValue: graphqlContext,\n }),\n catch: (error) => new SSEError({ cause: error }),\n })\n\n // Check if subscribe returned an error result instead of async iterator\n if (!isAsyncIterable(subscriptionResult)) {\n // It's an ExecutionResult with errors\n const result = subscriptionResult as ExecutionResult\n if (result.errors) {\n return Stream.make(formatErrorEvent(result.errors), formatCompleteEvent())\n }\n // Shouldn't happen, but handle gracefully\n return Stream.make(formatNextEvent(result), formatCompleteEvent())\n }\n\n // Create a stream from the async iterator\n const asyncIterator = subscriptionResult[Symbol.asyncIterator]()\n\n const eventStream = Stream.async<SSEEvent, SSEError>((emit) => {\n let done = false\n\n const iterate = async () => {\n try {\n while (!done) {\n const result = await asyncIterator.next()\n if (result.done) {\n emit.end()\n break\n }\n emit.single(formatNextEvent(result.value))\n }\n } catch (error) {\n if (!done) {\n emit.single(\n formatErrorEvent([\n error instanceof GraphQLError\n ? error\n : new GraphQLError(\n error instanceof Error ? error.message : \"Subscription error\",\n { extensions: { code: \"SUBSCRIPTION_ERROR\" } }\n ),\n ])\n )\n emit.end()\n }\n }\n }\n\n iterate()\n\n // Return cleanup function\n return Effect.sync(() => {\n done = true\n asyncIterator.return?.()\n })\n })\n\n // Add complete event at the end and handle cleanup\n return eventStream.pipe(\n Stream.onDone(() =>\n Effect.gen(function* () {\n yield* Effect.sync(() => {})\n }).pipe(Effect.asVoid)\n ),\n Stream.concat(Stream.make(formatCompleteEvent())),\n Stream.onDone(() => {\n if (options?.onComplete) {\n return Effect.provide(options.onComplete(ctx), layer).pipe(\n Effect.catchAll(() => Effect.void)\n )\n }\n return Effect.void\n })\n )\n }).pipe(\n Effect.catchAll((error) =>\n Effect.succeed(\n Stream.make(\n formatErrorEvent([\n new GraphQLError(error instanceof Error ? error.message : \"Internal error\", {\n extensions: { code: \"INTERNAL_ERROR\" },\n }),\n ]),\n formatCompleteEvent()\n )\n )\n )\n )\n )\n}\n\n/**\n * Create an SSE subscription handler that can be used with platform-specific servers.\n *\n * This is a higher-level API that returns a handler function. The handler\n * takes a request and headers, and returns a Stream of SSE events.\n *\n * @param schema - The GraphQL schema with subscription definitions\n * @param layer - Effect layer providing services required by resolvers\n * @param options - Optional lifecycle hooks and configuration\n * @returns A handler function for SSE subscription requests\n *\n * @example\n * ```typescript\n * const handler = makeGraphQLSSEHandler(schema, serviceLayer, {\n * onConnect: (request, headers) => Effect.gen(function* () {\n * const token = headers.get(\"authorization\")\n * const user = yield* AuthService.validateToken(token)\n * return { user }\n * }),\n * })\n *\n * // In platform-specific code:\n * const events = handler(request, headers)\n * // Stream events to client...\n * ```\n */\nexport const makeGraphQLSSEHandler = <R>(\n schema: GraphQLSchema,\n layer: Layer.Layer<R>,\n options?: GraphQLSSEOptions<R>\n): ((request: SSESubscriptionRequest, headers: Headers) => Stream.Stream<SSEEvent, SSEError>) => {\n return (request, headers) => makeSSESubscriptionStream(schema, layer, request, headers, options)\n}\n\n/**\n * Type guard to check if a value is an AsyncIterable (subscription result)\n */\nfunction isAsyncIterable<T>(value: unknown): value is AsyncIterable<T> {\n return typeof value === \"object\" && value !== null && Symbol.asyncIterator in value\n}\n","import { Effect } from \"effect\"\nimport { Kind, type OperationDefinitionNode } from \"graphql\"\nimport type { GraphQLExtension, ExecutionArgs } from \"./extensions\"\nimport { ExtensionsService } from \"./extensions\"\nimport {\n defaultComplexityCalculator,\n type ComplexityResult,\n type FieldComplexityMap,\n} from \"./server/complexity\"\n\n/**\n * Configuration for the analyzer extension\n */\nexport interface AnalyzerExtensionConfig {\n /**\n * Include the total complexity score in the response.\n * @default true\n */\n readonly includeComplexity?: boolean\n\n /**\n * Include the maximum query depth in the response.\n * @default true\n */\n readonly includeDepth?: boolean\n\n /**\n * Include the total field count in the response.\n * @default false\n */\n readonly includeFieldCount?: boolean\n\n /**\n * Include the alias count in the response.\n * @default false\n */\n readonly includeAliasCount?: boolean\n\n /**\n * The key to use in the response extensions object.\n * @default \"analyzer\"\n */\n readonly key?: string\n\n /**\n * Thresholds for logging warnings when exceeded.\n * When a metric exceeds its threshold, a warning is logged.\n */\n readonly thresholds?: {\n readonly depth?: number\n readonly complexity?: number\n readonly fieldCount?: number\n readonly aliasCount?: number\n }\n\n /**\n * Default complexity cost for fields without explicit costs.\n * @default 1\n */\n readonly defaultFieldComplexity?: number\n\n /**\n * Optional field complexity overrides.\n * If not provided, uses the field complexities from the schema builder\n * (passed via ExecutionArgs).\n */\n readonly fieldComplexities?: FieldComplexityMap\n}\n\n/**\n * Output format for analyzer extension\n */\nexport interface AnalyzerOutput {\n complexity?: number\n depth?: number\n fieldCount?: number\n aliasCount?: number\n}\n\n/**\n * Create an analyzer extension that reports query complexity metrics\n * in the response extensions field.\n *\n * Similar to async-graphql's Analyzer extension, this allows you to\n * monitor the complexity of incoming queries without blocking execution.\n *\n * @example\n * ```typescript\n * // Basic usage - reports complexity and depth\n * const analyzer = createAnalyzerExtension()\n *\n * // With all metrics and warnings\n * const analyzer = createAnalyzerExtension({\n * includeFieldCount: true,\n * includeAliasCount: true,\n * thresholds: {\n * depth: 10,\n * complexity: 100,\n * },\n * })\n *\n * // Add to schema builder\n * const builder = GraphQLSchemaBuilder.empty.pipe(\n * extension(analyzer),\n * // ...queries, mutations, etc.\n * )\n *\n * // Response will include:\n * // {\n * // \"data\": { ... },\n * // \"extensions\": {\n * // \"analyzer\": {\n * // \"complexity\": 42,\n * // \"depth\": 3\n * // }\n * // }\n * // }\n * ```\n */\nexport const createAnalyzerExtension = (\n config: AnalyzerExtensionConfig = {}\n): GraphQLExtension<ExtensionsService> => {\n const {\n includeComplexity = true,\n includeDepth = true,\n includeFieldCount = false,\n includeAliasCount = false,\n key = \"analyzer\",\n thresholds,\n defaultFieldComplexity = 1,\n fieldComplexities: configFieldComplexities,\n } = config\n\n return {\n name: \"analyzer\",\n description: \"Reports query complexity metrics in response extensions\",\n\n onExecuteStart: (args: ExecutionArgs) =>\n Effect.gen(function* () {\n const ext = yield* ExtensionsService\n\n // Find the operation\n const operation = findOperation(args)\n if (!operation) {\n return\n }\n\n // Use config field complexities if provided, otherwise use from args\n const fieldComplexities = configFieldComplexities ?? args.fieldComplexities\n\n // Calculate complexity\n const calculator = defaultComplexityCalculator(defaultFieldComplexity)\n const result = yield* calculator({\n document: args.document,\n operation,\n variables: args.variableValues,\n schema: args.schema,\n fieldComplexities,\n }).pipe(\n Effect.catchAll((error) =>\n Effect.logWarning(\"Analyzer extension: complexity calculation failed\", error).pipe(\n Effect.as(null)\n )\n )\n )\n\n if (!result) {\n return\n }\n\n // Check thresholds and log warnings\n yield* checkThresholds(result, thresholds)\n\n // Build output\n const output: AnalyzerOutput = {}\n if (includeComplexity) {\n output.complexity = result.complexity\n }\n if (includeDepth) {\n output.depth = result.depth\n }\n if (includeFieldCount) {\n output.fieldCount = result.fieldCount\n }\n if (includeAliasCount) {\n output.aliasCount = result.aliasCount\n }\n\n // Add to extensions\n yield* ext.set(key, output)\n }),\n }\n}\n\n/**\n * Find the operation to analyze from the document\n */\nfunction findOperation(args: ExecutionArgs): OperationDefinitionNode | null {\n const operations = args.document.definitions.filter(\n (d): d is OperationDefinitionNode => d.kind === Kind.OPERATION_DEFINITION\n )\n\n if (operations.length === 0) {\n return null\n }\n\n if (args.operationName) {\n return operations.find((o) => o.name?.value === args.operationName) ?? null\n }\n\n return operations[0]\n}\n\n/**\n * Check thresholds and log warnings for exceeded values\n */\nfunction checkThresholds(\n result: ComplexityResult,\n thresholds?: AnalyzerExtensionConfig[\"thresholds\"]\n): Effect.Effect<void> {\n if (!thresholds) {\n return Effect.void\n }\n\n const warnings: string[] = []\n\n if (thresholds.depth !== undefined && result.depth > thresholds.depth) {\n warnings.push(`Query depth ${result.depth} exceeds threshold ${thresholds.depth}`)\n }\n if (thresholds.complexity !== undefined && result.complexity > thresholds.complexity) {\n warnings.push(\n `Query complexity ${result.complexity} exceeds threshold ${thresholds.complexity}`\n )\n }\n if (thresholds.fieldCount !== undefined && result.fieldCount > thresholds.fieldCount) {\n warnings.push(\n `Query field count ${result.fieldCount} exceeds threshold ${thresholds.fieldCount}`\n )\n }\n if (thresholds.aliasCount !== undefined && result.aliasCount > thresholds.aliasCount) {\n warnings.push(\n `Query alias count ${result.aliasCount} exceeds threshold ${thresholds.aliasCount}`\n )\n }\n\n if (warnings.length > 0) {\n return Effect.logWarning(\"Analyzer extension: thresholds exceeded\", {\n warnings,\n result,\n })\n }\n\n return Effect.void\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/schema-mapping.ts","../src/builder/type-registry.ts","../src/builder/field-builders.ts","../src/builder/schema-builder.ts","../src/builder/pipe-api.ts","../src/extensions.ts","../src/builder/execute.ts","../src/error.ts","../src/context.ts","../src/loader.ts","../src/resolver-context.ts","../src/server/config.ts","../src/server/graphiql.ts","../src/server/complexity.ts","../src/server/cache-control.ts","../src/server/router.ts","../src/server/schema-builder-extensions.ts","../src/server/ws-types.ts","../src/server/ws-adapter.ts","../src/server/ws-utils.ts","../src/server/sse-types.ts","../src/server/sse-adapter.ts","../src/analyzer-extension.ts"],"names":["AST","GraphQLString","GraphQLFloat","GraphQLBoolean","GraphQLInt","S","GraphQLList","field","GraphQLNonNull","GraphQLObjectType","GraphQLInputObjectType","AST2","enumType","S2","unionType","middleware","effect","Runtime","Queue","Effect","Stream","Option","Fiber","Pipeable","GraphQLDirective","GraphQLEnumType","inputType","interfaceType","GraphQLInterfaceType","GraphQLUnionType","GraphQLSchema","Context","Ref","parse","extensionData","GraphQLError","validate","graphqlExecute","Data","Layer","DataLoader","HashMap","make","Config","Kind","query","getRootType","analyzeSelectionSet","getNamedType","GraphQLScalarType","analyzeFragmentSpread","analyzeInlineFragment","analyzeField","HttpServerResponse","Schema","HttpIncomingMessage","HttpServerRequest","specifiedRules","NoSchemaIntrospectionCustomRule","HttpRouter","Deferred","subscribe"],"mappings":"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","file":"index.cjs","sourcesContent":["import { Effect } from \"effect\"\nimport * as S from \"effect/Schema\"\nimport * as AST from \"effect/SchemaAST\"\nimport {\n GraphQLObjectType,\n GraphQLString,\n GraphQLInt,\n GraphQLFloat,\n GraphQLBoolean,\n GraphQLNonNull,\n GraphQLList,\n GraphQLOutputType,\n GraphQLInputObjectType,\n GraphQLInputType,\n GraphQLFieldConfigMap,\n GraphQLFieldConfigArgumentMap,\n} from \"graphql\"\n\n/**\n * Check if a number AST node represents an integer\n */\nconst isIntegerType = (ast: AST.AST): boolean => {\n // Check for Refinement with integer filter\n if (ast._tag === \"Refinement\") {\n const refinement = ast as any\n\n // S.Int uses a filter with a specific predicate\n // Check the annotations for the integer identifier\n const annotations = refinement.annotations\n if (annotations) {\n // Check for identifier annotation\n const identifier = AST.getIdentifierAnnotation(refinement)\n if (identifier._tag === \"Some\" && identifier.value === \"Int\") {\n return true\n }\n }\n\n // Recursively check the base type\n return isIntegerType(refinement.from)\n }\n return false\n}\n\n/**\n * Convert an Effect Schema to a GraphQL output type\n */\nexport const toGraphQLType = (schema: S.Schema<any, any, any>): GraphQLOutputType => {\n const ast = schema.ast\n\n // Handle primitives\n if (ast._tag === \"StringKeyword\") return GraphQLString\n if (ast._tag === \"NumberKeyword\") return GraphQLFloat\n if (ast._tag === \"BooleanKeyword\") return GraphQLBoolean\n\n // Handle refinements (e.g., S.Int)\n if (ast._tag === \"Refinement\") {\n if (isIntegerType(ast)) {\n return GraphQLInt\n }\n // For other refinements, use the base type\n return toGraphQLType(S.make((ast as any).from))\n }\n\n // Handle literals\n if (ast._tag === \"Literal\") {\n if (typeof ast.literal === \"string\") return GraphQLString\n if (typeof ast.literal === \"number\") {\n // Check if it's an integer literal\n return Number.isInteger(ast.literal) ? GraphQLInt : GraphQLFloat\n }\n if (typeof ast.literal === \"boolean\") return GraphQLBoolean\n }\n\n // Handle arrays - check for TupleType\n if (ast._tag === \"TupleType\") {\n const elements = ast.elements\n if (elements.length > 0) {\n const elementSchema = S.make(elements[0].type)\n return new GraphQLList(toGraphQLType(elementSchema))\n }\n }\n\n // Handle structs/objects\n if (ast._tag === \"TypeLiteral\") {\n const fields: GraphQLFieldConfigMap<any, any> = {}\n\n for (const field of ast.propertySignatures) {\n const fieldName = String(field.name)\n const fieldSchema = S.make(field.type)\n let fieldType = toGraphQLType(fieldSchema)\n\n // Make non-optional fields non-null\n if (!field.isOptional) {\n fieldType = new GraphQLNonNull(fieldType)\n }\n\n fields[fieldName] = { type: fieldType }\n }\n\n // Generate a name from the schema or use a default\n const typeName =\n (schema as any).annotations?.identifier || `Object_${Math.random().toString(36).slice(2, 11)}`\n\n return new GraphQLObjectType({\n name: typeName,\n fields,\n })\n }\n\n // Handle transformations - use the \"to\" side\n if (ast._tag === \"Transformation\") {\n return toGraphQLType(S.make(ast.to))\n }\n\n // Handle unions (use first type as fallback)\n if (ast._tag === \"Union\") {\n const types = ast.types\n if (types.length > 0) {\n return toGraphQLType(S.make(types[0]))\n }\n }\n\n // Handle Suspend (recursive/self-referential schemas)\n if (ast._tag === \"Suspend\") {\n const innerAst = (ast as any).f()\n return toGraphQLType(S.make(innerAst))\n }\n\n // Default fallback\n return GraphQLString\n}\n\n/**\n * Convert an Effect Schema to a GraphQL input type\n */\nexport const toGraphQLInputType = (schema: S.Schema<any, any, any>): GraphQLInputType => {\n const ast = schema.ast\n\n // Handle primitives\n if (ast._tag === \"StringKeyword\") return GraphQLString\n if (ast._tag === \"NumberKeyword\") return GraphQLFloat\n if (ast._tag === \"BooleanKeyword\") return GraphQLBoolean\n\n // Handle refinements (e.g., S.Int)\n if (ast._tag === \"Refinement\") {\n if (isIntegerType(ast)) {\n return GraphQLInt\n }\n // For other refinements, use the base type\n return toGraphQLInputType(S.make((ast as any).from))\n }\n\n // Handle literals\n if (ast._tag === \"Literal\") {\n if (typeof ast.literal === \"string\") return GraphQLString\n if (typeof ast.literal === \"number\") {\n // Check if it's an integer literal\n return Number.isInteger(ast.literal) ? GraphQLInt : GraphQLFloat\n }\n if (typeof ast.literal === \"boolean\") return GraphQLBoolean\n }\n\n // Handle arrays\n if (ast._tag === \"TupleType\") {\n const elements = ast.elements\n if (elements.length > 0) {\n const elementSchema = S.make(elements[0].type)\n return new GraphQLList(toGraphQLInputType(elementSchema))\n }\n }\n\n // Handle structs/objects as input types\n if (ast._tag === \"TypeLiteral\") {\n const fields: Record<string, { type: GraphQLInputType }> = {}\n\n for (const field of ast.propertySignatures) {\n const fieldName = String(field.name)\n const fieldSchema = S.make(field.type)\n let fieldType = toGraphQLInputType(fieldSchema)\n\n // Make non-optional fields non-null\n if (!field.isOptional) {\n fieldType = new GraphQLNonNull(fieldType)\n }\n\n fields[fieldName] = { type: fieldType }\n }\n\n const typeName =\n (schema as any).annotations?.identifier || `Input_${Math.random().toString(36).slice(2, 11)}`\n\n return new GraphQLInputObjectType({\n name: typeName,\n fields,\n })\n }\n\n // Handle transformations - use the \"from\" side for input\n if (ast._tag === \"Transformation\") {\n return toGraphQLInputType(S.make(ast.from))\n }\n\n // Handle unions (use first type as fallback)\n if (ast._tag === \"Union\") {\n const types = ast.types\n if (types.length > 0) {\n return toGraphQLInputType(S.make(types[0]))\n }\n }\n\n // Handle Suspend (recursive/self-referential schemas)\n if (ast._tag === \"Suspend\") {\n const innerAst = (ast as any).f()\n return toGraphQLInputType(S.make(innerAst))\n }\n\n // Default fallback\n return GraphQLString\n}\n\n/**\n * Additional field configuration for computed/relational fields\n */\nexport interface AdditionalField<Parent, Args, R, E, A> {\n type: GraphQLOutputType\n args?: GraphQLFieldConfigArgumentMap\n description?: string\n resolve: (parent: Parent, args: Args) => Effect.Effect<A, E, R>\n}\n\n/**\n * Create a GraphQL Object Type from an Effect Schema with a name\n * Optionally add computed/relational fields with resolvers\n */\nexport const toGraphQLObjectType = <T>(\n name: string,\n schema: S.Schema<any, any, any>,\n additionalFields?: Record<string, AdditionalField<T, any, any, any, any>>\n): GraphQLObjectType => {\n const ast = schema.ast\n\n if (ast._tag === \"TypeLiteral\") {\n const fields: GraphQLFieldConfigMap<any, any> = {}\n\n // Add fields from schema\n for (const field of ast.propertySignatures) {\n const fieldName = String(field.name)\n const fieldSchema = S.make(field.type)\n let fieldType = toGraphQLType(fieldSchema)\n\n // Make non-optional fields non-null\n if (!field.isOptional) {\n fieldType = new GraphQLNonNull(fieldType)\n }\n\n fields[fieldName] = { type: fieldType }\n }\n\n // Add additional computed/relational fields\n if (additionalFields) {\n for (const [fieldName, fieldConfig] of Object.entries(additionalFields)) {\n fields[fieldName] = {\n type: fieldConfig.type,\n args: fieldConfig.args,\n description: fieldConfig.description,\n // Note: resolve will be set later when runtime is available\n resolve: fieldConfig.resolve as any,\n }\n }\n }\n\n return new GraphQLObjectType({\n name,\n fields,\n })\n }\n\n throw new Error(`Schema must be an object type to convert to GraphQLObjectType`)\n}\n\n/**\n * Convert an Effect Schema to GraphQL arguments\n */\nexport const toGraphQLArgs = (schema: S.Schema<any, any, any>): GraphQLFieldConfigArgumentMap => {\n const ast = schema.ast\n\n if (ast._tag === \"TypeLiteral\") {\n const args: GraphQLFieldConfigArgumentMap = {}\n\n for (const field of ast.propertySignatures) {\n const fieldName = String(field.name)\n const fieldSchema = S.make(field.type)\n let fieldType = toGraphQLInputType(fieldSchema)\n\n // Make non-optional fields non-null\n if (!field.isOptional) {\n fieldType = new GraphQLNonNull(fieldType)\n }\n\n args[fieldName] = { type: fieldType }\n }\n\n return args\n }\n\n throw new Error(`Schema must be an object type to convert to GraphQL arguments`)\n}\n","import * as S from \"effect/Schema\"\nimport * as AST from \"effect/SchemaAST\"\nimport {\n GraphQLObjectType,\n GraphQLInterfaceType,\n GraphQLEnumType,\n GraphQLUnionType,\n GraphQLInputObjectType,\n GraphQLList,\n GraphQLNonNull,\n GraphQLFieldConfigMap,\n GraphQLInputFieldConfigMap,\n} from \"graphql\"\nimport { toGraphQLType, toGraphQLArgs, toGraphQLInputType } from \"../schema-mapping\"\nimport type {\n TypeRegistration,\n InterfaceRegistration,\n EnumRegistration,\n UnionRegistration,\n InputTypeRegistration,\n} from \"./types\"\n\n/**\n * Extract type name from a schema if it has one.\n * Supports:\n * - S.TaggedStruct(\"Name\", {...}) - extracts from _tag literal\n * - S.TaggedClass()(\"Name\", {...}) - extracts from identifier annotation\n * - S.Class<T>(\"Name\")({...}) - extracts from identifier annotation\n */\nexport function getSchemaName(schema: S.Schema<any, any, any>): string | undefined {\n const ast = schema.ast\n\n // Handle Transformation (Schema.Class, TaggedClass)\n if (ast._tag === \"Transformation\") {\n const identifier = AST.getIdentifierAnnotation((ast as any).to)\n if (identifier._tag === \"Some\") {\n return identifier.value\n }\n }\n\n // Handle TypeLiteral (TaggedStruct)\n if (ast._tag === \"TypeLiteral\") {\n const tagProp = (ast as any).propertySignatures.find((p: any) => String(p.name) === \"_tag\")\n if (tagProp && tagProp.type._tag === \"Literal\" && typeof tagProp.type.literal === \"string\") {\n return tagProp.type.literal\n }\n }\n\n return undefined\n}\n\n/**\n * Context needed for type conversion operations\n */\nexport interface TypeConversionContext {\n types: Map<string, TypeRegistration>\n interfaces: Map<string, InterfaceRegistration>\n enums: Map<string, EnumRegistration>\n unions: Map<string, UnionRegistration>\n inputs: Map<string, InputTypeRegistration>\n typeRegistry: Map<string, GraphQLObjectType>\n interfaceRegistry: Map<string, GraphQLInterfaceType>\n enumRegistry: Map<string, GraphQLEnumType>\n unionRegistry: Map<string, GraphQLUnionType>\n inputRegistry: Map<string, GraphQLInputObjectType>\n // Reverse lookup caches for O(1) type resolution\n schemaToTypeName?: Map<S.Schema<any, any, any>, string>\n astToTypeName?: Map<AST.AST, string>\n schemaToInterfaceName?: Map<S.Schema<any, any, any>, string>\n astToInterfaceName?: Map<AST.AST, string>\n schemaToInputName?: Map<S.Schema<any, any, any>, string>\n astToInputName?: Map<AST.AST, string>\n // Cached sorted values for enum/union matching\n enumSortedValues?: Map<string, readonly string[]>\n unionSortedTypes?: Map<string, readonly string[]>\n // Reverse lookup: literal value -> enum name (for single literal O(1) lookup)\n literalToEnumName?: Map<string, string>\n}\n\n/**\n * Build reverse lookup maps from registration maps for O(1) type resolution\n */\nexport function buildReverseLookups(ctx: TypeConversionContext): void {\n // Build schema/AST -> type name lookups\n if (!ctx.schemaToTypeName) {\n ctx.schemaToTypeName = new Map()\n ctx.astToTypeName = new Map()\n for (const [typeName, typeReg] of ctx.types) {\n ctx.schemaToTypeName.set(typeReg.schema, typeName)\n ctx.astToTypeName.set(typeReg.schema.ast, typeName)\n }\n }\n\n // Build schema/AST -> interface name lookups\n if (!ctx.schemaToInterfaceName) {\n ctx.schemaToInterfaceName = new Map()\n ctx.astToInterfaceName = new Map()\n for (const [interfaceName, interfaceReg] of ctx.interfaces) {\n ctx.schemaToInterfaceName.set(interfaceReg.schema, interfaceName)\n ctx.astToInterfaceName.set(interfaceReg.schema.ast, interfaceName)\n }\n }\n\n // Build schema/AST -> input name lookups\n if (!ctx.schemaToInputName) {\n ctx.schemaToInputName = new Map()\n ctx.astToInputName = new Map()\n for (const [inputName, inputReg] of ctx.inputs) {\n ctx.schemaToInputName.set(inputReg.schema, inputName)\n ctx.astToInputName.set(inputReg.schema.ast, inputName)\n }\n }\n\n // Build cached sorted enum values and literal -> enum lookup\n if (!ctx.enumSortedValues) {\n ctx.enumSortedValues = new Map()\n ctx.literalToEnumName = new Map()\n for (const [enumName, enumReg] of ctx.enums) {\n ctx.enumSortedValues.set(enumName, [...enumReg.values].sort())\n // Build literal -> enum reverse lookup for O(1) single literal lookups\n for (const value of enumReg.values) {\n ctx.literalToEnumName.set(value, enumName)\n }\n }\n }\n\n // Build cached sorted union types\n if (!ctx.unionSortedTypes) {\n ctx.unionSortedTypes = new Map()\n for (const [unionName, unionReg] of ctx.unions) {\n ctx.unionSortedTypes.set(unionName, [...unionReg.types].sort())\n }\n }\n}\n\n// GraphQLNonNull wrapper cache for memoization\nconst nonNullCache = new WeakMap<any, GraphQLNonNull<any>>()\n\n/**\n * Get or create a GraphQLNonNull wrapper (memoized)\n */\nexport function getNonNull<T extends import(\"graphql\").GraphQLNullableType>(\n type: T\n): GraphQLNonNull<T> {\n let cached = nonNullCache.get(type)\n if (!cached) {\n cached = new GraphQLNonNull(type)\n nonNullCache.set(type, cached)\n }\n return cached\n}\n\n/**\n * Convert schema to GraphQL type, checking registry first for registered types\n */\nexport function toGraphQLTypeWithRegistry(\n schema: S.Schema<any, any, any>,\n ctx: TypeConversionContext\n): any {\n // Ensure reverse lookup maps are built\n buildReverseLookups(ctx)\n\n const ast = schema.ast\n\n // Check registered object types first\n const registeredType = findRegisteredType(schema, ast, ctx)\n if (registeredType) return registeredType\n\n // Check registered interfaces\n const registeredInterface = findRegisteredInterface(schema, ast, ctx)\n if (registeredInterface) return registeredInterface\n\n // Handle transformations (like S.Array, S.optional, etc)\n if (ast._tag === \"Transformation\") {\n return handleTransformationAST(ast, ctx)\n }\n\n // Handle unions (enum literals or object type unions)\n if (ast._tag === \"Union\") {\n return handleUnionAST(ast, ctx)\n }\n\n // Check single literal for enum match\n if (ast._tag === \"Literal\") {\n const enumType = findEnumForLiteral(ast, ctx)\n if (enumType) return enumType\n }\n\n // Handle tuple types (readonly arrays)\n if (ast._tag === \"TupleType\") {\n return handleTupleTypeAST(ast, ctx)\n }\n\n // Handle Suspend (recursive/self-referential schemas)\n if (ast._tag === \"Suspend\") {\n const innerAst = (ast as any).f()\n return toGraphQLTypeWithRegistry(S.make(innerAst), ctx)\n }\n\n // Fall back to default conversion\n return toGraphQLType(schema)\n}\n\n/**\n * Find a registered object type matching this schema (O(1) with reverse lookup)\n */\nfunction findRegisteredType(\n schema: S.Schema<any, any, any>,\n ast: AST.AST,\n ctx: TypeConversionContext\n): GraphQLObjectType | undefined {\n // Use reverse lookup maps for O(1) lookup\n const typeName = ctx.schemaToTypeName?.get(schema) ?? ctx.astToTypeName?.get(ast)\n if (typeName) {\n return ctx.typeRegistry.get(typeName)\n }\n return undefined\n}\n\n/**\n * Find a registered interface matching this schema (O(1) with reverse lookup)\n */\nfunction findRegisteredInterface(\n schema: S.Schema<any, any, any>,\n ast: AST.AST,\n ctx: TypeConversionContext\n): GraphQLInterfaceType | undefined {\n // Use reverse lookup maps for O(1) lookup\n const interfaceName = ctx.schemaToInterfaceName?.get(schema) ?? ctx.astToInterfaceName?.get(ast)\n if (interfaceName) {\n return ctx.interfaceRegistry.get(interfaceName)\n }\n return undefined\n}\n\n/**\n * Handle Transformation AST nodes (arrays, optional, Schema.Class, etc.)\n */\nfunction handleTransformationAST(ast: any, ctx: TypeConversionContext): any {\n const toAst = ast.to\n\n // Check if it's an array (readonly array on the to side)\n if (toAst._tag === \"TupleType\") {\n if (toAst.rest && toAst.rest.length > 0) {\n const elementSchema = S.make(toAst.rest[0].type)\n const elementType = toGraphQLTypeWithRegistry(elementSchema, ctx)\n return new GraphQLList(elementType)\n } else if (toAst.elements.length > 0) {\n const elementSchema = S.make(toAst.elements[0].type)\n const elementType = toGraphQLTypeWithRegistry(elementSchema, ctx)\n return new GraphQLList(elementType)\n }\n }\n\n // Other transformations - recurse on the \"to\" side\n return toGraphQLTypeWithRegistry(S.make(ast.to), ctx)\n}\n\n/**\n * Handle Union AST nodes (literal enums or object type unions)\n */\nfunction handleUnionAST(ast: any, ctx: TypeConversionContext): any {\n const allLiterals = ast.types.every((t: any) => t._tag === \"Literal\")\n\n if (allLiterals) {\n // This might be an enum\n const enumType = findEnumForLiteralUnion(ast.types, ctx)\n if (enumType) return enumType\n } else {\n // This is a Union of object types - check if it matches a registered union\n const unionType = findRegisteredUnion(ast.types, ctx)\n if (unionType) return unionType\n }\n\n // Fallback: use first type\n if (ast.types.length > 0) {\n return toGraphQLTypeWithRegistry(S.make(ast.types[0]), ctx)\n }\n\n return toGraphQLType(S.make(ast))\n}\n\n/**\n * Find a registered enum matching a union of literals (uses cached sorted values)\n */\nfunction findEnumForLiteralUnion(\n types: any[],\n ctx: TypeConversionContext\n): GraphQLEnumType | undefined {\n const literalValues = types.map((t: any) => String(t.literal)).sort()\n\n for (const [enumName] of ctx.enums) {\n // Use cached sorted values instead of sorting on every comparison\n const enumValues = ctx.enumSortedValues?.get(enumName)\n if (\n enumValues &&\n literalValues.length === enumValues.length &&\n literalValues.every((v: string, i: number) => v === enumValues[i])\n ) {\n return ctx.enumRegistry.get(enumName)\n }\n }\n return undefined\n}\n\n/**\n * Find a registered union matching an object type union (uses cached sorted types)\n */\nfunction findRegisteredUnion(\n types: any[],\n ctx: TypeConversionContext\n): GraphQLUnionType | undefined {\n // Collect _tag values from each union member\n const memberTags: string[] = []\n for (const memberAst of types) {\n if (memberAst._tag === \"TypeLiteral\") {\n const tagProp = memberAst.propertySignatures.find((p: any) => String(p.name) === \"_tag\")\n if (tagProp && tagProp.type._tag === \"Literal\") {\n memberTags.push(String(tagProp.type.literal))\n }\n }\n }\n\n // Check if any registered union has matching types\n if (memberTags.length === types.length) {\n const sortedTags = memberTags.sort()\n for (const [unionName] of ctx.unions) {\n // Use cached sorted types instead of sorting on every comparison\n const unionTypes = ctx.unionSortedTypes?.get(unionName)\n if (\n unionTypes &&\n sortedTags.length === unionTypes.length &&\n sortedTags.every((tag, i) => tag === unionTypes[i])\n ) {\n return ctx.unionRegistry.get(unionName)\n }\n }\n }\n return undefined\n}\n\n/**\n * Find a registered enum containing a single literal value (O(1) with reverse lookup)\n */\nfunction findEnumForLiteral(ast: any, ctx: TypeConversionContext): GraphQLEnumType | undefined {\n const literalValue = String(ast.literal)\n // Use reverse lookup map for O(1) lookup instead of O(N×M) iteration\n const enumName = ctx.literalToEnumName?.get(literalValue)\n if (enumName) {\n return ctx.enumRegistry.get(enumName)\n }\n return undefined\n}\n\n/**\n * Handle TupleType AST nodes (arrays)\n */\nfunction handleTupleTypeAST(ast: any, ctx: TypeConversionContext): any {\n if (ast.rest && ast.rest.length > 0) {\n const elementSchema = S.make(ast.rest[0].type)\n const elementType = toGraphQLTypeWithRegistry(elementSchema, ctx)\n return new GraphQLList(elementType)\n } else if (ast.elements && ast.elements.length > 0) {\n const elementSchema = S.make(ast.elements[0].type)\n const elementType = toGraphQLTypeWithRegistry(elementSchema, ctx)\n return new GraphQLList(elementType)\n }\n return toGraphQLType(S.make(ast))\n}\n\n/**\n * Convert a schema to GraphQL fields\n */\nexport function schemaToFields(\n schema: S.Schema<any, any, any>,\n ctx: TypeConversionContext\n): GraphQLFieldConfigMap<any, any> {\n let ast = schema.ast\n\n // Handle Transformation (Schema.Class, TaggedClass)\n if (ast._tag === \"Transformation\") {\n ast = (ast as any).to\n }\n\n // Handle Declaration (Schema.Class wraps TypeLiteral in Declaration)\n if (ast._tag === \"Declaration\") {\n const typeParams = (ast as any).typeParameters\n if (typeParams && typeParams.length > 0 && typeParams[0]._tag === \"TypeLiteral\") {\n ast = typeParams[0]\n }\n }\n\n if (ast._tag === \"TypeLiteral\") {\n const fields: GraphQLFieldConfigMap<any, any> = {}\n\n for (const field of (ast as any).propertySignatures) {\n const fieldName = String(field.name)\n const fieldSchema = S.make(field.type)\n let fieldType = toGraphQLTypeWithRegistry(fieldSchema, ctx)\n\n // Make non-optional fields non-null (memoized)\n if (!field.isOptional) {\n fieldType = getNonNull(fieldType)\n }\n\n fields[fieldName] = { type: fieldType }\n }\n\n return fields\n }\n\n return {}\n}\n\n/**\n * Convert a schema to GraphQL input fields\n */\nexport function schemaToInputFields(\n schema: S.Schema<any, any, any>,\n enumRegistry: Map<string, GraphQLEnumType>,\n inputRegistry: Map<string, GraphQLInputObjectType>,\n inputs: Map<string, InputTypeRegistration>,\n enums: Map<string, EnumRegistration>,\n cache?: InputTypeLookupCache\n): GraphQLInputFieldConfigMap {\n const ast = schema.ast\n\n if (ast._tag === \"TypeLiteral\") {\n const fields: GraphQLInputFieldConfigMap = {}\n\n for (const field of ast.propertySignatures) {\n const fieldName = String(field.name)\n const fieldSchema = S.make(field.type)\n let fieldType = toGraphQLInputTypeWithRegistry(\n fieldSchema,\n enumRegistry,\n inputRegistry,\n inputs,\n enums,\n cache\n )\n\n // Make non-optional fields non-null (memoized)\n if (!field.isOptional) {\n fieldType = getNonNull(fieldType)\n }\n\n fields[fieldName] = { type: fieldType }\n }\n\n return fields\n }\n\n return {}\n}\n\n/**\n * Optional cache for input type lookups to enable O(1) resolution\n */\nexport interface InputTypeLookupCache {\n schemaToInputName?: Map<S.Schema<any, any, any>, string>\n astToInputName?: Map<AST.AST, string>\n literalToEnumName?: Map<string, string>\n enumSortedValues?: Map<string, readonly string[]>\n}\n\n/**\n * Build lookup caches for input type resolution\n */\nexport function buildInputTypeLookupCache(\n inputs: Map<string, InputTypeRegistration>,\n enums: Map<string, EnumRegistration>\n): InputTypeLookupCache {\n const cache: InputTypeLookupCache = {\n schemaToInputName: new Map(),\n astToInputName: new Map(),\n literalToEnumName: new Map(),\n enumSortedValues: new Map(),\n }\n\n // Build input type reverse lookups\n for (const [inputName, inputReg] of inputs) {\n cache.schemaToInputName!.set(inputReg.schema, inputName)\n cache.astToInputName!.set(inputReg.schema.ast, inputName)\n }\n\n // Build enum lookups\n for (const [enumName, enumReg] of enums) {\n cache.enumSortedValues!.set(enumName, [...enumReg.values].sort())\n for (const value of enumReg.values) {\n cache.literalToEnumName!.set(value, enumName)\n }\n }\n\n return cache\n}\n\n/**\n * Convert a schema to GraphQL input type, checking enum and input registries.\n * Uses O(1) reverse lookups when cache is provided.\n */\nexport function toGraphQLInputTypeWithRegistry(\n schema: S.Schema<any, any, any>,\n enumRegistry: Map<string, GraphQLEnumType>,\n inputRegistry: Map<string, GraphQLInputObjectType>,\n inputs: Map<string, InputTypeRegistration>,\n enums: Map<string, EnumRegistration>,\n cache?: InputTypeLookupCache\n): any {\n const ast = schema.ast\n\n // Handle transformations (like S.optional wrapping)\n if (ast._tag === \"Transformation\") {\n const toAst = (ast as any).to\n return toGraphQLInputTypeWithRegistry(\n S.make(toAst),\n enumRegistry,\n inputRegistry,\n inputs,\n enums,\n cache\n )\n }\n\n // Check if this schema matches a registered input type (O(1) with cache)\n if (cache?.schemaToInputName || cache?.astToInputName) {\n const inputName = cache.schemaToInputName?.get(schema) ?? cache.astToInputName?.get(ast)\n if (inputName) {\n const result = inputRegistry.get(inputName)\n if (result) return result\n }\n } else {\n // Fallback to linear scan if no cache\n for (const [inputName, inputReg] of inputs) {\n if (inputReg.schema.ast === ast || inputReg.schema === schema) {\n const result = inputRegistry.get(inputName)\n if (result) return result\n }\n }\n }\n\n // Check if this schema matches a registered enum\n if (ast._tag === \"Union\") {\n const unionAst = ast as any\n\n // Handle S.optional which creates Union(LiteralUnion, UndefinedKeyword)\n const nonUndefinedTypes = unionAst.types.filter((t: any) => t._tag !== \"UndefinedKeyword\")\n if (nonUndefinedTypes.length === 1 && nonUndefinedTypes[0]._tag === \"Union\") {\n return toGraphQLInputTypeWithRegistry(\n S.make(nonUndefinedTypes[0]),\n enumRegistry,\n inputRegistry,\n inputs,\n enums,\n cache\n )\n }\n\n // Check for nested input type inside optional\n if (nonUndefinedTypes.length === 1 && nonUndefinedTypes[0]._tag === \"TypeLiteral\") {\n return toGraphQLInputTypeWithRegistry(\n S.make(nonUndefinedTypes[0]),\n enumRegistry,\n inputRegistry,\n inputs,\n enums,\n cache\n )\n }\n\n const allLiterals = unionAst.types.every((t: any) => t._tag === \"Literal\")\n\n if (allLiterals) {\n const literalValues = unionAst.types.map((t: any) => String(t.literal)).sort()\n\n // Use cached sorted values if available\n for (const [enumName] of enums) {\n const enumValues =\n cache?.enumSortedValues?.get(enumName) ?? [...enums.get(enumName)!.values].sort()\n if (\n literalValues.length === enumValues.length &&\n literalValues.every((v: string, i: number) => v === enumValues[i])\n ) {\n const result = enumRegistry.get(enumName)\n if (result) return result\n }\n }\n }\n }\n\n // Check single literal (O(1) with cache)\n if (ast._tag === \"Literal\") {\n const literalValue = String((ast as any).literal)\n if (cache?.literalToEnumName) {\n const enumName = cache.literalToEnumName.get(literalValue)\n if (enumName) {\n const result = enumRegistry.get(enumName)\n if (result) return result\n }\n } else {\n // Fallback to linear scan if no cache\n for (const [enumName, enumReg] of enums) {\n if (enumReg.values.includes(literalValue)) {\n const result = enumRegistry.get(enumName)\n if (result) return result\n }\n }\n }\n }\n\n // Handle Suspend (recursive/self-referential schemas)\n if (ast._tag === \"Suspend\") {\n const innerAst = (ast as any).f()\n return toGraphQLInputTypeWithRegistry(\n S.make(innerAst),\n enumRegistry,\n inputRegistry,\n inputs,\n enums,\n cache\n )\n }\n\n // Fall back to default toGraphQLInputType\n return toGraphQLInputType(schema)\n}\n\n/**\n * Convert a schema to GraphQL arguments with registry support.\n * Uses O(1) reverse lookups when cache is provided.\n */\nexport function toGraphQLArgsWithRegistry(\n schema: S.Schema<any, any, any>,\n enumRegistry: Map<string, GraphQLEnumType>,\n inputRegistry: Map<string, GraphQLInputObjectType>,\n inputs: Map<string, InputTypeRegistration>,\n enums: Map<string, EnumRegistration>,\n cache?: InputTypeLookupCache\n): any {\n const ast = schema.ast\n\n if (ast._tag === \"TypeLiteral\") {\n const args: Record<string, { type: any }> = {}\n\n for (const field of (ast as any).propertySignatures) {\n const fieldName = String(field.name)\n const fieldSchema = S.make(field.type)\n let fieldType = toGraphQLInputTypeWithRegistry(\n fieldSchema,\n enumRegistry,\n inputRegistry,\n inputs,\n enums,\n cache\n )\n\n // Make non-optional fields non-null (memoized)\n if (!field.isOptional) {\n fieldType = getNonNull(fieldType)\n }\n\n args[fieldName] = { type: fieldType }\n }\n\n return args\n }\n\n // Fall back to default toGraphQLArgs\n return toGraphQLArgs(schema)\n}\n","import { Effect, Runtime, Stream, Queue, Fiber, Option } from \"effect\"\nimport { GraphQLFieldConfig, GraphQLResolveInfo } from \"graphql\"\nimport type {\n FieldRegistration,\n SubscriptionFieldRegistration,\n ObjectFieldRegistration,\n DirectiveRegistration,\n MiddlewareRegistration,\n MiddlewareContext,\n GraphQLEffectContext,\n} from \"./types\"\nimport {\n toGraphQLTypeWithRegistry,\n toGraphQLArgsWithRegistry,\n type TypeConversionContext,\n type InputTypeLookupCache,\n} from \"./type-registry\"\n\n/**\n * Context needed for building fields\n */\nexport interface FieldBuilderContext extends TypeConversionContext {\n directiveRegistrations: Map<string, DirectiveRegistration>\n middlewares: readonly MiddlewareRegistration[]\n inputTypeLookupCache?: InputTypeLookupCache\n}\n\n/**\n * Apply directives to an Effect by wrapping it with directive transformers\n */\nfunction applyDirectives<A, E, R>(\n effect: Effect.Effect<A, E, R>,\n directives: readonly { name: string; args?: Record<string, unknown> }[] | undefined,\n directiveRegistrations: Map<string, DirectiveRegistration>\n): Effect.Effect<A, E, any> {\n if (!directives) return effect\n\n let wrapped = effect\n for (const directiveApp of directives) {\n const directiveReg = directiveRegistrations.get(directiveApp.name)\n if (directiveReg?.apply) {\n wrapped = directiveReg.apply(directiveApp.args ?? {})(wrapped)\n }\n }\n return wrapped\n}\n\n/**\n * Apply middleware to an Effect by wrapping it with middleware transformers.\n *\n * Middleware executes in \"onion\" order - first registered middleware is the\n * outermost layer, meaning it runs first before and last after the resolver.\n *\n * Each middleware can optionally specify a `match` predicate to filter which\n * fields it applies to.\n */\nfunction applyMiddleware<A, E, R>(\n effect: Effect.Effect<A, E, R>,\n context: MiddlewareContext,\n middlewares: readonly MiddlewareRegistration[]\n): Effect.Effect<A, E, any> {\n if (middlewares.length === 0) return effect\n\n let wrapped = effect\n\n // Apply in reverse order so first registered is outermost\n // (executes first before, last after)\n for (let i = middlewares.length - 1; i >= 0; i--) {\n const middleware = middlewares[i]\n\n // Check if middleware should apply to this field\n if (middleware.match && !middleware.match(context.info)) {\n continue\n }\n\n wrapped = middleware.apply(wrapped, context)\n }\n\n return wrapped\n}\n\n/**\n * Build a GraphQL field config from a field registration (for queries/mutations)\n */\nexport function buildField(\n config: FieldRegistration,\n ctx: FieldBuilderContext\n): GraphQLFieldConfig<any, any> {\n const fieldConfig: GraphQLFieldConfig<any, any> = {\n type: toGraphQLTypeWithRegistry(config.type, ctx),\n resolve: async (\n _parent,\n args,\n context: GraphQLEffectContext<any>,\n info: GraphQLResolveInfo\n ) => {\n // Apply directives first (per-field, explicit)\n let effect = applyDirectives(\n config.resolve(args),\n config.directives,\n ctx.directiveRegistrations\n )\n\n // Apply middleware (global/pattern-matched)\n const middlewareContext: MiddlewareContext = { parent: _parent, args, info }\n effect = applyMiddleware(effect, middlewareContext, ctx.middlewares)\n\n return await Runtime.runPromise(context.runtime)(effect)\n },\n }\n\n if (config.args) {\n fieldConfig.args = toGraphQLArgsWithRegistry(\n config.args,\n ctx.enumRegistry,\n ctx.inputRegistry,\n ctx.inputs,\n ctx.enums,\n ctx.inputTypeLookupCache\n )\n }\n if (config.description) {\n fieldConfig.description = config.description\n }\n\n return fieldConfig\n}\n\n/**\n * Build a GraphQL field config for an object field (has parent param)\n */\nexport function buildObjectField(\n config: ObjectFieldRegistration,\n ctx: FieldBuilderContext\n): GraphQLFieldConfig<any, any> {\n const fieldConfig: GraphQLFieldConfig<any, any> = {\n type: toGraphQLTypeWithRegistry(config.type, ctx),\n resolve: async (parent, args, context: GraphQLEffectContext<any>, info: GraphQLResolveInfo) => {\n // Apply directives first (per-field, explicit)\n let effect = applyDirectives(\n config.resolve(parent, args),\n config.directives,\n ctx.directiveRegistrations\n )\n\n // Apply middleware (global/pattern-matched)\n const middlewareContext: MiddlewareContext = { parent, args, info }\n effect = applyMiddleware(effect, middlewareContext, ctx.middlewares)\n\n return await Runtime.runPromise(context.runtime)(effect)\n },\n }\n\n if (config.args) {\n fieldConfig.args = toGraphQLArgsWithRegistry(\n config.args,\n ctx.enumRegistry,\n ctx.inputRegistry,\n ctx.inputs,\n ctx.enums,\n ctx.inputTypeLookupCache\n )\n }\n if (config.description) {\n fieldConfig.description = config.description\n }\n\n return fieldConfig\n}\n\n/**\n * Build a GraphQL subscription field config.\n *\n * Subscriptions in GraphQL have a special structure:\n * - `subscribe` returns an AsyncIterator that yields the \"root value\" for each event\n * - `resolve` transforms each yielded value into the final result\n *\n * We convert Effect's Stream to an AsyncIterator using a Queue-based approach.\n */\nexport function buildSubscriptionField(\n config: SubscriptionFieldRegistration,\n ctx: FieldBuilderContext\n): GraphQLFieldConfig<any, any> {\n const fieldConfig: GraphQLFieldConfig<any, any> = {\n type: toGraphQLTypeWithRegistry(config.type, ctx),\n\n // The subscribe function returns an AsyncIterator\n subscribe: async (\n _parent,\n args,\n context: GraphQLEffectContext<any>,\n info: GraphQLResolveInfo\n ) => {\n // Get the Stream from the subscribe Effect\n let subscribeEffect = config.subscribe(args)\n\n // Apply directives to the subscribe effect\n subscribeEffect = applyDirectives(\n subscribeEffect,\n config.directives,\n ctx.directiveRegistrations\n ) as any\n\n // Apply middleware to the subscribe effect\n const middlewareContext: MiddlewareContext = { parent: _parent, args, info }\n subscribeEffect = applyMiddleware(subscribeEffect, middlewareContext, ctx.middlewares) as any\n\n const stream = await Runtime.runPromise(context.runtime)(subscribeEffect)\n\n // Convert Stream to AsyncIterator using queue-based approach\n return streamToAsyncIterator(stream, context.runtime)\n },\n\n // The resolve function transforms each yielded value\n // If no custom resolve is provided, return the payload directly\n resolve: config.resolve\n ? async (value, args, context: GraphQLEffectContext<any>, info: GraphQLResolveInfo) => {\n let effect = config.resolve!(value, args)\n\n // Apply middleware to the resolve effect\n const middlewareContext: MiddlewareContext = { parent: value, args, info }\n effect = applyMiddleware(effect, middlewareContext, ctx.middlewares)\n\n return await Runtime.runPromise(context.runtime)(effect)\n }\n : (value) => value,\n }\n\n if (config.args) {\n fieldConfig.args = toGraphQLArgsWithRegistry(\n config.args,\n ctx.enumRegistry,\n ctx.inputRegistry,\n ctx.inputs,\n ctx.enums,\n ctx.inputTypeLookupCache\n )\n }\n if (config.description) {\n fieldConfig.description = config.description\n }\n\n return fieldConfig\n}\n\n/**\n * Convert an Effect Stream to an AsyncIterator using a Queue-based approach.\n *\n * This is needed because Stream.toAsyncIterable() requires R = never,\n * but our streams may have service requirements that need to be provided\n * by the runtime context.\n */\nfunction streamToAsyncIterator<A, E, R>(\n stream: Stream.Stream<A, E, R>,\n runtime: Runtime.Runtime<R>\n): AsyncIterator<A> {\n // Create the queue synchronously via runSync since unbounded queue creation is synchronous\n let queue: Queue.Queue<Option.Option<A>>\n let fiber: Fiber.RuntimeFiber<void, E>\n let initialized = false\n let done = false\n\n const initialize = async () => {\n if (initialized) return\n initialized = true\n\n queue = await Runtime.runPromise(runtime)(Queue.unbounded<Option.Option<A>>())\n\n // Fork a fiber to run the stream and push values to the queue\n fiber = Runtime.runFork(runtime)(\n Effect.ensuring(\n Stream.runForEach(stream, (value) => Queue.offer(queue, Option.some(value))),\n // Signal completion by pushing None\n Queue.offer(queue, Option.none())\n )\n )\n }\n\n return {\n [Symbol.asyncIterator]() {\n return this\n },\n\n async next(): Promise<IteratorResult<A>> {\n await initialize()\n\n if (done) {\n return { done: true, value: undefined }\n }\n\n try {\n const optionValue = await Runtime.runPromise(runtime)(Queue.take(queue))\n\n if (Option.isNone(optionValue)) {\n done = true\n return { done: true, value: undefined }\n }\n\n return { done: false, value: optionValue.value }\n } catch (error) {\n done = true\n throw error\n }\n },\n\n async return(): Promise<IteratorResult<A>> {\n // Cleanup - interrupt the fiber and shutdown the queue\n done = true\n if (initialized) {\n try {\n await Runtime.runPromise(runtime)(\n Fiber.interrupt(fiber as unknown as Fiber.Fiber<any, any>)\n )\n await Runtime.runPromise(runtime)(Queue.shutdown(queue))\n } catch {\n // Ignore cleanup errors\n }\n }\n return { done: true, value: undefined }\n },\n } as AsyncIterator<A>\n}\n","import { Effect, Pipeable } from \"effect\"\nimport * as S from \"effect/Schema\"\nimport {\n GraphQLSchema,\n GraphQLObjectType,\n GraphQLInterfaceType,\n GraphQLEnumType,\n GraphQLUnionType,\n GraphQLInputObjectType,\n GraphQLFieldConfigMap,\n GraphQLDirective,\n DirectiveLocation,\n} from \"graphql\"\nimport type {\n FieldRegistration,\n TypeRegistration,\n InterfaceRegistration,\n EnumRegistration,\n UnionRegistration,\n InputTypeRegistration,\n DirectiveRegistration,\n DirectiveApplication,\n SubscriptionFieldRegistration,\n ObjectFieldRegistration,\n MiddlewareRegistration,\n MiddlewareContext,\n CacheHint,\n} from \"./types\"\nimport type { GraphQLExtension, ExecutionArgs } from \"../extensions\"\nimport type {\n GraphQLResolveInfo,\n DocumentNode,\n ExecutionResult,\n GraphQLError as GQLError,\n} from \"graphql\"\nimport type { FieldComplexity, FieldComplexityMap } from \"../server/complexity\"\nimport type { CacheHintMap } from \"../server/cache-control\"\nimport {\n getSchemaName,\n schemaToFields,\n schemaToInputFields,\n toGraphQLArgsWithRegistry,\n buildReverseLookups,\n buildInputTypeLookupCache,\n type TypeConversionContext,\n} from \"./type-registry\"\nimport {\n buildField,\n buildObjectField,\n buildSubscriptionField,\n type FieldBuilderContext,\n} from \"./field-builders\"\n\n/**\n * Internal state for the builder\n */\ninterface BuilderState {\n types: Map<string, TypeRegistration>\n interfaces: Map<string, InterfaceRegistration>\n enums: Map<string, EnumRegistration>\n unions: Map<string, UnionRegistration>\n inputs: Map<string, InputTypeRegistration>\n directives: Map<string, DirectiveRegistration>\n middlewares: readonly MiddlewareRegistration[] // Array to preserve registration order\n extensions: readonly GraphQLExtension<any>[] // Array to preserve registration order\n queries: Map<string, FieldRegistration>\n mutations: Map<string, FieldRegistration>\n subscriptions: Map<string, SubscriptionFieldRegistration>\n objectFields: Map<string, Map<string, ObjectFieldRegistration>>\n}\n\n/**\n * Create a new state with one map updated\n */\nfunction updateState<K extends keyof BuilderState>(\n state: BuilderState,\n key: K,\n value: BuilderState[K]\n): BuilderState {\n return { ...state, [key]: value }\n}\n\n/**\n * GraphQL Schema Builder with type-safe service requirements (Layer-per-Request Pattern)\n *\n * The type parameter R accumulates all service requirements from resolvers.\n * Unlike the runtime-in-context approach, this pattern builds the schema without\n * executing any Effects. At request time, you provide a Layer with all required services.\n */\nexport class GraphQLSchemaBuilder<R = never> implements Pipeable.Pipeable {\n private constructor(private readonly state: BuilderState) {}\n\n /**\n * Pipeable interface implementation - enables fluent .pipe() syntax\n */\n pipe<A>(this: A): A\n pipe<A, B>(this: A, ab: (a: A) => B): B\n pipe<A, B, C>(this: A, ab: (a: A) => B, bc: (b: B) => C): C\n pipe<A, B, C, D>(this: A, ab: (a: A) => B, bc: (b: B) => C, cd: (c: C) => D): D\n pipe<A, B, C, D, E>(\n this: A,\n ab: (a: A) => B,\n bc: (b: B) => C,\n cd: (c: C) => D,\n de: (d: D) => E\n ): E\n pipe<A, B, C, D, E, F>(\n this: A,\n ab: (a: A) => B,\n bc: (b: B) => C,\n cd: (c: C) => D,\n de: (d: D) => E,\n ef: (e: E) => F\n ): F\n pipe<A, B, C, D, E, F, G>(\n this: A,\n ab: (a: A) => B,\n bc: (b: B) => C,\n cd: (c: C) => D,\n de: (d: D) => E,\n ef: (e: E) => F,\n fg: (f: F) => G\n ): G\n pipe<A, B, C, D, E, F, G, H>(\n this: A,\n ab: (a: A) => B,\n bc: (b: B) => C,\n cd: (c: C) => D,\n de: (d: D) => E,\n ef: (e: E) => F,\n fg: (f: F) => G,\n gh: (g: G) => H\n ): H\n pipe<A, B, C, D, E, F, G, H, I>(\n this: A,\n ab: (a: A) => B,\n bc: (b: B) => C,\n cd: (c: C) => D,\n de: (d: D) => E,\n ef: (e: E) => F,\n fg: (f: F) => G,\n gh: (g: G) => H,\n hi: (h: H) => I\n ): I\n pipe() {\n return Pipeable.pipeArguments(this, arguments)\n }\n\n /**\n * Create an empty schema builder\n */\n static readonly empty = new GraphQLSchemaBuilder<never>({\n types: new Map(),\n interfaces: new Map(),\n enums: new Map(),\n unions: new Map(),\n inputs: new Map(),\n directives: new Map(),\n middlewares: [],\n extensions: [],\n queries: new Map(),\n mutations: new Map(),\n subscriptions: new Map(),\n objectFields: new Map(),\n })\n\n /**\n * Create a new builder with updated state\n */\n private with(newState: BuilderState): GraphQLSchemaBuilder<any> {\n return new GraphQLSchemaBuilder(newState)\n }\n\n // ============================================================================\n // Registration Methods\n // ============================================================================\n\n /**\n * Add a query field\n */\n query<A, E, R2, Args = void>(\n name: string,\n config: {\n type: S.Schema<A, any, any>\n args?: S.Schema<Args, any, any>\n description?: string\n directives?: readonly DirectiveApplication[]\n /**\n * Complexity cost of this field for query complexity limiting.\n * Can be a static number or a function that receives the resolved arguments.\n */\n complexity?: FieldComplexity\n /**\n * Cache control hint for this field.\n * Used to compute HTTP Cache-Control headers for the response.\n */\n cacheControl?: CacheHint\n resolve: (args: Args) => Effect.Effect<A, E, R2>\n }\n ): GraphQLSchemaBuilder<R | R2> {\n const newQueries = new Map(this.state.queries)\n newQueries.set(name, config)\n return this.with(updateState(this.state, \"queries\", newQueries))\n }\n\n /**\n * Add a mutation field\n */\n mutation<A, E, R2, Args = void>(\n name: string,\n config: {\n type: S.Schema<A, any, any>\n args?: S.Schema<Args, any, any>\n description?: string\n directives?: readonly DirectiveApplication[]\n /**\n * Complexity cost of this field for query complexity limiting.\n * Can be a static number or a function that receives the resolved arguments.\n */\n complexity?: FieldComplexity\n resolve: (args: Args) => Effect.Effect<A, E, R2>\n }\n ): GraphQLSchemaBuilder<R | R2> {\n const newMutations = new Map(this.state.mutations)\n newMutations.set(name, config)\n return this.with(updateState(this.state, \"mutations\", newMutations))\n }\n\n /**\n * Add a subscription field\n *\n * Subscriptions return a Stream that yields values over time.\n * The subscribe function returns an Effect that produces a Stream.\n *\n * @example\n * ```typescript\n * builder.subscription(\"userCreated\", {\n * type: User,\n * subscribe: Effect.gen(function*() {\n * const pubsub = yield* PubSubService\n * return pubsub.subscribe(\"USER_CREATED\")\n * }),\n * })\n * ```\n */\n subscription<A, E, R2, Args = void>(\n name: string,\n config: {\n type: S.Schema<A, any, any>\n args?: S.Schema<Args, any, any>\n description?: string\n directives?: readonly DirectiveApplication[]\n /**\n * Complexity cost of this subscription for query complexity limiting.\n * Can be a static number or a function that receives the resolved arguments.\n */\n complexity?: FieldComplexity\n /**\n * Cache control hint for this subscription.\n * Note: Subscriptions are typically not cached, but this can be used for initial response hints.\n */\n cacheControl?: CacheHint\n subscribe: (args: Args) => Effect.Effect<import(\"effect\").Stream.Stream<A, E, R2>, E, R2>\n resolve?: (value: A, args: Args) => Effect.Effect<A, E, R2>\n }\n ): GraphQLSchemaBuilder<R | R2> {\n const newSubscriptions = new Map(this.state.subscriptions)\n newSubscriptions.set(name, config)\n return this.with(updateState(this.state, \"subscriptions\", newSubscriptions))\n }\n\n /**\n * Register an object type from a schema\n */\n objectType<A, R2 = never>(config: {\n name?: string\n schema: S.Schema<A, any, any>\n description?: string\n implements?: readonly string[]\n directives?: readonly DirectiveApplication[]\n /**\n * Default cache control hint for all fields returning this type.\n * Can be overridden by field-level cacheControl.\n */\n cacheControl?: CacheHint\n fields?: Record<\n string,\n {\n type: S.Schema<any, any, any>\n args?: S.Schema<any, any, any>\n description?: string\n directives?: readonly DirectiveApplication[]\n /**\n * Complexity cost of this field for query complexity limiting.\n */\n complexity?: FieldComplexity\n /**\n * Cache control hint for this field.\n */\n cacheControl?: CacheHint\n resolve: (parent: A, args: any) => Effect.Effect<any, any, any>\n }\n >\n }): GraphQLSchemaBuilder<R | R2> {\n const {\n schema,\n description,\n implements: implementsInterfaces,\n directives,\n cacheControl,\n fields,\n } = config\n const name = config.name ?? getSchemaName(schema)\n if (!name) {\n throw new Error(\n \"objectType requires a name. Either provide one explicitly or use a TaggedStruct/TaggedClass/Schema.Class\"\n )\n }\n\n const newTypes = new Map(this.state.types)\n newTypes.set(name, {\n name,\n schema,\n description,\n implements: implementsInterfaces,\n directives,\n cacheControl,\n })\n\n let newObjectFields = this.state.objectFields\n if (fields) {\n newObjectFields = new Map(this.state.objectFields)\n const typeFields = new Map<string, ObjectFieldRegistration>()\n for (const [fieldName, fieldConfig] of Object.entries(fields)) {\n typeFields.set(fieldName, fieldConfig as ObjectFieldRegistration)\n }\n newObjectFields.set(name, typeFields)\n }\n\n return this.with({\n ...this.state,\n types: newTypes,\n objectFields: newObjectFields,\n })\n }\n\n /**\n * Register an interface type from a schema\n */\n interfaceType(config: {\n name?: string\n schema: S.Schema<any, any, any>\n resolveType?: (value: any) => string\n directives?: readonly DirectiveApplication[]\n }): GraphQLSchemaBuilder<R> {\n const { schema, resolveType, directives } = config\n const name = config.name ?? getSchemaName(schema)\n if (!name) {\n throw new Error(\n \"interfaceType requires a name. Either provide one explicitly or use a TaggedStruct/TaggedClass/Schema.Class\"\n )\n }\n\n const newInterfaces = new Map(this.state.interfaces)\n newInterfaces.set(name, {\n name,\n schema,\n resolveType: resolveType ?? ((value: any) => value._tag),\n directives,\n })\n\n return this.with(updateState(this.state, \"interfaces\", newInterfaces))\n }\n\n /**\n * Register an enum type\n */\n enumType(config: {\n name: string\n values: readonly string[]\n description?: string\n directives?: readonly DirectiveApplication[]\n }): GraphQLSchemaBuilder<R> {\n const { name, values, description, directives } = config\n const newEnums = new Map(this.state.enums)\n newEnums.set(name, { name, values, description, directives })\n return this.with(updateState(this.state, \"enums\", newEnums))\n }\n\n /**\n * Register a union type\n */\n unionType(config: {\n name: string\n types: readonly string[]\n resolveType?: (value: any) => string\n directives?: readonly DirectiveApplication[]\n }): GraphQLSchemaBuilder<R> {\n const { name, types, resolveType, directives } = config\n const newUnions = new Map(this.state.unions)\n newUnions.set(name, {\n name,\n types,\n resolveType: resolveType ?? ((value: any) => value._tag),\n directives,\n })\n return this.with(updateState(this.state, \"unions\", newUnions))\n }\n\n /**\n * Register an input type\n */\n inputType(config: {\n name?: string\n schema: S.Schema<any, any, any>\n description?: string\n directives?: readonly DirectiveApplication[]\n }): GraphQLSchemaBuilder<R> {\n const { schema, description, directives } = config\n const name = config.name ?? getSchemaName(schema)\n if (!name) {\n throw new Error(\n \"inputType requires a name. Either provide one explicitly or use a TaggedStruct/TaggedClass/Schema.Class\"\n )\n }\n\n const newInputs = new Map(this.state.inputs)\n newInputs.set(name, { name, schema, description, directives })\n return this.with(updateState(this.state, \"inputs\", newInputs))\n }\n\n /**\n * Register a directive\n */\n directive<Args = void, R2 = never>(config: {\n name: string\n description?: string\n locations: readonly DirectiveLocation[]\n args?: S.Schema<Args, any, any>\n apply?: (\n args: Args\n ) => <A, E, R3>(effect: Effect.Effect<A, E, R3>) => Effect.Effect<A, E, R2 | R3>\n }): GraphQLSchemaBuilder<R | R2> {\n const newDirectives = new Map(this.state.directives)\n newDirectives.set(config.name, config as DirectiveRegistration)\n return this.with(updateState(this.state, \"directives\", newDirectives))\n }\n\n /**\n * Register a middleware\n *\n * Middleware wraps all resolvers (or those matching a pattern) and executes\n * in an \"onion\" model - first registered middleware is the outermost layer.\n *\n * @param config.name - Middleware name (for debugging/logging)\n * @param config.description - Optional description\n * @param config.match - Optional predicate to filter which fields this applies to\n * @param config.apply - Function that transforms the resolver Effect\n *\n * @example\n * ```typescript\n * builder.middleware({\n * name: \"logging\",\n * apply: (effect, ctx) => Effect.gen(function*() {\n * yield* Effect.logInfo(`Resolving ${ctx.info.fieldName}`)\n * const start = Date.now()\n * const result = yield* effect\n * yield* Effect.logInfo(`Resolved in ${Date.now() - start}ms`)\n * return result\n * })\n * })\n * ```\n */\n middleware<R2 = never>(config: {\n name: string\n description?: string\n match?: (info: GraphQLResolveInfo) => boolean\n apply: <A, E, R3>(\n effect: Effect.Effect<A, E, R3>,\n context: MiddlewareContext\n ) => Effect.Effect<A, E, R2 | R3>\n }): GraphQLSchemaBuilder<R | R2> {\n const newMiddlewares = [...this.state.middlewares, config as MiddlewareRegistration]\n return this.with({ ...this.state, middlewares: newMiddlewares })\n }\n\n /**\n * Register an extension\n *\n * Extensions provide lifecycle hooks that run at each phase of request processing\n * (parse, validate, execute) and can contribute data to the response's extensions field.\n *\n * @param config.name - Extension name (for debugging/logging)\n * @param config.description - Optional description\n * @param config.onParse - Called after query parsing\n * @param config.onValidate - Called after validation\n * @param config.onExecuteStart - Called before execution begins\n * @param config.onExecuteEnd - Called after execution completes\n *\n * @example\n * ```typescript\n * builder.extension({\n * name: \"tracing\",\n * onExecuteStart: () => Effect.gen(function*() {\n * const ext = yield* ExtensionsService\n * yield* ext.set(\"tracing\", { startTime: Date.now() })\n * }),\n * onExecuteEnd: () => Effect.gen(function*() {\n * const ext = yield* ExtensionsService\n * yield* ext.merge(\"tracing\", { endTime: Date.now() })\n * }),\n * })\n * ```\n */\n extension<R2 = never>(config: {\n name: string\n description?: string\n onParse?: (source: string, document: DocumentNode) => Effect.Effect<void, never, R2>\n onValidate?: (\n document: DocumentNode,\n errors: readonly GQLError[]\n ) => Effect.Effect<void, never, R2>\n onExecuteStart?: (args: ExecutionArgs) => Effect.Effect<void, never, R2>\n onExecuteEnd?: (result: ExecutionResult) => Effect.Effect<void, never, R2>\n }): GraphQLSchemaBuilder<R | R2> {\n const newExtensions = [...this.state.extensions, config as GraphQLExtension<R2>]\n return this.with({ ...this.state, extensions: newExtensions })\n }\n\n /**\n * Get the registered extensions for use by the execution layer\n */\n getExtensions(): readonly GraphQLExtension<any>[] {\n return this.state.extensions\n }\n\n /**\n * Add a computed/relational field to an object type\n */\n field<Parent, A, E, R2, Args = void>(\n typeName: string,\n fieldName: string,\n config: {\n type: S.Schema<A, any, any>\n args?: S.Schema<Args, any, any>\n description?: string\n directives?: readonly DirectiveApplication[]\n /**\n * Complexity cost of this field for query complexity limiting.\n * Can be a static number or a function that receives the resolved arguments.\n */\n complexity?: FieldComplexity\n /**\n * Cache control hint for this field.\n * Used to compute HTTP Cache-Control headers for the response.\n */\n cacheControl?: CacheHint\n resolve: (parent: Parent, args: Args) => Effect.Effect<A, E, R2>\n }\n ): GraphQLSchemaBuilder<R | R2> {\n const newObjectFields = new Map(this.state.objectFields)\n const typeFields = newObjectFields.get(typeName) || new Map()\n typeFields.set(fieldName, config)\n newObjectFields.set(typeName, typeFields)\n return this.with(updateState(this.state, \"objectFields\", newObjectFields))\n }\n\n // ============================================================================\n // Schema Building\n // ============================================================================\n\n /**\n * Get the field complexity map for use in complexity validation.\n * Maps \"TypeName.fieldName\" to the complexity value or function.\n */\n getFieldComplexities(): FieldComplexityMap {\n const complexities: FieldComplexityMap = new Map()\n\n // Query fields\n for (const [name, config] of this.state.queries) {\n if (config.complexity !== undefined) {\n complexities.set(`Query.${name}`, config.complexity)\n }\n }\n\n // Mutation fields\n for (const [name, config] of this.state.mutations) {\n if (config.complexity !== undefined) {\n complexities.set(`Mutation.${name}`, config.complexity)\n }\n }\n\n // Subscription fields\n for (const [name, config] of this.state.subscriptions) {\n if (config.complexity !== undefined) {\n complexities.set(`Subscription.${name}`, config.complexity)\n }\n }\n\n // Object type fields\n for (const [typeName, fields] of this.state.objectFields) {\n for (const [fieldName, config] of fields) {\n if (config.complexity !== undefined) {\n complexities.set(`${typeName}.${fieldName}`, config.complexity)\n }\n }\n }\n\n return complexities\n }\n\n /**\n * Get the cache hint map for use in cache control calculation.\n * Maps \"TypeName.fieldName\" to the cache hint for field-level hints,\n * or \"TypeName\" to the cache hint for type-level hints.\n */\n getCacheHints(): CacheHintMap {\n const hints: CacheHintMap = new Map()\n\n // Type-level hints\n for (const [typeName, typeReg] of this.state.types) {\n if (typeReg.cacheControl !== undefined) {\n hints.set(typeName, typeReg.cacheControl)\n }\n }\n\n // Query fields\n for (const [name, config] of this.state.queries) {\n if (config.cacheControl !== undefined) {\n hints.set(`Query.${name}`, config.cacheControl)\n }\n }\n\n // Subscription fields\n for (const [name, config] of this.state.subscriptions) {\n if (config.cacheControl !== undefined) {\n hints.set(`Subscription.${name}`, config.cacheControl)\n }\n }\n\n // Object type fields\n for (const [typeName, fields] of this.state.objectFields) {\n for (const [fieldName, config] of fields) {\n if (config.cacheControl !== undefined) {\n hints.set(`${typeName}.${fieldName}`, config.cacheControl)\n }\n }\n }\n\n return hints\n }\n\n /**\n * Build the GraphQL schema (no services required)\n */\n buildSchema(): GraphQLSchema {\n // Build all registries\n const directiveRegistry = this.buildDirectiveRegistry()\n const enumRegistry = this.buildEnumRegistry()\n const inputRegistry = this.buildInputRegistry(enumRegistry)\n const interfaceRegistry = this.buildInterfaceRegistry(enumRegistry)\n const { typeRegistry, unionRegistry } = this.buildTypeAndUnionRegistries(\n enumRegistry,\n interfaceRegistry\n )\n\n // Build field builder context\n const fieldCtx = this.createFieldBuilderContext(\n typeRegistry,\n interfaceRegistry,\n enumRegistry,\n unionRegistry,\n inputRegistry\n )\n\n // Build root type fields\n const queryFields = this.buildQueryFields(fieldCtx)\n const mutationFields = this.buildMutationFields(fieldCtx)\n const subscriptionFields = this.buildSubscriptionFields(fieldCtx)\n\n // Assemble schema\n return this.assembleSchema({\n directiveRegistry,\n enumRegistry,\n inputRegistry,\n interfaceRegistry,\n typeRegistry,\n unionRegistry,\n queryFields,\n mutationFields,\n subscriptionFields,\n })\n }\n\n private buildDirectiveRegistry(): Map<string, GraphQLDirective> {\n const registry = new Map<string, GraphQLDirective>()\n\n // Build cache once for O(1) lookups across all directives\n const cache = buildInputTypeLookupCache(this.state.inputs, this.state.enums)\n\n for (const [name, reg] of this.state.directives) {\n const graphqlDirective = new GraphQLDirective({\n name,\n description: reg.description,\n locations: [...reg.locations],\n args: reg.args\n ? toGraphQLArgsWithRegistry(\n reg.args,\n new Map(),\n new Map(),\n this.state.inputs,\n this.state.enums,\n cache\n )\n : undefined,\n })\n registry.set(name, graphqlDirective)\n }\n\n return registry\n }\n\n private buildEnumRegistry(): Map<string, GraphQLEnumType> {\n const registry = new Map<string, GraphQLEnumType>()\n\n for (const [name, reg] of this.state.enums) {\n const enumValues: Record<string, { value: string }> = {}\n for (const value of reg.values) {\n enumValues[value] = { value }\n }\n registry.set(\n name,\n new GraphQLEnumType({\n name,\n values: enumValues,\n description: reg.description,\n extensions: reg.directives ? { directives: reg.directives } : undefined,\n })\n )\n }\n\n return registry\n }\n\n private buildInputRegistry(\n enumRegistry: Map<string, GraphQLEnumType>\n ): Map<string, GraphQLInputObjectType> {\n const registry = new Map<string, GraphQLInputObjectType>()\n\n // Build cache once for O(1) lookups across all input types\n const cache = buildInputTypeLookupCache(this.state.inputs, this.state.enums)\n\n for (const [name, reg] of this.state.inputs) {\n const inputType = new GraphQLInputObjectType({\n name,\n description: reg.description,\n fields: () =>\n schemaToInputFields(\n reg.schema,\n enumRegistry,\n registry,\n this.state.inputs,\n this.state.enums,\n cache\n ),\n extensions: reg.directives ? { directives: reg.directives } : undefined,\n })\n registry.set(name, inputType)\n }\n\n return registry\n }\n\n private buildInterfaceRegistry(\n enumRegistry: Map<string, GraphQLEnumType>\n ): Map<string, GraphQLInterfaceType> {\n const registry = new Map<string, GraphQLInterfaceType>()\n // We need type and union registries for interface fields, but they're built later\n // Use empty maps for now - interfaces shouldn't reference object types directly\n const typeRegistry = new Map<string, GraphQLObjectType>()\n const unionRegistry = new Map<string, GraphQLUnionType>()\n\n // Create shared TypeConversionContext once for all interface field builders\n const sharedCtx: TypeConversionContext = {\n types: this.state.types,\n interfaces: this.state.interfaces,\n enums: this.state.enums,\n unions: this.state.unions,\n inputs: this.state.inputs,\n typeRegistry,\n interfaceRegistry: registry,\n enumRegistry,\n unionRegistry,\n inputRegistry: new Map(),\n }\n // Pre-build reverse lookup maps once\n buildReverseLookups(sharedCtx)\n\n for (const [name, reg] of this.state.interfaces) {\n const interfaceType = new GraphQLInterfaceType({\n name,\n fields: () => schemaToFields(reg.schema, sharedCtx),\n resolveType: reg.resolveType,\n extensions: reg.directives ? { directives: reg.directives } : undefined,\n })\n registry.set(name, interfaceType)\n }\n\n return registry\n }\n\n private buildTypeAndUnionRegistries(\n enumRegistry: Map<string, GraphQLEnumType>,\n interfaceRegistry: Map<string, GraphQLInterfaceType>\n ): {\n typeRegistry: Map<string, GraphQLObjectType>\n unionRegistry: Map<string, GraphQLUnionType>\n } {\n const typeRegistry = new Map<string, GraphQLObjectType>()\n const unionRegistry = new Map<string, GraphQLUnionType>()\n\n // Create shared TypeConversionContext once and reuse for all lazy field builders\n const sharedCtx: TypeConversionContext = {\n types: this.state.types,\n interfaces: this.state.interfaces,\n enums: this.state.enums,\n unions: this.state.unions,\n inputs: this.state.inputs,\n typeRegistry,\n interfaceRegistry,\n enumRegistry,\n unionRegistry,\n inputRegistry: new Map(),\n }\n // Pre-build reverse lookup maps once\n buildReverseLookups(sharedCtx)\n\n // Create shared FieldBuilderContext for additional fields\n const sharedFieldCtx = this.createFieldBuilderContext(\n typeRegistry,\n interfaceRegistry,\n enumRegistry,\n unionRegistry,\n new Map()\n )\n\n // Build object types with lazy field builders (allows circular references)\n for (const [typeName, typeReg] of this.state.types) {\n const implementedInterfaces =\n typeReg.implements?.map((name) => interfaceRegistry.get(name)!).filter(Boolean) ?? []\n\n const graphqlType = new GraphQLObjectType({\n name: typeName,\n description: typeReg.description,\n fields: () => {\n const baseFields = schemaToFields(typeReg.schema, sharedCtx)\n const additionalFields = this.state.objectFields.get(typeName)\n\n if (additionalFields) {\n for (const [fieldName, fieldConfig] of additionalFields) {\n baseFields[fieldName] = buildObjectField(fieldConfig, sharedFieldCtx)\n }\n }\n\n return baseFields\n },\n interfaces: implementedInterfaces.length > 0 ? implementedInterfaces : undefined,\n extensions: typeReg.directives ? { directives: typeReg.directives } : undefined,\n })\n typeRegistry.set(typeName, graphqlType)\n }\n\n // Build union types (reference object types)\n for (const [name, reg] of this.state.unions) {\n const unionType = new GraphQLUnionType({\n name,\n types: () => reg.types.map((typeName) => typeRegistry.get(typeName)!).filter(Boolean),\n resolveType: reg.resolveType,\n extensions: reg.directives ? { directives: reg.directives } : undefined,\n })\n unionRegistry.set(name, unionType)\n }\n\n return { typeRegistry, unionRegistry }\n }\n\n private createFieldBuilderContext(\n typeRegistry: Map<string, GraphQLObjectType>,\n interfaceRegistry: Map<string, GraphQLInterfaceType>,\n enumRegistry: Map<string, GraphQLEnumType>,\n unionRegistry: Map<string, GraphQLUnionType>,\n inputRegistry: Map<string, GraphQLInputObjectType>\n ): FieldBuilderContext {\n // Build cache once for O(1) input type lookups across all fields\n const inputTypeLookupCache = buildInputTypeLookupCache(this.state.inputs, this.state.enums)\n\n return {\n types: this.state.types,\n interfaces: this.state.interfaces,\n enums: this.state.enums,\n unions: this.state.unions,\n inputs: this.state.inputs,\n typeRegistry,\n interfaceRegistry,\n enumRegistry,\n unionRegistry,\n inputRegistry,\n directiveRegistrations: this.state.directives,\n middlewares: this.state.middlewares,\n inputTypeLookupCache,\n }\n }\n\n private buildQueryFields(ctx: FieldBuilderContext): GraphQLFieldConfigMap<any, any> {\n const fields: GraphQLFieldConfigMap<any, any> = {}\n for (const [name, config] of this.state.queries) {\n fields[name] = buildField(config, ctx)\n }\n return fields\n }\n\n private buildMutationFields(ctx: FieldBuilderContext): GraphQLFieldConfigMap<any, any> {\n const fields: GraphQLFieldConfigMap<any, any> = {}\n for (const [name, config] of this.state.mutations) {\n fields[name] = buildField(config, ctx)\n }\n return fields\n }\n\n private buildSubscriptionFields(ctx: FieldBuilderContext): GraphQLFieldConfigMap<any, any> {\n const fields: GraphQLFieldConfigMap<any, any> = {}\n for (const [name, config] of this.state.subscriptions) {\n fields[name] = buildSubscriptionField(config, ctx)\n }\n return fields\n }\n\n private assembleSchema(registries: {\n directiveRegistry: Map<string, GraphQLDirective>\n enumRegistry: Map<string, GraphQLEnumType>\n inputRegistry: Map<string, GraphQLInputObjectType>\n interfaceRegistry: Map<string, GraphQLInterfaceType>\n typeRegistry: Map<string, GraphQLObjectType>\n unionRegistry: Map<string, GraphQLUnionType>\n queryFields: GraphQLFieldConfigMap<any, any>\n mutationFields: GraphQLFieldConfigMap<any, any>\n subscriptionFields: GraphQLFieldConfigMap<any, any>\n }): GraphQLSchema {\n const schemaConfig: any = {\n types: [\n ...Array.from(registries.enumRegistry.values()),\n ...Array.from(registries.inputRegistry.values()),\n ...Array.from(registries.interfaceRegistry.values()),\n ...Array.from(registries.typeRegistry.values()),\n ...Array.from(registries.unionRegistry.values()),\n ],\n directives:\n registries.directiveRegistry.size > 0\n ? [...Array.from(registries.directiveRegistry.values())]\n : undefined,\n }\n\n if (Object.keys(registries.queryFields).length > 0) {\n schemaConfig.query = new GraphQLObjectType({\n name: \"Query\",\n fields: registries.queryFields,\n })\n }\n\n if (Object.keys(registries.mutationFields).length > 0) {\n schemaConfig.mutation = new GraphQLObjectType({\n name: \"Mutation\",\n fields: registries.mutationFields,\n })\n }\n\n if (Object.keys(registries.subscriptionFields).length > 0) {\n schemaConfig.subscription = new GraphQLObjectType({\n name: \"Subscription\",\n fields: registries.subscriptionFields,\n })\n }\n\n return new GraphQLSchema(schemaConfig)\n }\n}\n","import { Effect, Stream } from \"effect\"\nimport * as S from \"effect/Schema\"\nimport {\n DirectiveLocation,\n GraphQLResolveInfo,\n DocumentNode,\n ExecutionResult,\n GraphQLError,\n} from \"graphql\"\nimport type { DirectiveApplication, MiddlewareContext, CacheHint } from \"./types\"\nimport type { ExecutionArgs } from \"../extensions\"\nimport { GraphQLSchemaBuilder } from \"./schema-builder\"\nimport type { FieldComplexity } from \"../server/complexity\"\n\n/**\n * Add an object type to the schema builder (pipe-able)\n * Name is optional if schema is TaggedStruct, TaggedClass, or Schema.Class\n */\nexport const objectType =\n <A, R2 = never>(config: {\n name?: string\n schema: S.Schema<A, any, any>\n description?: string\n implements?: readonly string[]\n directives?: readonly DirectiveApplication[]\n /**\n * Default cache control hint for all fields returning this type.\n * Can be overridden by field-level cacheControl.\n */\n cacheControl?: CacheHint\n fields?: Record<\n string,\n {\n type: S.Schema<any, any, any>\n args?: S.Schema<any, any, any>\n description?: string\n directives?: readonly DirectiveApplication[]\n complexity?: FieldComplexity\n cacheControl?: CacheHint\n resolve: (parent: A, args: any) => Effect.Effect<any, any, any>\n }\n >\n }) =>\n <R>(builder: GraphQLSchemaBuilder<R>): GraphQLSchemaBuilder<R | R2> =>\n builder.objectType(config)\n\n/**\n * Add an interface type to the schema builder (pipe-able)\n * Name is optional if schema is TaggedStruct, TaggedClass, or Schema.Class\n */\nexport const interfaceType =\n (config: {\n name?: string\n schema: S.Schema<any, any, any>\n resolveType?: (value: any) => string\n directives?: readonly DirectiveApplication[]\n }) =>\n <R>(builder: GraphQLSchemaBuilder<R>): GraphQLSchemaBuilder<R> =>\n builder.interfaceType(config)\n\n/**\n * Add an enum type to the schema builder (pipe-able)\n */\nexport const enumType =\n (config: {\n name: string\n values: readonly string[]\n description?: string\n directives?: readonly DirectiveApplication[]\n }) =>\n <R>(builder: GraphQLSchemaBuilder<R>): GraphQLSchemaBuilder<R> =>\n builder.enumType(config)\n\n/**\n * Add a union type to the schema builder (pipe-able)\n */\nexport const unionType =\n (config: {\n name: string\n types: readonly string[]\n resolveType?: (value: any) => string\n directives?: readonly DirectiveApplication[]\n }) =>\n <R>(builder: GraphQLSchemaBuilder<R>): GraphQLSchemaBuilder<R> =>\n builder.unionType(config)\n\n/**\n * Add an input type to the schema builder (pipe-able)\n * Name is optional if schema is TaggedStruct, TaggedClass, or Schema.Class\n */\nexport const inputType =\n (config: {\n name?: string\n schema: S.Schema<any, any, any>\n description?: string\n directives?: readonly DirectiveApplication[]\n }) =>\n <R>(builder: GraphQLSchemaBuilder<R>): GraphQLSchemaBuilder<R> =>\n builder.inputType(config)\n\n/**\n * Register a directive (pipe-able)\n *\n * @param config - Directive configuration\n * @param config.name - The directive name (without @)\n * @param config.description - Optional description\n * @param config.locations - Array of DirectiveLocation values where this directive can be applied\n * @param config.args - Optional Effect Schema for directive arguments\n * @param config.apply - Optional function to transform resolver Effects (for executable directives)\n */\nexport const directive =\n <Args = void, R2 = never>(config: {\n name: string\n description?: string\n locations: readonly DirectiveLocation[]\n args?: S.Schema<Args, any, any>\n apply?: (\n args: Args\n ) => <A, E, R3>(effect: Effect.Effect<A, E, R3>) => Effect.Effect<A, E, R2 | R3>\n }) =>\n <R>(builder: GraphQLSchemaBuilder<R>): GraphQLSchemaBuilder<R | R2> =>\n builder.directive(config)\n\n/**\n * Register a middleware (pipe-able)\n *\n * Middleware wraps all resolvers (or those matching a pattern) and executes\n * in an \"onion\" model - first registered middleware is the outermost layer.\n *\n * @param config.name - Middleware name (for debugging/logging)\n * @param config.description - Optional description\n * @param config.match - Optional predicate to filter which fields this applies to\n * @param config.apply - Function that transforms the resolver Effect\n *\n * @example\n * ```typescript\n * GraphQLSchemaBuilder.empty.pipe(\n * middleware({\n * name: \"logging\",\n * apply: (effect, ctx) => Effect.gen(function*() {\n * yield* Effect.logInfo(`Resolving ${ctx.info.fieldName}`)\n * return yield* effect\n * })\n * }),\n * middleware({\n * name: \"adminOnly\",\n * match: (info) => info.fieldName.startsWith(\"admin\"),\n * apply: (effect) => Effect.gen(function*() {\n * const auth = yield* AuthService\n * yield* auth.requireAdmin()\n * return yield* effect\n * })\n * })\n * )\n * ```\n */\nexport const middleware =\n <R2 = never>(config: {\n name: string\n description?: string\n match?: (info: GraphQLResolveInfo) => boolean\n apply: <A, E, R3>(\n effect: Effect.Effect<A, E, R3>,\n context: MiddlewareContext\n ) => Effect.Effect<A, E, R2 | R3>\n }) =>\n <R>(builder: GraphQLSchemaBuilder<R>): GraphQLSchemaBuilder<R | R2> =>\n builder.middleware(config)\n\n/**\n * Register an extension (pipe-able)\n *\n * Extensions provide lifecycle hooks that run at each phase of request processing\n * (parse, validate, execute) and can contribute data to the response's extensions field.\n *\n * @param config.name - Extension name (for debugging/logging)\n * @param config.description - Optional description\n * @param config.onParse - Called after query parsing\n * @param config.onValidate - Called after validation\n * @param config.onExecuteStart - Called before execution begins\n * @param config.onExecuteEnd - Called after execution completes\n *\n * @example\n * ```typescript\n * GraphQLSchemaBuilder.empty.pipe(\n * extension({\n * name: \"tracing\",\n * onExecuteStart: () => Effect.gen(function*() {\n * const ext = yield* ExtensionsService\n * yield* ext.set(\"tracing\", { startTime: Date.now() })\n * }),\n * onExecuteEnd: () => Effect.gen(function*() {\n * const ext = yield* ExtensionsService\n * yield* ext.merge(\"tracing\", { endTime: Date.now() })\n * }),\n * })\n * )\n * ```\n */\nexport const extension =\n <R2 = never>(config: {\n name: string\n description?: string\n onParse?: (source: string, document: DocumentNode) => Effect.Effect<void, never, R2>\n onValidate?: (\n document: DocumentNode,\n errors: readonly GraphQLError[]\n ) => Effect.Effect<void, never, R2>\n onExecuteStart?: (args: ExecutionArgs) => Effect.Effect<void, never, R2>\n onExecuteEnd?: (result: ExecutionResult) => Effect.Effect<void, never, R2>\n }) =>\n <R>(builder: GraphQLSchemaBuilder<R>): GraphQLSchemaBuilder<R | R2> =>\n builder.extension(config)\n\n/**\n * Add a query field to the schema builder (pipe-able)\n */\nexport const query =\n <A, E, R2, Args = void>(\n name: string,\n config: {\n type: S.Schema<A, any, any>\n args?: S.Schema<Args, any, any>\n description?: string\n directives?: readonly DirectiveApplication[]\n complexity?: FieldComplexity\n cacheControl?: CacheHint\n resolve: (args: Args) => Effect.Effect<A, E, R2>\n }\n ) =>\n <R>(builder: GraphQLSchemaBuilder<R>): GraphQLSchemaBuilder<R | R2> =>\n builder.query(name, config)\n\n/**\n * Add a mutation field to the schema builder (pipe-able)\n */\nexport const mutation =\n <A, E, R2, Args = void>(\n name: string,\n config: {\n type: S.Schema<A, any, any>\n args?: S.Schema<Args, any, any>\n description?: string\n directives?: readonly DirectiveApplication[]\n complexity?: FieldComplexity\n resolve: (args: Args) => Effect.Effect<A, E, R2>\n }\n ) =>\n <R>(builder: GraphQLSchemaBuilder<R>): GraphQLSchemaBuilder<R | R2> =>\n builder.mutation(name, config)\n\n/**\n * Add a subscription field to the schema builder (pipe-able)\n *\n * Subscriptions return a Stream that yields values over time.\n *\n * @example\n * ```typescript\n * GraphQLSchemaBuilder.empty.pipe(\n * subscription(\"userCreated\", {\n * type: User,\n * subscribe: Effect.gen(function*() {\n * const pubsub = yield* PubSubService\n * return pubsub.subscribe(\"USER_CREATED\")\n * }),\n * })\n * )\n * ```\n */\nexport const subscription =\n <A, E, R2, Args = void>(\n name: string,\n config: {\n type: S.Schema<A, any, any>\n args?: S.Schema<Args, any, any>\n description?: string\n directives?: readonly DirectiveApplication[]\n complexity?: FieldComplexity\n cacheControl?: CacheHint\n subscribe: (args: Args) => Effect.Effect<Stream.Stream<A, E, R2>, E, R2>\n resolve?: (value: A, args: Args) => Effect.Effect<A, E, R2>\n }\n ) =>\n <R>(builder: GraphQLSchemaBuilder<R>): GraphQLSchemaBuilder<R | R2> =>\n builder.subscription(name, config)\n\n/**\n * Add a field to an existing object type (pipe-able)\n */\nexport const field =\n <Parent, A, E, R2, Args = void>(\n typeName: string,\n fieldName: string,\n config: {\n type: S.Schema<A, any, any>\n args?: S.Schema<Args, any, any>\n description?: string\n directives?: readonly DirectiveApplication[]\n complexity?: FieldComplexity\n cacheControl?: CacheHint\n resolve: (parent: Parent, args: Args) => Effect.Effect<A, E, R2>\n }\n ) =>\n <R>(builder: GraphQLSchemaBuilder<R>): GraphQLSchemaBuilder<R | R2> =>\n builder.field(typeName, fieldName, config)\n\n/**\n * Compose multiple schema operations (helper for arrays)\n */\nexport const compose =\n <R>(...operations: Array<(builder: GraphQLSchemaBuilder<any>) => GraphQLSchemaBuilder<any>>) =>\n (builder: GraphQLSchemaBuilder<R>): GraphQLSchemaBuilder<any> =>\n operations.reduce((b, op) => op(b), builder)\n","import { Context, Effect, Ref } from \"effect\"\nimport type { DocumentNode, ExecutionResult, GraphQLError, GraphQLSchema } from \"graphql\"\nimport type { FieldComplexityMap } from \"./server/complexity\"\n\n/**\n * Execution arguments passed to onExecuteStart hook\n */\nexport interface ExecutionArgs {\n readonly source: string\n readonly document: DocumentNode\n readonly variableValues?: Record<string, unknown>\n readonly operationName?: string\n /** The GraphQL schema being executed against */\n readonly schema: GraphQLSchema\n /** Field complexity definitions from the schema builder */\n readonly fieldComplexities: FieldComplexityMap\n}\n\n/**\n * Configuration for a GraphQL extension\n *\n * Extensions provide lifecycle hooks that run at each phase of request processing,\n * and can contribute data to the response's `extensions` field.\n *\n * @example\n * ```typescript\n * // Tracing extension\n * extension({\n * name: \"tracing\",\n * onExecuteStart: () => Effect.gen(function*() {\n * const ext = yield* ExtensionsService\n * yield* ext.set(\"tracing\", { startTime: Date.now() })\n * }),\n * onExecuteEnd: () => Effect.gen(function*() {\n * const ext = yield* ExtensionsService\n * yield* ext.merge(\"tracing\", { endTime: Date.now() })\n * }),\n * })\n * ```\n */\nexport interface GraphQLExtension<R = never> {\n readonly name: string\n readonly description?: string\n\n /**\n * Called after the query source is parsed into a DocumentNode.\n * Useful for query analysis, caching parsed documents, etc.\n */\n readonly onParse?: (source: string, document: DocumentNode) => Effect.Effect<void, never, R>\n\n /**\n * Called after validation completes.\n * Receives the document and any validation errors.\n * Useful for complexity analysis, query whitelisting, etc.\n */\n readonly onValidate?: (\n document: DocumentNode,\n errors: readonly GraphQLError[]\n ) => Effect.Effect<void, never, R>\n\n /**\n * Called before execution begins.\n * Receives the full execution arguments.\n * Useful for setting up tracing, logging, etc.\n */\n readonly onExecuteStart?: (args: ExecutionArgs) => Effect.Effect<void, never, R>\n\n /**\n * Called after execution completes.\n * Receives the execution result (including data and errors).\n * Useful for recording metrics, finalizing traces, etc.\n */\n readonly onExecuteEnd?: (result: ExecutionResult) => Effect.Effect<void, never, R>\n}\n\n/**\n * Service for accumulating extension data during request processing.\n *\n * This service is automatically provided for each request and allows\n * extensions, middleware, and resolvers to contribute to the response\n * extensions field.\n *\n * @example\n * ```typescript\n * Effect.gen(function*() {\n * const ext = yield* ExtensionsService\n *\n * // Set a value (overwrites existing)\n * yield* ext.set(\"complexity\", { score: 42 })\n *\n * // Merge into existing value\n * yield* ext.merge(\"tracing\", { endTime: Date.now() })\n *\n * // Get all accumulated extensions\n * const all = yield* ext.get()\n * })\n * ```\n */\nexport interface ExtensionsService {\n /**\n * Set a key-value pair in the extensions.\n * Overwrites any existing value for this key.\n */\n readonly set: (key: string, value: unknown) => Effect.Effect<void>\n\n /**\n * Deep merge an object into an existing key's value.\n * If the key doesn't exist, sets the value.\n * If the existing value is not an object, overwrites it.\n */\n readonly merge: (key: string, value: Record<string, unknown>) => Effect.Effect<void>\n\n /**\n * Get all accumulated extensions as a record.\n */\n readonly get: () => Effect.Effect<Record<string, unknown>>\n}\n\n/**\n * Tag for the ExtensionsService\n */\nexport const ExtensionsService = Context.GenericTag<ExtensionsService>(\n \"@effect-gql/ExtensionsService\"\n)\n\n/**\n * Deep merge two objects\n */\nfunction deepMerge(\n target: Record<string, unknown>,\n source: Record<string, unknown>\n): Record<string, unknown> {\n const result = { ...target }\n for (const key of Object.keys(source)) {\n const sourceValue = source[key]\n const targetValue = result[key]\n\n if (\n typeof sourceValue === \"object\" &&\n sourceValue !== null &&\n !Array.isArray(sourceValue) &&\n typeof targetValue === \"object\" &&\n targetValue !== null &&\n !Array.isArray(targetValue)\n ) {\n result[key] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>\n )\n } else {\n result[key] = sourceValue\n }\n }\n return result\n}\n\n/**\n * Create a new ExtensionsService backed by a Ref\n */\nexport const makeExtensionsService = (): Effect.Effect<ExtensionsService, never, never> =>\n Effect.gen(function* () {\n const ref = yield* Ref.make<Record<string, unknown>>({})\n\n return ExtensionsService.of({\n set: (key, value) => Ref.update(ref, (current) => ({ ...current, [key]: value })),\n\n merge: (key, value) =>\n Ref.update(ref, (current) => {\n const existing = current[key]\n if (typeof existing === \"object\" && existing !== null && !Array.isArray(existing)) {\n return {\n ...current,\n [key]: deepMerge(existing as Record<string, unknown>, value),\n }\n }\n return { ...current, [key]: value }\n }),\n\n get: () => Ref.get(ref),\n })\n })\n\n/**\n * Generic helper to run extension hooks with error handling.\n * Filters extensions that have the specified hook, runs them,\n * and logs warnings if any hook fails.\n */\nconst runExtensionHooks = <R, K extends keyof GraphQLExtension<R>>(\n extensions: readonly GraphQLExtension<R>[],\n hookName: K,\n getHookEffect: (ext: GraphQLExtension<R>) => Effect.Effect<void, never, R>\n): Effect.Effect<void, never, R> =>\n Effect.forEach(\n extensions.filter((ext) => ext[hookName] !== undefined),\n (ext) =>\n getHookEffect(ext).pipe(\n Effect.catchAllCause((cause) =>\n Effect.logWarning(`Extension \"${ext.name}\" ${String(hookName)} hook failed`, cause)\n )\n ),\n { discard: true }\n ) as Effect.Effect<void, never, R>\n\n/**\n * Run all onParse hooks for registered extensions\n */\nexport const runParseHooks = <R>(\n extensions: readonly GraphQLExtension<R>[],\n source: string,\n document: DocumentNode\n): Effect.Effect<void, never, R> =>\n runExtensionHooks(extensions, \"onParse\", (ext) => ext.onParse!(source, document))\n\n/**\n * Run all onValidate hooks for registered extensions\n */\nexport const runValidateHooks = <R>(\n extensions: readonly GraphQLExtension<R>[],\n document: DocumentNode,\n errors: readonly GraphQLError[]\n): Effect.Effect<void, never, R> =>\n runExtensionHooks(extensions, \"onValidate\", (ext) => ext.onValidate!(document, errors))\n\n/**\n * Run all onExecuteStart hooks for registered extensions\n */\nexport const runExecuteStartHooks = <R>(\n extensions: readonly GraphQLExtension<R>[],\n args: ExecutionArgs\n): Effect.Effect<void, never, R> =>\n runExtensionHooks(extensions, \"onExecuteStart\", (ext) => ext.onExecuteStart!(args))\n\n/**\n * Run all onExecuteEnd hooks for registered extensions\n */\nexport const runExecuteEndHooks = <R>(\n extensions: readonly GraphQLExtension<R>[],\n result: ExecutionResult\n): Effect.Effect<void, never, R> =>\n runExtensionHooks(extensions, \"onExecuteEnd\", (ext) => ext.onExecuteEnd!(result))\n","import { Effect, Layer } from \"effect\"\nimport {\n GraphQLSchema,\n GraphQLError,\n parse,\n validate,\n execute as graphqlExecute,\n type ExecutionResult,\n type DocumentNode,\n} from \"graphql\"\nimport type { GraphQLEffectContext } from \"./types\"\nimport {\n type GraphQLExtension,\n ExtensionsService,\n makeExtensionsService,\n runParseHooks,\n runValidateHooks,\n runExecuteStartHooks,\n runExecuteEndHooks,\n} from \"../extensions\"\nimport type { FieldComplexityMap } from \"../server/complexity\"\n\n/**\n * Execute a GraphQL query with a service layer\n *\n * This is the layer-per-request execution model. Build the schema once,\n * then execute each request with its own layer (including request-scoped services).\n *\n * The execution follows these phases:\n * 1. Parse - Convert source string to DocumentNode\n * 2. Validate - Check document against schema\n * 3. Execute - Run resolvers and return result\n *\n * Extensions can hook into each phase via onParse, onValidate, onExecuteStart, onExecuteEnd.\n * Extension data is automatically merged into the response's extensions field.\n */\nexport const execute =\n <R>(\n schema: GraphQLSchema,\n layer: Layer.Layer<R>,\n extensions: readonly GraphQLExtension<any>[] = [],\n fieldComplexities: FieldComplexityMap = new Map()\n ) =>\n (\n source: string,\n variableValues?: Record<string, unknown>,\n operationName?: string\n ): Effect.Effect<ExecutionResult, Error> =>\n Effect.gen(function* () {\n // Create the ExtensionsService for this request\n const extensionsService = yield* makeExtensionsService()\n\n // Create runtime from the provided layer\n const runtime = yield* Effect.runtime<R>()\n\n // Phase 1: Parse\n let document: DocumentNode\n try {\n document = parse(source)\n } catch (parseError) {\n // Parse errors are returned as GraphQL errors, not thrown\n const extensionData = yield* extensionsService.get()\n return {\n errors: [\n parseError instanceof GraphQLError ? parseError : new GraphQLError(String(parseError)),\n ],\n extensions: Object.keys(extensionData).length > 0 ? extensionData : undefined,\n } as ExecutionResult\n }\n\n // Run onParse hooks\n yield* runParseHooks(extensions, source, document).pipe(\n Effect.provideService(ExtensionsService, extensionsService)\n )\n\n // Phase 2: Validate\n const validationErrors = validate(schema, document)\n\n // Run onValidate hooks\n yield* runValidateHooks(extensions, document, validationErrors).pipe(\n Effect.provideService(ExtensionsService, extensionsService)\n )\n\n // If validation failed, return errors without executing\n if (validationErrors.length > 0) {\n const extensionData = yield* extensionsService.get()\n return {\n errors: validationErrors,\n extensions: Object.keys(extensionData).length > 0 ? extensionData : undefined,\n } as ExecutionResult\n }\n\n // Phase 3: Execute\n const executionArgs = {\n source,\n document,\n variableValues,\n operationName,\n schema,\n fieldComplexities,\n }\n\n // Run onExecuteStart hooks\n yield* runExecuteStartHooks(extensions, executionArgs).pipe(\n Effect.provideService(ExtensionsService, extensionsService)\n )\n\n // Execute the GraphQL query\n const executeResult = yield* Effect.try({\n try: () =>\n graphqlExecute({\n schema,\n document,\n variableValues,\n operationName,\n contextValue: { runtime } satisfies GraphQLEffectContext<R>,\n }),\n catch: (error) => new Error(String(error)),\n })\n\n // Await result if it's a promise (for subscriptions, it might be)\n const resolvedResult: Awaited<typeof executeResult> =\n executeResult && typeof executeResult === \"object\" && \"then\" in executeResult\n ? yield* Effect.promise(() => executeResult)\n : executeResult\n\n // Run onExecuteEnd hooks\n yield* runExecuteEndHooks(extensions, resolvedResult).pipe(\n Effect.provideService(ExtensionsService, extensionsService)\n )\n\n // Merge extension data into result\n const extensionData = yield* extensionsService.get()\n if (Object.keys(extensionData).length > 0) {\n return {\n ...resolvedResult,\n extensions: {\n ...resolvedResult.extensions,\n ...extensionData,\n },\n }\n }\n\n return resolvedResult\n }).pipe(Effect.provide(layer)) as Effect.Effect<ExecutionResult, Error>\n\n/**\n * Execute a GraphQL query with a service layer (simple version without extensions)\n *\n * @deprecated Use execute() instead, which now supports extensions as an optional parameter\n */\nexport const executeSimple = <R>(schema: GraphQLSchema, layer: Layer.Layer<R>) =>\n execute(schema, layer, [])\n","import { Data } from \"effect\"\n\n/**\n * Base class for GraphQL errors in Effect\n */\nexport class GraphQLError extends Data.TaggedError(\"GraphQLError\")<{\n message: string\n extensions?: Record<string, unknown>\n}> {}\n\n/**\n * Validation error for input validation failures\n */\nexport class ValidationError extends Data.TaggedError(\"ValidationError\")<{\n message: string\n field?: string\n}> {}\n\n/**\n * Authorization error for access control failures\n */\nexport class AuthorizationError extends Data.TaggedError(\"AuthorizationError\")<{\n message: string\n}> {}\n\n/**\n * Not found error for missing resources\n */\nexport class NotFoundError extends Data.TaggedError(\"NotFoundError\")<{\n message: string\n resource?: string\n}> {}\n","import { Context, Layer } from \"effect\"\n\n/**\n * GraphQL request context containing request-specific data\n */\nexport interface GraphQLRequestContext {\n readonly request: {\n readonly headers: Record<string, string>\n readonly query: string\n readonly variables?: Record<string, unknown>\n readonly operationName?: string\n }\n}\n\nexport const GraphQLRequestContext =\n Context.GenericTag<GraphQLRequestContext>(\"GraphQLRequestContext\")\n\n/**\n * Create a layer from request context\n */\nexport const makeRequestContextLayer = (\n context: GraphQLRequestContext\n): Layer.Layer<GraphQLRequestContext> => Layer.succeed(GraphQLRequestContext, context)\n","import { Effect, Context, Layer } from \"effect\"\nimport DataLoader from \"dataloader\"\n\n/**\n * Ergonomic DataLoader helpers for Effect-based GraphQL\n *\n * This module provides a type-safe, declarative way to define DataLoaders\n * that integrate seamlessly with Effect's service system.\n *\n * @example\n * ```typescript\n * // Define loaders\n * const loaders = Loader.define({\n * UserById: Loader.single<string, User>({\n * batch: (ids) => db.getUsersByIds(ids),\n * key: (user) => user.id,\n * }),\n *\n * PostsByAuthorId: Loader.grouped<string, Post>({\n * batch: (ids) => db.getPostsForAuthors(ids),\n * groupBy: (post) => post.authorId,\n * }),\n * })\n *\n * // Use in resolvers\n * resolve: (parent) => loaders.load(\"UserById\", parent.authorId)\n * ```\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Configuration for a single-value loader (one key -> one value)\n */\nexport interface SingleLoaderDef<K, V, R> {\n readonly _tag: \"single\"\n readonly batch: (keys: readonly K[]) => Effect.Effect<readonly V[], Error, R>\n readonly key: (value: V) => K\n}\n\n/**\n * Configuration for a grouped loader (one key -> many values)\n */\nexport interface GroupedLoaderDef<K, V, R> {\n readonly _tag: \"grouped\"\n readonly batch: (keys: readonly K[]) => Effect.Effect<readonly V[], Error, R>\n readonly groupBy: (value: V) => K\n}\n\ntype LoaderDef<K, V, R> = SingleLoaderDef<K, V, R> | GroupedLoaderDef<K, V, R>\n\n/**\n * Runtime DataLoader instances\n */\ntype LoaderInstances<Defs extends Record<string, LoaderDef<any, any, any>>> = {\n [Name in keyof Defs]: Defs[Name] extends SingleLoaderDef<infer K, infer V, any>\n ? DataLoader<K, V>\n : Defs[Name] extends GroupedLoaderDef<infer K, infer V, any>\n ? DataLoader<K, V[]>\n : never\n}\n\n/**\n * Extract the value type for a loader (accounting for grouped loaders)\n */\ntype LoaderValue<Def> =\n Def extends SingleLoaderDef<any, infer V, any>\n ? V\n : Def extends GroupedLoaderDef<any, infer V, any>\n ? V[]\n : never\n\n/**\n * Extract the key type for a loader\n */\ntype LoaderKey<Def> = Def extends LoaderDef<infer K, any, any> ? K : never\n\n/**\n * Extract combined requirements from all loaders\n */\ntype LoaderRequirements<Defs extends Record<string, LoaderDef<any, any, any>>> = {\n [K in keyof Defs]: Defs[K] extends LoaderDef<any, any, infer R> ? R : never\n}[keyof Defs]\n\n// ============================================================================\n// Loader Builders\n// ============================================================================\n\n/**\n * Create a single-value loader definition.\n * One key maps to one value.\n *\n * @example\n * ```typescript\n * Loader.single<string, User>({\n * batch: (ids) => db.getUsersByIds(ids),\n * key: (user) => user.id,\n * })\n * ```\n */\nfunction single<K, V, R = never>(config: {\n batch: (keys: readonly K[]) => Effect.Effect<readonly V[], Error, R>\n key: (value: V) => K\n}): SingleLoaderDef<K, V, R> {\n return {\n _tag: \"single\",\n batch: config.batch,\n key: config.key,\n }\n}\n\n/**\n * Create a grouped loader definition.\n * One key maps to many values.\n *\n * @example\n * ```typescript\n * Loader.grouped<string, Post>({\n * batch: (authorIds) => db.getPostsForAuthors(authorIds),\n * groupBy: (post) => post.authorId,\n * })\n * ```\n */\nfunction grouped<K, V, R = never>(config: {\n batch: (keys: readonly K[]) => Effect.Effect<readonly V[], Error, R>\n groupBy: (value: V) => K\n}): GroupedLoaderDef<K, V, R> {\n return {\n _tag: \"grouped\",\n batch: config.batch,\n groupBy: config.groupBy,\n }\n}\n\n// ============================================================================\n// Loader Registry\n// ============================================================================\n\n/**\n * A registry of loader definitions with methods to create instances and layers\n */\nclass LoaderRegistry<Defs extends Record<string, LoaderDef<any, any, any>>> {\n readonly _tag = \"LoaderRegistry\"\n\n /**\n * The Effect service tag for this loader registry\n */\n readonly Service: Context.Tag<LoaderInstances<Defs>, LoaderInstances<Defs>>\n\n constructor(readonly definitions: Defs) {\n this.Service = Context.GenericTag<LoaderInstances<Defs>>(\n `DataLoaders(${Object.keys(definitions).join(\", \")})`\n )\n }\n\n /**\n * Create a Layer that provides fresh DataLoader instances.\n * Call this once per request to get request-scoped loaders.\n */\n toLayer(): Layer.Layer<LoaderInstances<Defs>, never, LoaderRequirements<Defs>> {\n const self = this\n return Layer.effect(\n this.Service,\n Effect.gen(function* () {\n // Build loader instances dynamically from definitions\n // The type cast at the end is necessary because we're building the object dynamically\n const instances: Partial<LoaderInstances<Defs>> = {}\n\n for (const name of Object.keys(self.definitions) as Array<keyof Defs & string>) {\n const def = self.definitions[name]\n // Type assertion needed here as we're building a heterogeneous record dynamically\n instances[name] = (yield* createDataLoader(def)) as LoaderInstances<Defs>[typeof name]\n }\n\n return instances as LoaderInstances<Defs>\n })\n ) as Layer.Layer<LoaderInstances<Defs>, never, LoaderRequirements<Defs>>\n }\n\n /**\n * Helper to use loaders in a resolver with a callback.\n */\n use<A>(\n fn: (loaders: LoaderInstances<Defs>) => Promise<A>\n ): Effect.Effect<A, Error, LoaderInstances<Defs>> {\n const self = this\n return Effect.gen(function* () {\n const loaders = yield* self.Service\n return yield* Effect.promise(() => fn(loaders))\n })\n }\n\n /**\n * Load a single value by key.\n * This is the most common operation in resolvers.\n *\n * @internal The internal cast is safe because LoaderInstances<Defs> guarantees\n * that loaders[name] is a DataLoader with the correct key/value types.\n */\n load<Name extends keyof Defs & string>(\n name: Name,\n key: LoaderKey<Defs[Name]>\n ): Effect.Effect<LoaderValue<Defs[Name]>, Error, LoaderInstances<Defs>> {\n const self = this\n return Effect.gen(function* () {\n const loaders = yield* self.Service\n // Safe cast: LoaderInstances maps name to the correctly-typed DataLoader\n const loader = loaders[name] as DataLoader<LoaderKey<Defs[Name]>, LoaderValue<Defs[Name]>>\n return yield* Effect.promise(() => loader.load(key))\n })\n }\n\n /**\n * Load multiple values by keys.\n * All keys are batched into a single request.\n *\n * @internal The internal cast is safe because LoaderInstances<Defs> guarantees\n * that loaders[name] is a DataLoader with the correct key/value types.\n */\n loadMany<Name extends keyof Defs & string>(\n name: Name,\n keys: readonly LoaderKey<Defs[Name]>[]\n ): Effect.Effect<readonly LoaderValue<Defs[Name]>[], Error, LoaderInstances<Defs>> {\n const self = this\n return Effect.gen(function* () {\n const loaders = yield* self.Service\n // Safe cast: LoaderInstances maps name to the correctly-typed DataLoader\n const loader = loaders[name] as DataLoader<LoaderKey<Defs[Name]>, LoaderValue<Defs[Name]>>\n const results = yield* Effect.promise(() => loader.loadMany(keys))\n // Convert any errors to a failure\n for (const result of results) {\n if (result instanceof Error) {\n return yield* Effect.fail(result)\n }\n }\n return results as readonly LoaderValue<Defs[Name]>[]\n })\n }\n}\n\n/**\n * Create a DataLoader from a single loader definition.\n */\nfunction createSingleDataLoader<K, V, R>(\n def: SingleLoaderDef<K, V, R>,\n context: Context.Context<R>\n): DataLoader<K, V | Error> {\n return new DataLoader<K, V | Error>(async (keys) => {\n const items = await Effect.runPromise(def.batch(keys).pipe(Effect.provide(context)))\n // Map items back to keys in order\n return keys.map((key) => {\n const item = items.find((i) => def.key(i) === key)\n if (!item) return new Error(`Not found: ${key}`)\n return item\n })\n })\n}\n\n/**\n * Create a DataLoader from a grouped loader definition.\n */\nfunction createGroupedDataLoader<K, V, R>(\n def: GroupedLoaderDef<K, V, R>,\n context: Context.Context<R>\n): DataLoader<K, V[]> {\n return new DataLoader<K, V[]>(async (keys) => {\n const items = await Effect.runPromise(def.batch(keys).pipe(Effect.provide(context)))\n // Group items by key with lazy array initialization\n const map = new Map<K, V[]>()\n for (const item of items) {\n const key = def.groupBy(item)\n let arr = map.get(key)\n if (!arr) {\n arr = []\n map.set(key, arr)\n }\n arr.push(item)\n }\n // Return results in key order, defaulting to empty array for missing keys\n return keys.map((key) => map.get(key) ?? [])\n })\n}\n\n/**\n * Create a DataLoader from a loader definition.\n * Single loaders return V | Error, grouped loaders return V[].\n *\n * @internal The return type uses a union because we need to handle both loader types.\n * The calling code should use the appropriate type based on the definition's _tag.\n */\nfunction createDataLoader<K, V, R>(\n def: LoaderDef<K, V, R>\n): Effect.Effect<DataLoader<K, V | Error> | DataLoader<K, V[]>, never, R> {\n return Effect.gen(function* () {\n // Capture context for use in batch function\n const context = yield* Effect.context<R>()\n\n if (def._tag === \"single\") {\n return createSingleDataLoader(def, context)\n } else {\n return createGroupedDataLoader(def, context)\n }\n })\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Define a set of loaders.\n *\n * @example\n * ```typescript\n * const loaders = Loader.define({\n * UserById: Loader.single<string, User>({\n * batch: (ids) => db.getUsersByIds(ids),\n * key: (user) => user.id,\n * }),\n * PostsByAuthorId: Loader.grouped<string, Post>({\n * batch: (ids) => db.getPostsForAuthors(ids),\n * groupBy: (post) => post.authorId,\n * }),\n * })\n *\n * // In resolvers:\n * loaders.load(\"UserById\", \"123\")\n * loaders.loadMany(\"UserById\", [\"1\", \"2\", \"3\"])\n * ```\n */\nfunction define<Defs extends Record<string, LoaderDef<any, any, any>>>(\n definitions: Defs\n): LoaderRegistry<Defs> {\n return new LoaderRegistry(definitions)\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Map an array of items to match requested keys.\n * Returns items in the same order as keys, with errors for missing items.\n */\nfunction mapByKey<K, V>(\n keys: readonly K[],\n items: readonly V[],\n keyFn: (item: V) => K\n): (V | Error)[] {\n const map = new Map<K, V>()\n for (const item of items) {\n map.set(keyFn(item), item)\n }\n return keys.map((key) => map.get(key) ?? new Error(`Not found: ${key}`))\n}\n\n/**\n * Group an array of items by a key function.\n * Returns a Map from key to array of matching items.\n * Guarantees an entry (possibly empty) for each requested key.\n */\nfunction groupByKey<K, V>(\n keys: readonly K[],\n items: readonly V[],\n keyFn: (item: V) => K\n): Map<K, V[]> {\n const map = new Map<K, V[]>()\n // Initialize empty arrays for all requested keys\n for (const key of keys) {\n map.set(key, [])\n }\n // Fill in items\n for (const item of items) {\n const key = keyFn(item)\n const arr = map.get(key)\n if (arr) arr.push(item)\n }\n return map\n}\n\n// ============================================================================\n// Export\n// ============================================================================\n\nexport const Loader = {\n define,\n single,\n grouped,\n mapByKey,\n groupByKey,\n} as const\n\nexport type { LoaderRegistry, LoaderDef, LoaderInstances }\n","import { Effect, Context, Layer, Ref, Option, HashMap } from \"effect\"\n\n/**\n * A type-safe context system for passing values through the resolver hierarchy.\n *\n * Unlike simple property bags, this provides:\n * - Type-safe slots that know their value type\n * - Clear errors when required context is missing\n * - Request-scoped storage that works across nested resolvers\n *\n * @example\n * ```typescript\n * // Define a context slot\n * const AuthPrincipal = ResolverContext.make<User>(\"AuthPrincipal\")\n *\n * // Provide in a directive\n * .directive({\n * name: \"auth\",\n * apply: () => (effect) => Effect.gen(function*() {\n * const user = yield* validateJwt()\n * yield* ResolverContext.set(AuthPrincipal, user)\n * return yield* effect\n * }),\n * })\n *\n * // Access in any nested resolver\n * .field(\"User\", \"posts\", {\n * resolve: (parent) => Effect.gen(function*() {\n * const user = yield* ResolverContext.get(AuthPrincipal)\n * // ...\n * }),\n * })\n * ```\n */\n\n/**\n * Error thrown when trying to access a context value that hasn't been set\n */\nexport class MissingResolverContextError extends Error {\n readonly _tag = \"MissingResolverContextError\"\n\n constructor(readonly contextName: string) {\n super(\n `Resolver context \"${contextName}\" was not provided. Ensure a parent resolver or directive provides this context.`\n )\n this.name = \"MissingResolverContextError\"\n }\n}\n\n/**\n * A typed context slot that can hold a value of type A\n */\nexport interface ResolverContextSlot<A> {\n readonly _tag: \"ResolverContextSlot\"\n readonly name: string\n readonly _A: A // Phantom type for type inference\n}\n\n/**\n * Internal storage for resolver context values.\n * This is a request-scoped service that holds all context values.\n */\nexport interface ResolverContextStore {\n readonly ref: Ref.Ref<HashMap.HashMap<string, unknown>>\n}\n\nexport const ResolverContextStore = Context.GenericTag<ResolverContextStore>(\n \"effect-gql/ResolverContextStore\"\n)\n\n/**\n * Create a Layer that provides the ResolverContextStore.\n * This should be included in the request layer.\n */\nexport const makeStoreLayer = (): Effect.Effect<Layer.Layer<ResolverContextStore>> =>\n Effect.map(Ref.make(HashMap.empty<string, unknown>()), (ref) =>\n Layer.succeed(ResolverContextStore, { ref })\n )\n\n/**\n * Create a Layer that provides an empty ResolverContextStore.\n * Convenience function for creating a fresh store layer.\n */\nexport const storeLayer: Layer.Layer<ResolverContextStore> = Layer.effect(\n ResolverContextStore,\n Effect.map(Ref.make(HashMap.empty<string, unknown>()), (ref) => ({ ref }))\n)\n\n/**\n * Create a new resolver context slot.\n *\n * The name is used for error messages when the context is accessed but not set.\n *\n * @example\n * ```typescript\n * const AuthPrincipal = ResolverContext.make<User>(\"AuthPrincipal\")\n * const TenantId = ResolverContext.make<string>(\"TenantId\")\n * ```\n */\nexport const make = <A>(name: string): ResolverContextSlot<A> => ({\n _tag: \"ResolverContextSlot\",\n name,\n _A: undefined as unknown as A,\n})\n\n/**\n * Get a value from the resolver context.\n *\n * Fails with MissingResolverContextError if the context was not set\n * by a parent resolver or directive.\n *\n * @example\n * ```typescript\n * const effect = Effect.gen(function*() {\n * const user = yield* ResolverContext.get(AuthPrincipal)\n * // user is typed as User\n * })\n * ```\n */\nexport const get = <A>(\n slot: ResolverContextSlot<A>\n): Effect.Effect<A, MissingResolverContextError, ResolverContextStore> =>\n Effect.flatMap(ResolverContextStore, (store) =>\n Effect.flatMap(Ref.get(store.ref), (map) => {\n const value = HashMap.get(map, slot.name)\n return Option.match(value, {\n onNone: () => Effect.fail(new MissingResolverContextError(slot.name)),\n onSome: (v) => Effect.succeed(v as A),\n })\n })\n )\n\n/**\n * Get a value from the resolver context as an Option.\n *\n * Returns None if the context was not set, instead of failing.\n * Useful when context is optional.\n */\nexport const getOption = <A>(\n slot: ResolverContextSlot<A>\n): Effect.Effect<Option.Option<A>, never, ResolverContextStore> =>\n Effect.flatMap(ResolverContextStore, (store) =>\n Effect.map(Ref.get(store.ref), (map) => HashMap.get(map, slot.name) as Option.Option<A>)\n )\n\n/**\n * Set a value in the resolver context.\n *\n * The value will be available to all subsequent resolver calls in this request.\n * This mutates the request-scoped store, so nested resolvers will see the value.\n *\n * @example\n * ```typescript\n * // In a directive\n * const withAuth = (effect) => Effect.gen(function*() {\n * const user = yield* validateJwt()\n * yield* ResolverContext.set(AuthPrincipal, user)\n * return yield* effect\n * })\n * ```\n */\nexport const set = <A>(\n slot: ResolverContextSlot<A>,\n value: A\n): Effect.Effect<void, never, ResolverContextStore> =>\n Effect.flatMap(ResolverContextStore, (store) =>\n Ref.update(store.ref, (map) => HashMap.set(map, slot.name, value))\n )\n\n/**\n * Set multiple context values at once.\n */\nexport const setMany = (\n values: ReadonlyArray<readonly [ResolverContextSlot<any>, any]>\n): Effect.Effect<void, never, ResolverContextStore> =>\n Effect.flatMap(ResolverContextStore, (store) =>\n Ref.update(store.ref, (map) => {\n let result = map\n for (const [slot, value] of values) {\n result = HashMap.set(result, slot.name, value)\n }\n return result\n })\n )\n\n/**\n * Check if a context slot has a value set.\n */\nexport const has = <A>(\n slot: ResolverContextSlot<A>\n): Effect.Effect<boolean, never, ResolverContextStore> =>\n Effect.flatMap(ResolverContextStore, (store) =>\n Effect.map(Ref.get(store.ref), (map) => HashMap.has(map, slot.name))\n )\n\n/**\n * Get a value or return a default if not set.\n */\nexport const getOrElse = <A>(\n slot: ResolverContextSlot<A>,\n orElse: () => A\n): Effect.Effect<A, never, ResolverContextStore> =>\n Effect.flatMap(ResolverContextStore, (store) =>\n Effect.map(Ref.get(store.ref), (map) =>\n Option.getOrElse(HashMap.get(map, slot.name) as Option.Option<A>, orElse)\n )\n )\n\n/**\n * Run an effect with a temporary context value.\n * The value is set before the effect runs and removed after.\n * Useful for scoped context that shouldn't persist.\n */\nexport const scoped =\n <A>(slot: ResolverContextSlot<A>, value: A) =>\n <B, E, R>(effect: Effect.Effect<B, E, R>): Effect.Effect<B, E, R | ResolverContextStore> =>\n Effect.flatMap(ResolverContextStore, (store) =>\n Effect.acquireUseRelease(\n // Acquire: save current value and set new one\n Effect.flatMap(Ref.get(store.ref), (map) => {\n const previous = HashMap.get(map, slot.name)\n return Effect.as(Ref.set(store.ref, HashMap.set(map, slot.name, value)), previous)\n }),\n // Use: run the effect\n () => effect,\n // Release: restore previous value\n (previous) =>\n Ref.update(store.ref, (map) =>\n Option.match(previous, {\n onNone: () => HashMap.remove(map, slot.name),\n onSome: (v) => HashMap.set(map, slot.name, v),\n })\n )\n )\n )\n\n/**\n * Namespace for ResolverContext functions\n */\nexport const ResolverContext = {\n make,\n get,\n getOption,\n set,\n setMany,\n has,\n getOrElse,\n scoped,\n storeLayer,\n makeStoreLayer,\n Store: ResolverContextStore,\n MissingResolverContextError,\n} as const\n","import { Config, Option } from \"effect\"\nimport type { ComplexityConfig } from \"./complexity\"\nimport type { CacheControlConfig } from \"./cache-control\"\n\n/**\n * Configuration for the GraphiQL UI\n */\nexport interface GraphiQLConfig {\n /** Path where GraphiQL UI is served (default: \"/graphiql\") */\n readonly path: string\n /** URL where GraphiQL sends requests (default: same as graphql path) */\n readonly endpoint: string\n /** WebSocket URL for subscriptions (default: same as endpoint) */\n readonly subscriptionEndpoint?: string\n}\n\n/**\n * Configuration for the GraphQL router\n */\nexport interface GraphQLRouterConfig {\n /** Path for GraphQL endpoint (default: \"/graphql\") */\n readonly path: string\n /** GraphiQL configuration, or false to disable */\n readonly graphiql: false | GraphiQLConfig\n /** Query complexity limiting configuration */\n readonly complexity?: ComplexityConfig\n /** Enable introspection queries (default: true). Set to false in production. */\n readonly introspection: boolean\n /** Cache control configuration for HTTP Cache-Control headers */\n readonly cacheControl?: CacheControlConfig\n}\n\n/**\n * Default configuration values\n */\nexport const defaultConfig: GraphQLRouterConfig = {\n path: \"/graphql\",\n graphiql: false,\n complexity: undefined,\n introspection: true,\n cacheControl: undefined,\n}\n\n/**\n * Normalize user-provided config (which may use boolean shorthand for graphiql)\n * into the full GraphQLRouterConfig format\n */\nexport interface GraphQLRouterConfigInput {\n readonly path?: string\n readonly graphiql?: boolean | Partial<GraphiQLConfig>\n /** Query complexity limiting configuration */\n readonly complexity?: ComplexityConfig\n /** Enable introspection queries (default: true). Set to false in production. */\n readonly introspection?: boolean\n /** Cache control configuration for HTTP Cache-Control headers */\n readonly cacheControl?: CacheControlConfig\n}\n\nexport const normalizeConfig = (input: GraphQLRouterConfigInput = {}): GraphQLRouterConfig => {\n const path = input.path ?? defaultConfig.path\n\n let graphiql: false | GraphiQLConfig = false\n if (input.graphiql === true) {\n graphiql = { path: \"/graphiql\", endpoint: path }\n } else if (input.graphiql && typeof input.graphiql === \"object\") {\n graphiql = {\n path: input.graphiql.path ?? \"/graphiql\",\n endpoint: input.graphiql.endpoint ?? path,\n }\n }\n\n return {\n path,\n graphiql,\n complexity: input.complexity,\n introspection: input.introspection ?? true,\n cacheControl: input.cacheControl,\n }\n}\n\n/**\n * Effect Config for loading GraphQL router configuration from environment variables.\n *\n * Environment variables:\n * - GRAPHQL_PATH: Path for GraphQL endpoint (default: \"/graphql\")\n * - GRAPHQL_INTROSPECTION: Enable introspection queries (default: true)\n * - GRAPHIQL_ENABLED: Enable GraphiQL UI (default: false)\n * - GRAPHIQL_PATH: Path for GraphiQL UI (default: \"/graphiql\")\n * - GRAPHIQL_ENDPOINT: URL where GraphiQL sends requests (default: same as GRAPHQL_PATH)\n * - GRAPHQL_MAX_DEPTH: Maximum query depth (optional)\n * - GRAPHQL_MAX_COMPLEXITY: Maximum complexity score (optional)\n * - GRAPHQL_MAX_ALIASES: Maximum number of aliases (optional)\n * - GRAPHQL_MAX_FIELDS: Maximum number of fields (optional)\n * - GRAPHQL_DEFAULT_FIELD_COMPLEXITY: Default field complexity (default: 1)\n * - GRAPHQL_CACHE_CONTROL_ENABLED: Enable cache control headers (default: false)\n * - GRAPHQL_CACHE_CONTROL_DEFAULT_MAX_AGE: Default maxAge for root fields (default: 0)\n * - GRAPHQL_CACHE_CONTROL_DEFAULT_SCOPE: Default scope - PUBLIC or PRIVATE (default: PUBLIC)\n */\nexport const GraphQLRouterConfigFromEnv: Config.Config<GraphQLRouterConfig> = Config.all({\n path: Config.string(\"GRAPHQL_PATH\").pipe(Config.withDefault(\"/graphql\")),\n introspection: Config.boolean(\"GRAPHQL_INTROSPECTION\").pipe(Config.withDefault(true)),\n graphiqlEnabled: Config.boolean(\"GRAPHIQL_ENABLED\").pipe(Config.withDefault(false)),\n graphiqlPath: Config.string(\"GRAPHIQL_PATH\").pipe(Config.withDefault(\"/graphiql\")),\n graphiqlEndpoint: Config.string(\"GRAPHIQL_ENDPOINT\").pipe(Config.option),\n maxDepth: Config.number(\"GRAPHQL_MAX_DEPTH\").pipe(Config.option),\n maxComplexity: Config.number(\"GRAPHQL_MAX_COMPLEXITY\").pipe(Config.option),\n maxAliases: Config.number(\"GRAPHQL_MAX_ALIASES\").pipe(Config.option),\n maxFields: Config.number(\"GRAPHQL_MAX_FIELDS\").pipe(Config.option),\n defaultFieldComplexity: Config.number(\"GRAPHQL_DEFAULT_FIELD_COMPLEXITY\").pipe(\n Config.withDefault(1)\n ),\n cacheControlEnabled: Config.boolean(\"GRAPHQL_CACHE_CONTROL_ENABLED\").pipe(\n Config.withDefault(false)\n ),\n cacheControlDefaultMaxAge: Config.number(\"GRAPHQL_CACHE_CONTROL_DEFAULT_MAX_AGE\").pipe(\n Config.withDefault(0)\n ),\n cacheControlDefaultScope: Config.string(\"GRAPHQL_CACHE_CONTROL_DEFAULT_SCOPE\").pipe(\n Config.withDefault(\"PUBLIC\")\n ),\n}).pipe(\n Config.map(\n ({\n path,\n introspection,\n graphiqlEnabled,\n graphiqlPath,\n graphiqlEndpoint,\n maxDepth,\n maxComplexity,\n maxAliases,\n maxFields,\n defaultFieldComplexity,\n cacheControlEnabled,\n cacheControlDefaultMaxAge,\n cacheControlDefaultScope,\n }) => {\n // Check if any complexity option is set\n const hasComplexity =\n Option.isSome(maxDepth) ||\n Option.isSome(maxComplexity) ||\n Option.isSome(maxAliases) ||\n Option.isSome(maxFields)\n\n return {\n path,\n introspection,\n graphiql: graphiqlEnabled\n ? {\n path: graphiqlPath,\n endpoint: Option.isSome(graphiqlEndpoint) ? graphiqlEndpoint.value : path,\n }\n : (false as const),\n complexity: hasComplexity\n ? {\n maxDepth: Option.getOrUndefined(maxDepth),\n maxComplexity: Option.getOrUndefined(maxComplexity),\n maxAliases: Option.getOrUndefined(maxAliases),\n maxFields: Option.getOrUndefined(maxFields),\n defaultFieldComplexity,\n }\n : undefined,\n cacheControl: cacheControlEnabled\n ? {\n enabled: true,\n defaultMaxAge: cacheControlDefaultMaxAge,\n defaultScope: (cacheControlDefaultScope === \"PRIVATE\"\n ? \"PRIVATE\"\n : \"PUBLIC\") as import(\"../builder/types\").CacheControlScope,\n calculateHttpHeaders: true,\n }\n : undefined,\n }\n }\n )\n)\n","/**\n * Generate HTML for GraphiQL IDE, loading dependencies from CDN\n */\nexport const graphiqlHtml = (\n endpoint: string,\n subscriptionEndpoint?: string\n): string => `<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>GraphiQL</title>\n <link\n rel=\"stylesheet\"\n href=\"https://unpkg.com/graphiql@3/graphiql.min.css\"\n />\n </head>\n <body style=\"margin: 0; overflow: hidden;\">\n <div id=\"graphiql\" style=\"height: 100vh;\"></div>\n <script\n crossorigin\n src=\"https://unpkg.com/react@18/umd/react.production.min.js\"\n ></script>\n <script\n crossorigin\n src=\"https://unpkg.com/react-dom@18/umd/react-dom.production.min.js\"\n ></script>\n <script\n crossorigin\n src=\"https://unpkg.com/graphiql@3/graphiql.min.js\"\n ></script>\n <script>\n const fetcher = GraphiQL.createFetcher({\n url: ${JSON.stringify(endpoint)},\n subscriptionUrl: ${JSON.stringify(subscriptionEndpoint ?? endpoint)},\n });\n ReactDOM.createRoot(document.getElementById('graphiql')).render(\n React.createElement(GraphiQL, { fetcher })\n );\n </script>\n </body>\n</html>`\n","import { Effect, Option, Config, Data } from \"effect\"\nimport {\n DocumentNode,\n OperationDefinitionNode,\n FieldNode,\n FragmentDefinitionNode,\n FragmentSpreadNode,\n InlineFragmentNode,\n SelectionSetNode,\n GraphQLSchema,\n GraphQLObjectType,\n GraphQLOutputType,\n GraphQLNonNull,\n GraphQLList,\n Kind,\n parse,\n} from \"graphql\"\n\n// ============================================================================\n// Errors\n// ============================================================================\n\n/**\n * Error thrown when query complexity exceeds configured limits\n */\nexport class ComplexityLimitExceededError extends Data.TaggedError(\"ComplexityLimitExceededError\")<{\n readonly message: string\n readonly limit: number\n readonly actual: number\n readonly limitType: \"depth\" | \"complexity\" | \"aliases\" | \"fields\"\n}> {}\n\n/**\n * Error thrown when complexity analysis fails\n */\nexport class ComplexityAnalysisError extends Data.TaggedError(\"ComplexityAnalysisError\")<{\n readonly message: string\n readonly cause?: unknown\n}> {}\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Result of complexity analysis for a GraphQL operation\n */\nexport interface ComplexityResult {\n /** Maximum depth of the query */\n readonly depth: number\n /** Total complexity score */\n readonly complexity: number\n /** Number of field selections (including nested) */\n readonly fieldCount: number\n /** Number of aliased fields */\n readonly aliasCount: number\n}\n\n/**\n * Information provided to complexity calculators\n */\nexport interface ComplexityAnalysisInfo {\n /** Parsed GraphQL document */\n readonly document: DocumentNode\n /** The operation being executed */\n readonly operation: OperationDefinitionNode\n /** Variables provided with the query */\n readonly variables?: Record<string, unknown>\n /** The GraphQL schema */\n readonly schema: GraphQLSchema\n /** Field complexity definitions from the builder */\n readonly fieldComplexities: FieldComplexityMap\n}\n\n/**\n * Information provided when complexity limit is exceeded\n */\nexport interface ComplexityExceededInfo {\n /** The computed complexity result */\n readonly result: ComplexityResult\n /** Which limit was exceeded */\n readonly exceededLimit: \"depth\" | \"complexity\" | \"aliases\" | \"fields\"\n /** The limit value */\n readonly limit: number\n /** The actual value */\n readonly actual: number\n /** The query that exceeded limits */\n readonly query: string\n /** Operation name if provided */\n readonly operationName?: string\n}\n\n/**\n * Complexity value for a field - can be static or dynamic based on arguments\n */\nexport type FieldComplexity = number | ((args: Record<string, unknown>) => number)\n\n/**\n * Map of type.field -> complexity\n */\nexport type FieldComplexityMap = Map<string, FieldComplexity>\n\n/**\n * Custom complexity calculator function.\n * Must be self-contained (no service requirements).\n */\nexport type ComplexityCalculator = (\n info: ComplexityAnalysisInfo\n) => Effect.Effect<ComplexityResult, ComplexityAnalysisError, never>\n\n/**\n * Configuration for query complexity limiting\n */\nexport interface ComplexityConfig {\n /**\n * Maximum allowed query depth.\n * Depth is the deepest nesting level in the query.\n * @example\n * // Depth 3:\n * // { user { posts { comments { text } } } }\n */\n readonly maxDepth?: number\n\n /**\n * Maximum allowed total complexity score.\n * Complexity is calculated by summing field costs.\n */\n readonly maxComplexity?: number\n\n /**\n * Maximum number of field aliases allowed.\n * Prevents response explosion attacks via aliases.\n */\n readonly maxAliases?: number\n\n /**\n * Maximum total number of fields in the query.\n * Includes all nested field selections.\n */\n readonly maxFields?: number\n\n /**\n * Default complexity cost for fields without explicit costs.\n * @default 1\n */\n readonly defaultFieldComplexity?: number\n\n /**\n * Custom complexity calculator.\n * If provided, this is used instead of the default calculator.\n * Can be used to implement custom cost algorithms.\n */\n readonly calculator?: ComplexityCalculator\n\n /**\n * Hook called when a limit is exceeded.\n * Useful for logging, metrics, or custom handling.\n * This is called BEFORE the error is thrown.\n * Must be self-contained (no service requirements).\n */\n readonly onExceeded?: (info: ComplexityExceededInfo) => Effect.Effect<void, never, never>\n}\n\n// ============================================================================\n// Default Calculator\n// ============================================================================\n\n/**\n * Default complexity calculator that walks the AST and computes:\n * - depth: Maximum nesting level\n * - complexity: Sum of field costs\n * - fieldCount: Total number of field selections\n * - aliasCount: Number of aliased fields\n */\nexport const defaultComplexityCalculator = (defaultCost: number = 1): ComplexityCalculator => {\n return (info: ComplexityAnalysisInfo) =>\n Effect.try({\n try: () => {\n const fragments = new Map<string, FragmentDefinitionNode>()\n\n // Collect fragment definitions\n for (const definition of info.document.definitions) {\n if (definition.kind === Kind.FRAGMENT_DEFINITION) {\n fragments.set(definition.name.value, definition)\n }\n }\n\n // Get the root type for the operation\n const rootType = getRootType(info.schema, info.operation.operation)\n if (!rootType) {\n throw new Error(`No root type found for operation: ${info.operation.operation}`)\n }\n\n // Analyze the selection set\n const result = analyzeSelectionSet(\n info.operation.selectionSet,\n rootType,\n info.schema,\n fragments,\n info.fieldComplexities,\n info.variables ?? {},\n defaultCost,\n 1, // Starting depth\n new Set() // Visited fragments to prevent infinite loops\n )\n\n return result\n },\n catch: (error) =>\n new ComplexityAnalysisError({\n message: `Failed to analyze query complexity: ${error}`,\n cause: error,\n }),\n })\n}\n\n/**\n * Get the root type for an operation\n */\nfunction getRootType(\n schema: GraphQLSchema,\n operation: \"query\" | \"mutation\" | \"subscription\"\n): GraphQLObjectType | null {\n switch (operation) {\n case \"query\":\n return schema.getQueryType() ?? null\n case \"mutation\":\n return schema.getMutationType() ?? null\n case \"subscription\":\n return schema.getSubscriptionType() ?? null\n }\n}\n\n/**\n * Get the named type from a potentially wrapped type\n */\nfunction getNamedType(type: GraphQLOutputType): GraphQLObjectType | null {\n if (type instanceof GraphQLNonNull || type instanceof GraphQLList) {\n return getNamedType(type.ofType as GraphQLOutputType)\n }\n if (type instanceof GraphQLObjectType) {\n return type\n }\n return null\n}\n\n/**\n * Merge a child result into an accumulator (mutates accumulator)\n */\nfunction accumulateResult(\n acc: { maxDepth: number; complexity: number; fieldCount: number; aliasCount: number },\n result: ComplexityResult\n): void {\n acc.maxDepth = Math.max(acc.maxDepth, result.depth)\n acc.complexity += result.complexity\n acc.fieldCount += result.fieldCount\n acc.aliasCount += result.aliasCount\n}\n\n/**\n * Analysis context passed through the recursive analysis functions\n */\ninterface AnalysisContext {\n readonly schema: GraphQLSchema\n readonly fragments: Map<string, FragmentDefinitionNode>\n readonly fieldComplexities: FieldComplexityMap\n readonly variables: Record<string, unknown>\n readonly defaultCost: number\n}\n\n/**\n * Analyze a selection set and return complexity metrics\n */\nfunction analyzeSelectionSet(\n selectionSet: SelectionSetNode,\n parentType: GraphQLObjectType,\n schema: GraphQLSchema,\n fragments: Map<string, FragmentDefinitionNode>,\n fieldComplexities: FieldComplexityMap,\n variables: Record<string, unknown>,\n defaultCost: number,\n currentDepth: number,\n visitedFragments: Set<string>\n): ComplexityResult {\n const ctx: AnalysisContext = { schema, fragments, fieldComplexities, variables, defaultCost }\n const acc = { maxDepth: currentDepth, complexity: 0, fieldCount: 0, aliasCount: 0 }\n\n for (const selection of selectionSet.selections) {\n const result = analyzeSelection(selection, parentType, ctx, currentDepth, visitedFragments)\n accumulateResult(acc, result)\n }\n\n return {\n depth: acc.maxDepth,\n complexity: acc.complexity,\n fieldCount: acc.fieldCount,\n aliasCount: acc.aliasCount,\n }\n}\n\n/**\n * Analyze a single selection node (field, fragment spread, or inline fragment)\n */\nfunction analyzeSelection(\n selection: FieldNode | FragmentSpreadNode | InlineFragmentNode,\n parentType: GraphQLObjectType,\n ctx: AnalysisContext,\n currentDepth: number,\n visitedFragments: Set<string>\n): ComplexityResult {\n switch (selection.kind) {\n case Kind.FIELD:\n return analyzeField(selection, parentType, ctx, currentDepth, visitedFragments)\n case Kind.FRAGMENT_SPREAD:\n return analyzeFragmentSpread(selection, ctx, currentDepth, visitedFragments)\n case Kind.INLINE_FRAGMENT:\n return analyzeInlineFragment(selection, parentType, ctx, currentDepth, visitedFragments)\n }\n}\n\n/**\n * Analyze a field node\n */\nfunction analyzeField(\n field: FieldNode,\n parentType: GraphQLObjectType,\n ctx: AnalysisContext,\n currentDepth: number,\n visitedFragments: Set<string>\n): ComplexityResult {\n const fieldName = field.name.value\n const aliasCount = field.alias ? 1 : 0\n\n // Introspection fields\n if (fieldName.startsWith(\"__\")) {\n return { depth: currentDepth, complexity: 0, fieldCount: 1, aliasCount }\n }\n\n // Get the field from the schema\n const schemaField = parentType.getFields()[fieldName]\n if (!schemaField) {\n // Field not found - skip (will be caught by validation)\n return { depth: currentDepth, complexity: ctx.defaultCost, fieldCount: 1, aliasCount }\n }\n\n // Calculate field arguments\n const args = resolveFieldArguments(field, ctx.variables)\n\n // Get field complexity\n const complexityKey = `${parentType.name}.${fieldName}`\n const fieldComplexity = ctx.fieldComplexities.get(complexityKey)\n const cost =\n fieldComplexity !== undefined\n ? typeof fieldComplexity === \"function\"\n ? fieldComplexity(args)\n : fieldComplexity\n : ctx.defaultCost\n\n // If the field has a selection set, analyze it\n if (field.selectionSet) {\n const fieldType = getNamedType(schemaField.type)\n if (fieldType) {\n const nestedResult = analyzeSelectionSet(\n field.selectionSet,\n fieldType,\n ctx.schema,\n ctx.fragments,\n ctx.fieldComplexities,\n ctx.variables,\n ctx.defaultCost,\n currentDepth + 1,\n visitedFragments\n )\n return {\n depth: nestedResult.depth,\n complexity: cost + nestedResult.complexity,\n fieldCount: 1 + nestedResult.fieldCount,\n aliasCount: aliasCount + nestedResult.aliasCount,\n }\n }\n }\n\n return { depth: currentDepth, complexity: cost, fieldCount: 1, aliasCount }\n}\n\n/**\n * Analyze a fragment spread\n */\nfunction analyzeFragmentSpread(\n spread: FragmentSpreadNode,\n ctx: AnalysisContext,\n currentDepth: number,\n visitedFragments: Set<string>\n): ComplexityResult {\n const fragmentName = spread.name.value\n\n // Prevent infinite loops with fragment cycles\n if (visitedFragments.has(fragmentName)) {\n return { depth: currentDepth, complexity: 0, fieldCount: 0, aliasCount: 0 }\n }\n\n const fragment = ctx.fragments.get(fragmentName)\n if (!fragment) {\n return { depth: currentDepth, complexity: 0, fieldCount: 0, aliasCount: 0 }\n }\n\n const fragmentType = ctx.schema.getType(fragment.typeCondition.name.value)\n if (!(fragmentType instanceof GraphQLObjectType)) {\n return { depth: currentDepth, complexity: 0, fieldCount: 0, aliasCount: 0 }\n }\n\n const newVisited = new Set(visitedFragments)\n newVisited.add(fragmentName)\n\n return analyzeSelectionSet(\n fragment.selectionSet,\n fragmentType,\n ctx.schema,\n ctx.fragments,\n ctx.fieldComplexities,\n ctx.variables,\n ctx.defaultCost,\n currentDepth,\n newVisited\n )\n}\n\n/**\n * Analyze an inline fragment\n */\nfunction analyzeInlineFragment(\n fragment: InlineFragmentNode,\n parentType: GraphQLObjectType,\n ctx: AnalysisContext,\n currentDepth: number,\n visitedFragments: Set<string>\n): ComplexityResult {\n let targetType = parentType\n\n if (fragment.typeCondition) {\n const conditionType = ctx.schema.getType(fragment.typeCondition.name.value)\n if (conditionType instanceof GraphQLObjectType) {\n targetType = conditionType\n }\n }\n\n return analyzeSelectionSet(\n fragment.selectionSet,\n targetType,\n ctx.schema,\n ctx.fragments,\n ctx.fieldComplexities,\n ctx.variables,\n ctx.defaultCost,\n currentDepth,\n visitedFragments\n )\n}\n\n/**\n * Resolve field arguments, substituting variables\n */\nfunction resolveFieldArguments(\n field: FieldNode,\n variables: Record<string, unknown>\n): Record<string, unknown> {\n const args: Record<string, unknown> = {}\n\n if (!field.arguments) {\n return args\n }\n\n for (const arg of field.arguments) {\n const value = arg.value\n switch (value.kind) {\n case Kind.VARIABLE:\n args[arg.name.value] = variables[value.name.value]\n break\n case Kind.INT:\n args[arg.name.value] = parseInt(value.value, 10)\n break\n case Kind.FLOAT:\n args[arg.name.value] = parseFloat(value.value)\n break\n case Kind.STRING:\n args[arg.name.value] = value.value\n break\n case Kind.BOOLEAN:\n args[arg.name.value] = value.value\n break\n case Kind.NULL:\n args[arg.name.value] = null\n break\n case Kind.ENUM:\n args[arg.name.value] = value.value\n break\n case Kind.LIST:\n // Simplified - just use empty array for complexity calculation\n args[arg.name.value] = []\n break\n case Kind.OBJECT:\n // Simplified - just use empty object for complexity calculation\n args[arg.name.value] = {}\n break\n }\n }\n\n return args\n}\n\n// ============================================================================\n// Validation\n// ============================================================================\n\n/**\n * Validate query complexity against configured limits.\n * Returns the complexity result if within limits, or fails with ComplexityLimitExceededError.\n */\nexport const validateComplexity = (\n query: string,\n operationName: string | undefined,\n variables: Record<string, unknown> | undefined,\n schema: GraphQLSchema,\n fieldComplexities: FieldComplexityMap,\n config: ComplexityConfig\n): Effect.Effect<ComplexityResult, ComplexityLimitExceededError | ComplexityAnalysisError, never> =>\n Effect.gen(function* () {\n // Parse the query\n const document = yield* Effect.try({\n try: () => parse(query),\n catch: (error) =>\n new ComplexityAnalysisError({\n message: `Failed to parse query: ${error}`,\n cause: error,\n }),\n })\n\n // Find the operation\n const operation = yield* Effect.try({\n try: () => {\n const operations = document.definitions.filter(\n (d): d is OperationDefinitionNode => d.kind === Kind.OPERATION_DEFINITION\n )\n\n if (operations.length === 0) {\n throw new Error(\"No operation found in query\")\n }\n\n if (operationName) {\n const op = operations.find((o) => o.name?.value === operationName)\n if (!op) {\n throw new Error(`Operation \"${operationName}\" not found`)\n }\n return op\n }\n\n if (operations.length > 1) {\n throw new Error(\"Multiple operations found - operationName required\")\n }\n\n return operations[0]\n },\n catch: (error) =>\n new ComplexityAnalysisError({\n message: String(error),\n cause: error,\n }),\n })\n\n // Calculate complexity\n const calculator =\n config.calculator ?? defaultComplexityCalculator(config.defaultFieldComplexity ?? 1)\n\n const result = yield* calculator({\n document,\n operation,\n variables,\n schema,\n fieldComplexities,\n })\n\n // Check limits\n const checkLimit = (\n limitType: \"depth\" | \"complexity\" | \"aliases\" | \"fields\",\n limit: number | undefined,\n actual: number\n ) =>\n Effect.gen(function* () {\n if (limit !== undefined && actual > limit) {\n const exceededInfo: ComplexityExceededInfo = {\n result,\n exceededLimit: limitType,\n limit,\n actual,\n query,\n operationName,\n }\n\n // Call onExceeded hook if provided\n if (config.onExceeded) {\n yield* config.onExceeded(exceededInfo)\n }\n\n yield* Effect.fail(\n new ComplexityLimitExceededError({\n message: `Query ${limitType} of ${actual} exceeds maximum allowed ${limitType} of ${limit}`,\n limit,\n actual,\n limitType,\n })\n )\n }\n })\n\n yield* checkLimit(\"depth\", config.maxDepth, result.depth)\n yield* checkLimit(\"complexity\", config.maxComplexity, result.complexity)\n yield* checkLimit(\"aliases\", config.maxAliases, result.aliasCount)\n yield* checkLimit(\"fields\", config.maxFields, result.fieldCount)\n\n return result\n })\n\n// ============================================================================\n// Environment Configuration\n// ============================================================================\n\n/**\n * Effect Config for loading complexity configuration from environment variables.\n *\n * Environment variables:\n * - GRAPHQL_MAX_DEPTH: Maximum query depth\n * - GRAPHQL_MAX_COMPLEXITY: Maximum complexity score\n * - GRAPHQL_MAX_ALIASES: Maximum number of aliases\n * - GRAPHQL_MAX_FIELDS: Maximum number of fields\n * - GRAPHQL_DEFAULT_FIELD_COMPLEXITY: Default field complexity (default: 1)\n */\nexport const ComplexityConfigFromEnv: Config.Config<ComplexityConfig> = Config.all({\n maxDepth: Config.number(\"GRAPHQL_MAX_DEPTH\").pipe(Config.option),\n maxComplexity: Config.number(\"GRAPHQL_MAX_COMPLEXITY\").pipe(Config.option),\n maxAliases: Config.number(\"GRAPHQL_MAX_ALIASES\").pipe(Config.option),\n maxFields: Config.number(\"GRAPHQL_MAX_FIELDS\").pipe(Config.option),\n defaultFieldComplexity: Config.number(\"GRAPHQL_DEFAULT_FIELD_COMPLEXITY\").pipe(\n Config.withDefault(1)\n ),\n}).pipe(\n Config.map(({ maxDepth, maxComplexity, maxAliases, maxFields, defaultFieldComplexity }) => ({\n maxDepth: Option.getOrUndefined(maxDepth),\n maxComplexity: Option.getOrUndefined(maxComplexity),\n maxAliases: Option.getOrUndefined(maxAliases),\n maxFields: Option.getOrUndefined(maxFields),\n defaultFieldComplexity,\n }))\n)\n\n// ============================================================================\n// Utility Calculators\n// ============================================================================\n\n/**\n * A simple depth-only calculator that only tracks query depth.\n * Use this when you only care about depth limiting and want fast validation.\n */\nexport const depthOnlyCalculator: ComplexityCalculator = (info) =>\n Effect.try({\n try: () => {\n const fragments = new Map<string, FragmentDefinitionNode>()\n for (const definition of info.document.definitions) {\n if (definition.kind === Kind.FRAGMENT_DEFINITION) {\n fragments.set(definition.name.value, definition)\n }\n }\n\n const depth = calculateMaxDepth(info.operation.selectionSet, fragments, 1, new Set())\n\n return {\n depth,\n complexity: 0,\n fieldCount: 0,\n aliasCount: 0,\n }\n },\n catch: (error) =>\n new ComplexityAnalysisError({\n message: `Failed to analyze query depth: ${error}`,\n cause: error,\n }),\n })\n\nfunction calculateMaxDepth(\n selectionSet: SelectionSetNode,\n fragments: Map<string, FragmentDefinitionNode>,\n currentDepth: number,\n visitedFragments: Set<string>\n): number {\n let maxDepth = currentDepth\n\n for (const selection of selectionSet.selections) {\n switch (selection.kind) {\n case Kind.FIELD:\n if (selection.selectionSet) {\n const nestedDepth = calculateMaxDepth(\n selection.selectionSet,\n fragments,\n currentDepth + 1,\n visitedFragments\n )\n maxDepth = Math.max(maxDepth, nestedDepth)\n }\n break\n\n case Kind.FRAGMENT_SPREAD: {\n const fragmentName = selection.name.value\n if (!visitedFragments.has(fragmentName)) {\n const fragment = fragments.get(fragmentName)\n if (fragment) {\n const newVisited = new Set(visitedFragments)\n newVisited.add(fragmentName)\n const fragmentDepth = calculateMaxDepth(\n fragment.selectionSet,\n fragments,\n currentDepth,\n newVisited\n )\n maxDepth = Math.max(maxDepth, fragmentDepth)\n }\n }\n break\n }\n\n case Kind.INLINE_FRAGMENT: {\n const inlineDepth = calculateMaxDepth(\n selection.selectionSet,\n fragments,\n currentDepth,\n visitedFragments\n )\n maxDepth = Math.max(maxDepth, inlineDepth)\n break\n }\n }\n }\n\n return maxDepth\n}\n\n/**\n * Combine multiple calculators - returns the maximum values from all calculators.\n */\nexport const combineCalculators = (\n ...calculators: ComplexityCalculator[]\n): ComplexityCalculator => {\n return (info) =>\n Effect.gen(function* () {\n let maxDepth = 0\n let maxComplexity = 0\n let maxFieldCount = 0\n let maxAliasCount = 0\n\n for (const calculator of calculators) {\n const result = yield* calculator(info)\n maxDepth = Math.max(maxDepth, result.depth)\n maxComplexity = Math.max(maxComplexity, result.complexity)\n maxFieldCount = Math.max(maxFieldCount, result.fieldCount)\n maxAliasCount = Math.max(maxAliasCount, result.aliasCount)\n }\n\n return {\n depth: maxDepth,\n complexity: maxComplexity,\n fieldCount: maxFieldCount,\n aliasCount: maxAliasCount,\n }\n })\n}\n","import { Effect, Config } from \"effect\"\nimport {\n DocumentNode,\n OperationDefinitionNode,\n FieldNode,\n FragmentDefinitionNode,\n SelectionSetNode,\n GraphQLSchema,\n GraphQLObjectType,\n GraphQLOutputType,\n GraphQLNonNull,\n GraphQLList,\n GraphQLScalarType,\n GraphQLEnumType,\n Kind,\n parse,\n} from \"graphql\"\nimport type { CacheHint, CacheControlScope } from \"../builder/types\"\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Map of type.field -> cache hint, or type -> cache hint for type-level hints\n */\nexport type CacheHintMap = Map<string, CacheHint>\n\n/**\n * Computed cache policy for a GraphQL response\n */\nexport interface CachePolicy {\n /**\n * Maximum age in seconds the response can be cached.\n * This is the minimum maxAge of all resolved fields.\n * If 0, the response should not be cached.\n */\n readonly maxAge: number\n\n /**\n * Cache scope - PUBLIC means CDN-cacheable, PRIVATE means browser-only.\n * If any field is PRIVATE, the entire response is PRIVATE.\n */\n readonly scope: CacheControlScope\n}\n\n/**\n * Configuration for cache control\n */\nexport interface CacheControlConfig {\n /**\n * Enable cache control header calculation.\n * @default true\n */\n readonly enabled?: boolean\n\n /**\n * Default maxAge for root fields (Query, Mutation).\n * @default 0 (no caching)\n */\n readonly defaultMaxAge?: number\n\n /**\n * Default scope for fields without explicit scope.\n * @default \"PUBLIC\"\n */\n readonly defaultScope?: CacheControlScope\n\n /**\n * Whether to set HTTP Cache-Control headers on responses.\n * @default true\n */\n readonly calculateHttpHeaders?: boolean\n}\n\n/**\n * Information provided to cache policy calculation\n */\nexport interface CachePolicyAnalysisInfo {\n /** Parsed GraphQL document */\n readonly document: DocumentNode\n /** The operation being executed */\n readonly operation: OperationDefinitionNode\n /** The GraphQL schema */\n readonly schema: GraphQLSchema\n /** Cache hints from the builder (type.field -> hint or type -> hint) */\n readonly cacheHints: CacheHintMap\n /** Configuration options */\n readonly config: CacheControlConfig\n}\n\n// ============================================================================\n// Cache Policy Computation\n// ============================================================================\n\n/**\n * Compute the cache policy for a GraphQL response based on the fields resolved.\n *\n * The policy is computed by walking the selection set and aggregating hints:\n * - maxAge: Use the minimum maxAge of all resolved fields\n * - scope: If any field is PRIVATE, the entire response is PRIVATE\n *\n * Default behaviors (matching Apollo):\n * - Root fields default to maxAge: 0 (unless configured otherwise)\n * - Object-returning fields default to maxAge: 0\n * - Scalar fields inherit their parent's maxAge\n * - Fields with inheritMaxAge: true inherit from parent\n */\nexport const computeCachePolicy = (\n info: CachePolicyAnalysisInfo\n): Effect.Effect<CachePolicy, never, never> =>\n Effect.sync(() => {\n const fragments = new Map<string, FragmentDefinitionNode>()\n\n // Collect fragment definitions\n for (const definition of info.document.definitions) {\n if (definition.kind === Kind.FRAGMENT_DEFINITION) {\n fragments.set(definition.name.value, definition)\n }\n }\n\n // Get the root type for the operation\n const rootType = getRootType(info.schema, info.operation.operation)\n if (!rootType) {\n // No root type - return no-cache\n return { maxAge: 0, scope: \"PUBLIC\" as const }\n }\n\n const defaultMaxAge = info.config.defaultMaxAge ?? 0\n const defaultScope = info.config.defaultScope ?? \"PUBLIC\"\n\n // Analyze the selection set\n const result = analyzeSelectionSet(\n info.operation.selectionSet,\n rootType,\n info.schema,\n fragments,\n info.cacheHints,\n defaultMaxAge,\n defaultScope,\n undefined, // No parent maxAge for root\n new Set()\n )\n\n return result\n })\n\n/**\n * Compute cache policy from a query string\n */\nexport const computeCachePolicyFromQuery = (\n query: string,\n operationName: string | undefined,\n schema: GraphQLSchema,\n cacheHints: CacheHintMap,\n config: CacheControlConfig = {}\n): Effect.Effect<CachePolicy, Error, never> =>\n Effect.gen(function* () {\n // Parse the query\n const document = yield* Effect.try({\n try: () => parse(query),\n catch: (error) => new Error(`Failed to parse query: ${error}`),\n })\n\n // Find the operation\n const operation = yield* Effect.try({\n try: () => {\n const operations = document.definitions.filter(\n (d): d is OperationDefinitionNode => d.kind === Kind.OPERATION_DEFINITION\n )\n\n if (operations.length === 0) {\n throw new Error(\"No operation found in query\")\n }\n\n if (operationName) {\n const op = operations.find((o) => o.name?.value === operationName)\n if (!op) {\n throw new Error(`Operation \"${operationName}\" not found`)\n }\n return op\n }\n\n if (operations.length > 1) {\n throw new Error(\"Multiple operations found - operationName required\")\n }\n\n return operations[0]\n },\n catch: (error) => error as Error,\n })\n\n return yield* computeCachePolicy({\n document,\n operation,\n schema,\n cacheHints,\n config,\n })\n })\n\n/**\n * Convert a cache policy to an HTTP Cache-Control header value\n */\nexport const toCacheControlHeader = (policy: CachePolicy): string => {\n if (policy.maxAge === 0) {\n return \"no-store\"\n }\n\n const directives: string[] = []\n directives.push(policy.scope === \"PRIVATE\" ? \"private\" : \"public\")\n directives.push(`max-age=${policy.maxAge}`)\n\n return directives.join(\", \")\n}\n\n// ============================================================================\n// Internal Helpers\n// ============================================================================\n\n/**\n * Get the root type for an operation\n */\nfunction getRootType(\n schema: GraphQLSchema,\n operation: \"query\" | \"mutation\" | \"subscription\"\n): GraphQLObjectType | null {\n switch (operation) {\n case \"query\":\n return schema.getQueryType() ?? null\n case \"mutation\":\n return schema.getMutationType() ?? null\n case \"subscription\":\n return schema.getSubscriptionType() ?? null\n }\n}\n\n/**\n * Get the named type from a potentially wrapped type\n */\nfunction getNamedType(\n type: GraphQLOutputType\n): GraphQLObjectType | GraphQLScalarType | GraphQLEnumType | null {\n if (type instanceof GraphQLNonNull || type instanceof GraphQLList) {\n return getNamedType(type.ofType as GraphQLOutputType)\n }\n if (\n type instanceof GraphQLObjectType ||\n type instanceof GraphQLScalarType ||\n type instanceof GraphQLEnumType\n ) {\n return type\n }\n return null\n}\n\n/**\n * Check if a type is a scalar or enum (leaf type)\n */\nfunction isLeafType(type: GraphQLOutputType): boolean {\n const namedType = getNamedType(type)\n return namedType instanceof GraphQLScalarType || namedType instanceof GraphQLEnumType\n}\n\n/**\n * Context passed through the analysis functions\n */\ninterface AnalysisContext {\n schema: GraphQLSchema\n fragments: Map<string, FragmentDefinitionNode>\n cacheHints: CacheHintMap\n defaultMaxAge: number\n defaultScope: CacheControlScope\n}\n\n/**\n * Mutable state for aggregating cache policies\n */\ninterface PolicyAccumulator {\n minMaxAge: number | undefined\n hasPrivate: boolean\n}\n\n/**\n * Aggregate a field policy into the accumulator\n */\nfunction aggregatePolicy(acc: PolicyAccumulator, policy: CachePolicy): void {\n if (acc.minMaxAge === undefined) {\n acc.minMaxAge = policy.maxAge\n } else {\n acc.minMaxAge = Math.min(acc.minMaxAge, policy.maxAge)\n }\n if (policy.scope === \"PRIVATE\") {\n acc.hasPrivate = true\n }\n}\n\n/**\n * Analyze a fragment spread and return its cache policy\n */\nfunction analyzeFragmentSpread(\n fragmentName: string,\n ctx: AnalysisContext,\n parentMaxAge: number | undefined,\n visitedFragments: Set<string>\n): CachePolicy | undefined {\n // Prevent infinite loops with fragment cycles\n if (visitedFragments.has(fragmentName)) {\n return undefined\n }\n\n const fragment = ctx.fragments.get(fragmentName)\n if (!fragment) {\n return undefined\n }\n\n const fragmentType = ctx.schema.getType(fragment.typeCondition.name.value)\n if (!(fragmentType instanceof GraphQLObjectType)) {\n return undefined\n }\n\n const newVisited = new Set(visitedFragments)\n newVisited.add(fragmentName)\n\n return analyzeSelectionSet(fragment.selectionSet, fragmentType, ctx, parentMaxAge, newVisited)\n}\n\n/**\n * Analyze an inline fragment and return its cache policy\n */\nfunction analyzeInlineFragment(\n selection: { typeCondition?: { name: { value: string } }; selectionSet: SelectionSetNode },\n parentType: GraphQLObjectType,\n ctx: AnalysisContext,\n parentMaxAge: number | undefined,\n visitedFragments: Set<string>\n): CachePolicy {\n let targetType = parentType\n\n if (selection.typeCondition) {\n const conditionType = ctx.schema.getType(selection.typeCondition.name.value)\n if (conditionType instanceof GraphQLObjectType) {\n targetType = conditionType\n }\n }\n\n return analyzeSelectionSet(\n selection.selectionSet,\n targetType,\n ctx,\n parentMaxAge,\n visitedFragments\n )\n}\n\n/**\n * Look up the effective cache hint for a field (field-level > type-level > undefined)\n */\nfunction lookupEffectiveCacheHint(\n parentTypeName: string,\n fieldName: string,\n returnType: GraphQLOutputType,\n cacheHints: CacheHintMap\n): CacheHint | undefined {\n // Priority: field-level hint > type-level hint\n const fieldKey = `${parentTypeName}.${fieldName}`\n const fieldHint = cacheHints.get(fieldKey)\n if (fieldHint) return fieldHint\n\n // Check type-level hint on return type\n const namedType = getNamedType(returnType)\n return namedType ? cacheHints.get(namedType.name) : undefined\n}\n\n/**\n * Compute the maxAge for a field based on hint, inheritance, and field type\n */\nfunction computeFieldMaxAge(\n hint: CacheHint | undefined,\n fieldType: GraphQLOutputType,\n parentMaxAge: number | undefined,\n defaultMaxAge: number\n): number {\n if (hint) {\n // Use explicit hint\n if (hint.inheritMaxAge && parentMaxAge !== undefined) {\n return parentMaxAge\n }\n if (hint.maxAge !== undefined) {\n return hint.maxAge\n }\n // Fall through to default logic\n }\n\n // Scalar/enum fields inherit parent maxAge by default\n if (isLeafType(fieldType) && parentMaxAge !== undefined) {\n return parentMaxAge\n }\n\n // Root and object fields default to defaultMaxAge (typically 0)\n return defaultMaxAge\n}\n\n/**\n * Analyze a selection set and return the aggregated cache policy.\n * Overload with AnalysisContext for internal use.\n */\nfunction analyzeSelectionSet(\n selectionSet: SelectionSetNode,\n parentType: GraphQLObjectType,\n ctx: AnalysisContext,\n parentMaxAge: number | undefined,\n visitedFragments: Set<string>\n): CachePolicy\nfunction analyzeSelectionSet(\n selectionSet: SelectionSetNode,\n parentType: GraphQLObjectType,\n schema: GraphQLSchema,\n fragments: Map<string, FragmentDefinitionNode>,\n cacheHints: CacheHintMap,\n defaultMaxAge: number,\n defaultScope: CacheControlScope,\n parentMaxAge: number | undefined,\n visitedFragments: Set<string>\n): CachePolicy\nfunction analyzeSelectionSet(\n selectionSet: SelectionSetNode,\n parentType: GraphQLObjectType,\n schemaOrCtx: GraphQLSchema | AnalysisContext,\n fragmentsOrParentMaxAge: Map<string, FragmentDefinitionNode> | number | undefined,\n cacheHintsOrVisited?: CacheHintMap | Set<string>,\n defaultMaxAge?: number,\n defaultScope?: CacheControlScope,\n parentMaxAge?: number | undefined,\n visitedFragments?: Set<string>\n): CachePolicy {\n // Normalize arguments - support both old and new signatures\n let ctx: AnalysisContext\n let actualParentMaxAge: number | undefined\n let actualVisitedFragments: Set<string>\n\n if (schemaOrCtx instanceof GraphQLSchema) {\n // Old signature\n ctx = {\n schema: schemaOrCtx,\n fragments: fragmentsOrParentMaxAge as Map<string, FragmentDefinitionNode>,\n cacheHints: cacheHintsOrVisited as CacheHintMap,\n defaultMaxAge: defaultMaxAge!,\n defaultScope: defaultScope!,\n }\n actualParentMaxAge = parentMaxAge\n actualVisitedFragments = visitedFragments!\n } else {\n // New signature with AnalysisContext\n ctx = schemaOrCtx\n actualParentMaxAge = fragmentsOrParentMaxAge as number | undefined\n actualVisitedFragments = cacheHintsOrVisited as Set<string>\n }\n\n const acc: PolicyAccumulator = { minMaxAge: undefined, hasPrivate: false }\n\n for (const selection of selectionSet.selections) {\n let fieldPolicy: CachePolicy | undefined\n\n switch (selection.kind) {\n case Kind.FIELD:\n fieldPolicy = analyzeField(\n selection,\n parentType,\n ctx,\n actualParentMaxAge,\n actualVisitedFragments\n )\n break\n\n case Kind.FRAGMENT_SPREAD:\n fieldPolicy = analyzeFragmentSpread(\n selection.name.value,\n ctx,\n actualParentMaxAge,\n actualVisitedFragments\n )\n break\n\n case Kind.INLINE_FRAGMENT:\n fieldPolicy = analyzeInlineFragment(\n selection,\n parentType,\n ctx,\n actualParentMaxAge,\n actualVisitedFragments\n )\n break\n }\n\n if (fieldPolicy) {\n aggregatePolicy(acc, fieldPolicy)\n }\n }\n\n return {\n maxAge: acc.minMaxAge ?? ctx.defaultMaxAge,\n scope: acc.hasPrivate ? \"PRIVATE\" : ctx.defaultScope,\n }\n}\n\n/**\n * Analyze a field node and return its cache policy\n */\nfunction analyzeField(\n field: FieldNode,\n parentType: GraphQLObjectType,\n ctx: AnalysisContext,\n parentMaxAge: number | undefined,\n visitedFragments: Set<string>\n): CachePolicy {\n const fieldName = field.name.value\n\n // Introspection fields - don't affect caching\n if (fieldName.startsWith(\"__\")) {\n return { maxAge: Infinity, scope: \"PUBLIC\" }\n }\n\n // Get the field from the schema\n const schemaField = parentType.getFields()[fieldName]\n if (!schemaField) {\n return { maxAge: ctx.defaultMaxAge, scope: ctx.defaultScope }\n }\n\n // Look up effective cache hint\n const effectiveHint = lookupEffectiveCacheHint(\n parentType.name,\n fieldName,\n schemaField.type,\n ctx.cacheHints\n )\n\n // Compute field maxAge\n const fieldMaxAge = computeFieldMaxAge(\n effectiveHint,\n schemaField.type,\n parentMaxAge,\n ctx.defaultMaxAge\n )\n const fieldScope: CacheControlScope = effectiveHint?.scope ?? ctx.defaultScope\n\n // If the field has a selection set, analyze it\n const namedType = getNamedType(schemaField.type)\n if (field.selectionSet && namedType instanceof GraphQLObjectType) {\n const nestedPolicy = analyzeSelectionSet(\n field.selectionSet,\n namedType,\n ctx,\n fieldMaxAge,\n visitedFragments\n )\n\n return {\n maxAge: Math.min(fieldMaxAge, nestedPolicy.maxAge),\n scope: fieldScope === \"PRIVATE\" || nestedPolicy.scope === \"PRIVATE\" ? \"PRIVATE\" : \"PUBLIC\",\n }\n }\n\n return { maxAge: fieldMaxAge, scope: fieldScope }\n}\n\n// ============================================================================\n// Environment Configuration\n// ============================================================================\n\n/**\n * Effect Config for loading cache control configuration from environment variables.\n *\n * Environment variables:\n * - GRAPHQL_CACHE_CONTROL_ENABLED: Enable cache control (default: true)\n * - GRAPHQL_CACHE_CONTROL_DEFAULT_MAX_AGE: Default maxAge for root fields (default: 0)\n * - GRAPHQL_CACHE_CONTROL_DEFAULT_SCOPE: Default scope (PUBLIC or PRIVATE, default: PUBLIC)\n * - GRAPHQL_CACHE_CONTROL_HTTP_HEADERS: Set HTTP headers (default: true)\n */\nexport const CacheControlConfigFromEnv: Config.Config<CacheControlConfig> = Config.all({\n enabled: Config.boolean(\"GRAPHQL_CACHE_CONTROL_ENABLED\").pipe(Config.withDefault(true)),\n defaultMaxAge: Config.number(\"GRAPHQL_CACHE_CONTROL_DEFAULT_MAX_AGE\").pipe(Config.withDefault(0)),\n defaultScope: Config.string(\"GRAPHQL_CACHE_CONTROL_DEFAULT_SCOPE\").pipe(\n Config.withDefault(\"PUBLIC\"),\n Config.map((s) => (s === \"PRIVATE\" ? \"PRIVATE\" : \"PUBLIC\") as CacheControlScope)\n ),\n calculateHttpHeaders: Config.boolean(\"GRAPHQL_CACHE_CONTROL_HTTP_HEADERS\").pipe(\n Config.withDefault(true)\n ),\n})\n","import {\n HttpRouter,\n HttpServerRequest,\n HttpServerResponse,\n HttpIncomingMessage,\n HttpServerError,\n HttpBody,\n} from \"@effect/platform\"\nimport { Cause, Context, Effect, Layer, ParseResult, Schema } from \"effect\"\nimport {\n GraphQLSchema,\n parse,\n validate,\n specifiedRules,\n NoSchemaIntrospectionCustomRule,\n execute as graphqlExecute,\n Kind,\n type DocumentNode,\n type OperationDefinitionNode,\n} from \"graphql\"\nimport type { GraphQLEffectContext } from \"../builder/types\"\nimport { graphiqlHtml } from \"./graphiql\"\nimport { normalizeConfig, type GraphQLRouterConfigInput } from \"./config\"\nimport {\n validateComplexity,\n ComplexityLimitExceededError,\n type FieldComplexityMap,\n} from \"./complexity\"\nimport { computeCachePolicy, toCacheControlHeader, type CacheHintMap } from \"./cache-control\"\nimport {\n type GraphQLExtension,\n ExtensionsService,\n makeExtensionsService,\n runParseHooks,\n runValidateHooks,\n runExecuteStartHooks,\n runExecuteEndHooks,\n} from \"../extensions\"\n\n/**\n * Error handler function type for handling uncaught errors during GraphQL execution.\n * Receives the error cause and should return an HTTP response.\n */\nexport type ErrorHandler = (\n cause: Cause.Cause<unknown>\n) => Effect.Effect<HttpServerResponse.HttpServerResponse, never, never>\n\n/**\n * Default error handler that returns a 500 Internal Server Error.\n * In non-production environments, it logs the full error for debugging.\n */\nexport const defaultErrorHandler: ErrorHandler = (cause) =>\n (process.env.NODE_ENV !== \"production\"\n ? Effect.logError(\"GraphQL error\", cause)\n : Effect.void\n ).pipe(\n Effect.andThen(\n HttpServerResponse.json(\n {\n errors: [\n {\n message: \"An error occurred processing your request\",\n },\n ],\n },\n { status: 500 }\n ).pipe(Effect.orDie)\n )\n )\n\n/**\n * Schema for GraphQL request body.\n */\nconst GraphQLRequestBodySchema = Schema.Struct({\n query: Schema.String,\n variables: Schema.optionalWith(Schema.Record({ key: Schema.String, value: Schema.Unknown }), {\n as: \"Option\",\n }),\n operationName: Schema.optionalWith(Schema.String, { as: \"Option\" }),\n})\n\n/**\n * Request body for GraphQL queries.\n */\ninterface GraphQLRequestBody {\n readonly query: string\n readonly variables?: Record<string, unknown>\n readonly operationName?: string\n}\n\n/**\n * Decode the request body from JSON using the schema.\n */\nconst decodeRequestBody = HttpIncomingMessage.schemaBodyJson(GraphQLRequestBodySchema)\n\n/**\n * Union of all possible errors that can occur during GraphQL request handling.\n */\ntype GraphQLHandlerError =\n | HttpServerError.RequestError\n | HttpBody.HttpBodyError\n | ParseResult.ParseError\n | ComplexityLimitExceededError\n | Error\n\n/**\n * Result type for parseGraphQLQuery\n */\ntype ParseGraphQLQueryResult =\n | { ok: true; document: DocumentNode }\n | { ok: false; response: HttpServerResponse.HttpServerResponse }\n\n/**\n * Parse a GraphQL query string into a DocumentNode.\n * Returns the document or an error response if parsing fails.\n */\nconst parseGraphQLQuery = (\n query: string,\n extensionsService: Context.Tag.Service<typeof ExtensionsService>\n): Effect.Effect<ParseGraphQLQueryResult, never, never> => {\n try {\n const document = parse(query)\n return Effect.succeed({ ok: true as const, document })\n } catch (parseError) {\n return extensionsService.get().pipe(\n Effect.flatMap(\n (extensionData): Effect.Effect<ParseGraphQLQueryResult, never, never> =>\n HttpServerResponse.json({\n errors: [{ message: String(parseError) }],\n extensions: Object.keys(extensionData).length > 0 ? extensionData : undefined,\n }).pipe(\n Effect.orDie,\n Effect.map((response) => ({ ok: false as const, response }))\n )\n )\n )\n }\n}\n\n/**\n * Run complexity validation if configured.\n * Logs warnings for analysis errors but doesn't block execution.\n */\nconst runComplexityValidation = (\n body: GraphQLRequestBody,\n schema: GraphQLSchema,\n fieldComplexities: FieldComplexityMap,\n complexityConfig: { maxDepth?: number; maxComplexity?: number } | undefined\n): Effect.Effect<void, ComplexityLimitExceededError, never> => {\n if (!complexityConfig) {\n return Effect.void\n }\n\n return validateComplexity(\n body.query,\n body.operationName,\n body.variables,\n schema,\n fieldComplexities,\n complexityConfig\n ).pipe(\n Effect.catchTag(\"ComplexityLimitExceededError\", (error) => Effect.fail(error)),\n Effect.catchTag(\"ComplexityAnalysisError\", (error) =>\n Effect.logWarning(\"Complexity analysis failed\", error)\n )\n )\n}\n\n/**\n * Type guard to check if a value is a Promise-like object.\n */\nconst isPromiseLike = <T>(value: unknown): value is PromiseLike<T> =>\n value !== null && typeof value === \"object\" && \"then\" in value && typeof value.then === \"function\"\n\n/**\n * Execute a GraphQL query and handle async results.\n */\nconst executeGraphQLQuery = <R>(\n schema: GraphQLSchema,\n document: DocumentNode,\n variables: Record<string, unknown> | undefined,\n operationName: string | undefined,\n runtime: import(\"effect\").Runtime.Runtime<R>\n): Effect.Effect<import(\"graphql\").ExecutionResult, Error, never> => {\n type ExecutionResult = import(\"graphql\").ExecutionResult\n\n const tryExecute = Effect.try({\n try: () =>\n graphqlExecute({\n schema,\n document,\n variableValues: variables,\n operationName,\n contextValue: { runtime } satisfies GraphQLEffectContext<R>,\n }),\n catch: (error) => new Error(String(error)),\n })\n\n return tryExecute.pipe(\n Effect.flatMap((executeResult): Effect.Effect<ExecutionResult, never, never> => {\n if (isPromiseLike<ExecutionResult>(executeResult)) {\n return Effect.promise(() => executeResult)\n }\n return Effect.succeed(executeResult)\n })\n )\n}\n\n/**\n * Compute cache control header for the response if applicable.\n */\nconst computeCacheControlHeader = (\n document: DocumentNode,\n operationName: string | undefined,\n schema: GraphQLSchema,\n cacheHints: CacheHintMap,\n cacheControlConfig:\n | { enabled?: boolean; calculateHttpHeaders?: boolean; defaultMaxAge?: number }\n | undefined\n): Effect.Effect<string | undefined, never, never> => {\n if (cacheControlConfig?.enabled === false || cacheControlConfig?.calculateHttpHeaders === false) {\n return Effect.succeed(undefined)\n }\n\n // Find the operation from the document\n const operations = document.definitions.filter(\n (d): d is OperationDefinitionNode => d.kind === Kind.OPERATION_DEFINITION\n )\n const operation = operationName\n ? operations.find((o) => o.name?.value === operationName)\n : operations[0]\n\n if (!operation || operation.operation === \"mutation\") {\n // Mutations should not be cached\n return Effect.succeed(undefined)\n }\n\n return computeCachePolicy({\n document,\n operation,\n schema,\n cacheHints,\n config: cacheControlConfig ?? {},\n }).pipe(Effect.map(toCacheControlHeader))\n}\n\n/**\n * Build the final GraphQL response with extensions merged in.\n */\nconst buildGraphQLResponse = (\n result: import(\"graphql\").ExecutionResult,\n extensionData: Record<string, unknown>,\n cacheControlHeader: string | undefined\n): Effect.Effect<HttpServerResponse.HttpServerResponse, never, never> => {\n const finalResult =\n Object.keys(extensionData).length > 0\n ? {\n ...result,\n extensions: {\n ...result.extensions,\n ...extensionData,\n },\n }\n : result\n\n const responseHeaders = cacheControlHeader ? { \"cache-control\": cacheControlHeader } : undefined\n\n return HttpServerResponse.json(finalResult, { headers: responseHeaders }).pipe(Effect.orDie)\n}\n\n/**\n * Handle complexity limit exceeded error, returning appropriate response.\n */\nconst handleComplexityError = (\n error: ComplexityLimitExceededError\n): Effect.Effect<HttpServerResponse.HttpServerResponse, never, never> =>\n HttpServerResponse.json(\n {\n errors: [\n {\n message: error.message,\n extensions: {\n code: \"COMPLEXITY_LIMIT_EXCEEDED\",\n limitType: error.limitType,\n limit: error.limit,\n actual: error.actual,\n },\n },\n ],\n },\n { status: 400 }\n ).pipe(Effect.orDie)\n\n/**\n * Options for makeGraphQLRouter\n */\nexport interface MakeGraphQLRouterOptions extends GraphQLRouterConfigInput {\n /**\n * Field complexity definitions from the schema builder.\n * If using toRouter(), this is automatically extracted from the builder.\n * If using makeGraphQLRouter() directly, call builder.getFieldComplexities().\n */\n readonly fieldComplexities?: FieldComplexityMap\n\n /**\n * Cache hint definitions from the schema builder.\n * If using toRouter(), this is automatically extracted from the builder.\n * If using makeGraphQLRouter() directly, call builder.getCacheHints().\n */\n readonly cacheHints?: CacheHintMap\n\n /**\n * GraphQL extensions for lifecycle hooks.\n * If using toRouter(), this is automatically extracted from the builder.\n * If using makeGraphQLRouter() directly, call builder.getExtensions().\n */\n readonly extensions?: readonly GraphQLExtension<any>[]\n\n /**\n * Custom error handler for uncaught errors during GraphQL execution.\n * Receives the error cause and should return an HTTP response.\n * Defaults to returning a 500 Internal Server Error with a generic message.\n */\n readonly errorHandler?: ErrorHandler\n}\n\n/**\n * Create an HttpRouter configured for GraphQL\n *\n * The router handles:\n * - POST requests to the GraphQL endpoint\n * - GET requests to the GraphiQL UI (if enabled)\n * - Query complexity validation (if configured)\n * - Extension lifecycle hooks (onParse, onValidate, onExecuteStart, onExecuteEnd)\n *\n * @param schema - The GraphQL schema\n * @param layer - Effect layer providing services required by resolvers\n * @param options - Optional configuration for paths, GraphiQL, complexity, and extensions\n * @returns An HttpRouter that can be composed with other routes\n *\n * @example\n * ```typescript\n * const router = makeGraphQLRouter(schema, Layer.empty, {\n * path: \"/graphql\",\n * graphiql: { path: \"/graphiql\" },\n * complexity: { maxDepth: 10, maxComplexity: 1000 },\n * fieldComplexities: builder.getFieldComplexities(),\n * extensions: builder.getExtensions()\n * })\n *\n * // Compose with other routes\n * const app = HttpRouter.empty.pipe(\n * HttpRouter.get(\"/health\", HttpServerResponse.json({ status: \"ok\" })),\n * HttpRouter.concat(router)\n * )\n * ```\n */\nexport const makeGraphQLRouter = <R>(\n schema: GraphQLSchema,\n layer: Layer.Layer<R>,\n options: MakeGraphQLRouterOptions = {}\n): HttpRouter.HttpRouter<never, never> => {\n const resolvedConfig = normalizeConfig(options)\n const fieldComplexities = options.fieldComplexities ?? new Map()\n const cacheHints = options.cacheHints ?? new Map()\n const extensions = options.extensions ?? []\n const errorHandler = options.errorHandler ?? defaultErrorHandler\n\n // GraphQL POST handler - typed as returning HttpServerResponse with all errors handled\n const graphqlHandler = Effect.gen(function* () {\n const extensionsService = yield* makeExtensionsService()\n const runtime = yield* Effect.runtime<R>()\n\n // Parse request body\n const request = yield* HttpServerRequest.HttpServerRequest\n const parsedBody = yield* decodeRequestBody(request)\n const body: GraphQLRequestBody = {\n query: parsedBody.query,\n variables: parsedBody.variables._tag === \"Some\" ? parsedBody.variables.value : undefined,\n operationName:\n parsedBody.operationName._tag === \"Some\" ? parsedBody.operationName.value : undefined,\n }\n\n // Phase 1: Parse\n const parseResult = yield* parseGraphQLQuery(body.query, extensionsService)\n if (!parseResult.ok) {\n return parseResult.response\n }\n const document = parseResult.document\n\n yield* runParseHooks(extensions, body.query, document).pipe(\n Effect.provideService(ExtensionsService, extensionsService)\n )\n\n // Phase 2: Validate\n const validationRules = resolvedConfig.introspection\n ? undefined\n : specifiedRules.concat(NoSchemaIntrospectionCustomRule)\n const validationErrors = validate(schema, document, validationRules)\n\n yield* runValidateHooks(extensions, document, validationErrors).pipe(\n Effect.provideService(ExtensionsService, extensionsService)\n )\n\n if (validationErrors.length > 0) {\n const extensionData = yield* extensionsService.get()\n return yield* HttpServerResponse.json(\n {\n errors: validationErrors.map((e) => ({\n message: e.message,\n locations: e.locations,\n path: e.path,\n })),\n extensions: Object.keys(extensionData).length > 0 ? extensionData : undefined,\n },\n { status: 400 }\n )\n }\n\n // Complexity validation\n yield* runComplexityValidation(body, schema, fieldComplexities, resolvedConfig.complexity)\n\n // Phase 3: Execute\n yield* runExecuteStartHooks(extensions, {\n source: body.query,\n document,\n variableValues: body.variables,\n operationName: body.operationName,\n schema,\n fieldComplexities,\n }).pipe(Effect.provideService(ExtensionsService, extensionsService))\n\n const result = yield* executeGraphQLQuery(\n schema,\n document,\n body.variables,\n body.operationName,\n runtime\n )\n\n yield* runExecuteEndHooks(extensions, result).pipe(\n Effect.provideService(ExtensionsService, extensionsService)\n )\n\n // Build response\n const extensionData = yield* extensionsService.get()\n const cacheControlHeader = yield* computeCacheControlHeader(\n document,\n body.operationName,\n schema,\n cacheHints,\n resolvedConfig.cacheControl\n )\n\n return yield* buildGraphQLResponse(result, extensionData, cacheControlHeader)\n }).pipe(\n Effect.provide(layer),\n Effect.catchAll((error: GraphQLHandlerError) => {\n if (error instanceof ComplexityLimitExceededError) {\n return handleComplexityError(error)\n }\n return Effect.fail(error)\n }),\n Effect.catchAllCause(errorHandler)\n )\n\n // Build router\n let router = HttpRouter.empty.pipe(\n HttpRouter.post(resolvedConfig.path as HttpRouter.PathInput, graphqlHandler)\n )\n\n if (resolvedConfig.graphiql) {\n const { path, endpoint, subscriptionEndpoint } = resolvedConfig.graphiql\n router = router.pipe(\n HttpRouter.get(\n path as HttpRouter.PathInput,\n HttpServerResponse.html(graphiqlHtml(endpoint, subscriptionEndpoint))\n )\n )\n }\n\n return router\n}\n","import { Layer } from \"effect\"\nimport { HttpRouter } from \"@effect/platform\"\nimport { GraphQLSchemaBuilder } from \"../builder/schema-builder\"\nimport { makeGraphQLRouter, type MakeGraphQLRouterOptions } from \"./router\"\n\n/**\n * Convert a GraphQLSchemaBuilder to an HttpRouter.\n *\n * This bridges the GraphQL schema builder with the @effect/platform HTTP server.\n * Field complexities and cache hints are automatically extracted from the builder.\n *\n * @param builder - The GraphQL schema builder\n * @param layer - Effect layer providing services required by resolvers\n * @param options - Optional configuration for paths, GraphiQL, complexity, and caching\n * @returns An HttpRouter that can be composed with other routes\n *\n * @example\n * ```typescript\n * import { GraphQLSchemaBuilder, query, toRouter } from \"@effect-gql/core\"\n * import { Layer, Effect } from \"effect\"\n * import * as S from \"effect/Schema\"\n *\n * const builder = GraphQLSchemaBuilder.empty.pipe(\n * query(\"hello\", { type: S.String, resolve: () => Effect.succeed(\"world\") })\n * )\n *\n * // Basic usage\n * const router = toRouter(builder, Layer.empty, { graphiql: true })\n *\n * // With complexity limiting\n * const routerWithLimits = toRouter(builder, Layer.empty, {\n * graphiql: true,\n * complexity: { maxDepth: 10, maxComplexity: 1000 }\n * })\n *\n * // With cache control\n * const routerWithCaching = toRouter(builder, Layer.empty, {\n * cacheControl: { enabled: true, defaultMaxAge: 0 }\n * })\n * ```\n */\nexport const toRouter = <R, R2>(\n builder: GraphQLSchemaBuilder<R>,\n layer: Layer.Layer<R2>,\n options?: Omit<MakeGraphQLRouterOptions, \"fieldComplexities\" | \"cacheHints\">\n): HttpRouter.HttpRouter<never, never> => {\n const schema = builder.buildSchema()\n const fieldComplexities = builder.getFieldComplexities()\n const cacheHints = builder.getCacheHints()\n return makeGraphQLRouter(schema, layer, { ...options, fieldComplexities, cacheHints })\n}\n","import { Data, Effect, Runtime, Stream } from \"effect\"\nimport type { ComplexityConfig, FieldComplexityMap } from \"./complexity\"\n\n/**\n * Error type for WebSocket operations\n */\nexport class WebSocketError extends Data.TaggedError(\"WebSocketError\")<{\n readonly cause: unknown\n}> {}\n\n/**\n * WebSocket close event information\n */\nexport interface CloseEvent {\n readonly code: number\n readonly reason: string\n}\n\n/**\n * Platform-neutral WebSocket interface using Effect types.\n *\n * This interface abstracts WebSocket operations across different platforms\n * (Node.js ws, Bun built-in, browser WebSocket). Platform packages implement\n * this interface to bridge their specific WebSocket implementations.\n */\nexport interface EffectWebSocket {\n /**\n * Send a message to the client.\n * Returns an Effect that completes when the message is sent.\n */\n readonly send: (data: string) => Effect.Effect<void, WebSocketError>\n\n /**\n * Close the WebSocket connection.\n * @param code - Optional close code (default: 1000)\n * @param reason - Optional close reason\n */\n readonly close: (code?: number, reason?: string) => Effect.Effect<void, WebSocketError>\n\n /**\n * Stream of incoming messages from the client.\n * The stream completes when the connection closes.\n */\n readonly messages: Stream.Stream<string, WebSocketError>\n\n /**\n * Effect that completes with CloseEvent when the connection closes.\n * Use this to detect client disconnection.\n */\n readonly closed: Effect.Effect<CloseEvent, WebSocketError>\n\n /**\n * The WebSocket subprotocol negotiated during handshake.\n * For GraphQL subscriptions, this should be \"graphql-transport-ws\".\n */\n readonly protocol: string\n}\n\n/**\n * Context available during a WebSocket connection.\n * This is passed to lifecycle hooks.\n */\nexport interface ConnectionContext<R> {\n /**\n * The Effect runtime for this connection.\n * Use this to run Effects within the connection scope.\n */\n readonly runtime: Runtime.Runtime<R>\n\n /**\n * Connection parameters sent by the client during CONNECTION_INIT.\n * Often used for authentication tokens.\n */\n readonly connectionParams: Record<string, unknown>\n\n /**\n * The underlying WebSocket for this connection.\n */\n readonly socket: EffectWebSocket\n}\n\n/**\n * Options for configuring the GraphQL WebSocket handler.\n *\n * @template R - Service requirements for lifecycle hooks\n */\nexport interface GraphQLWSOptions<R> {\n /**\n * Query complexity limiting configuration.\n * When provided, subscriptions are validated against complexity limits\n * before execution begins.\n */\n readonly complexity?: ComplexityConfig\n\n /**\n * Field complexity definitions from the schema builder.\n * If using the platform serve() functions with subscriptions config,\n * this is typically passed automatically.\n */\n readonly fieldComplexities?: FieldComplexityMap\n\n /**\n * Called when a client initiates a connection (CONNECTION_INIT message).\n *\n * Use this for authentication. Return:\n * - `true` to accept the connection\n * - `false` to reject the connection\n * - An object to accept and provide additional context\n *\n * The returned object (or true) is merged into the GraphQL context.\n *\n * @example\n * ```typescript\n * onConnect: (params) => Effect.gen(function* () {\n * const token = params.authToken as string\n * const user = yield* AuthService.validateToken(token)\n * return { user } // Available in GraphQL context\n * })\n * ```\n */\n readonly onConnect?: (\n params: Record<string, unknown>\n ) => Effect.Effect<boolean | Record<string, unknown>, unknown, R>\n\n /**\n * Called when a client disconnects.\n * Use this for cleanup (e.g., removing user from active connections).\n */\n readonly onDisconnect?: (ctx: ConnectionContext<R>) => Effect.Effect<void, never, R>\n\n /**\n * Called when a client starts a subscription (SUBSCRIBE message).\n * Use this for per-subscription authorization or logging.\n *\n * Note: If complexity validation is enabled, it runs before this hook.\n * Throw an error to reject the subscription.\n */\n readonly onSubscribe?: (\n ctx: ConnectionContext<R>,\n message: SubscribeMessage\n ) => Effect.Effect<void, unknown, R>\n\n /**\n * Called when a subscription completes or is stopped.\n */\n readonly onComplete?: (\n ctx: ConnectionContext<R>,\n message: CompleteMessage\n ) => Effect.Effect<void, never, R>\n\n /**\n * Called when an error occurs during subscription execution.\n */\n readonly onError?: (ctx: ConnectionContext<R>, error: unknown) => Effect.Effect<void, never, R>\n}\n\n/**\n * GraphQL WebSocket SUBSCRIBE message payload\n */\nexport interface SubscribeMessage {\n readonly id: string\n readonly payload: {\n readonly query: string\n readonly variables?: Record<string, unknown>\n readonly operationName?: string\n readonly extensions?: Record<string, unknown>\n }\n}\n\n/**\n * GraphQL WebSocket COMPLETE message payload\n */\nexport interface CompleteMessage {\n readonly id: string\n}\n\n/**\n * Configuration for the WebSocket endpoint\n */\nexport interface GraphQLWSConfig {\n /**\n * Path for WebSocket connections.\n * @default \"/graphql\"\n */\n readonly path?: string\n\n /**\n * How long to wait for CONNECTION_INIT message before closing.\n * @default 5000 (5 seconds)\n */\n readonly connectionInitWaitTimeout?: number\n}\n","import { Effect, Layer, Runtime, Stream, Queue, Fiber, Deferred } from \"effect\"\nimport { GraphQLSchema, subscribe, GraphQLError } from \"graphql\"\nimport type { ServerOptions } from \"graphql-ws\"\nimport type { GraphQLEffectContext } from \"../builder/types\"\nimport type {\n EffectWebSocket,\n GraphQLWSOptions,\n ConnectionContext,\n CloseEvent,\n WebSocketError,\n} from \"./ws-types\"\nimport { validateComplexity, type FieldComplexityMap } from \"./complexity\"\n\n/**\n * Extra context passed through graphql-ws.\n * This is the `extra` field in graphql-ws Context.\n */\ninterface WSExtra<R> {\n socket: EffectWebSocket\n runtime: Runtime.Runtime<R>\n connectionParams: Record<string, unknown>\n}\n\n/**\n * Create a ConnectionContext from WSExtra for use in lifecycle hooks.\n */\nconst createConnectionContext = <R>(extra: WSExtra<R>): ConnectionContext<R> => ({\n runtime: extra.runtime,\n connectionParams: extra.connectionParams,\n socket: extra.socket,\n})\n\n/**\n * Create the onConnect handler for graphql-ws.\n */\nconst makeOnConnectHandler = <R>(\n options: GraphQLWSOptions<R> | undefined\n): ServerOptions<Record<string, unknown>, WSExtra<R>>[\"onConnect\"] => {\n if (!options?.onConnect) return undefined\n\n return async (ctx) => {\n const extra = ctx.extra as WSExtra<R>\n try {\n const result = await Runtime.runPromise(extra.runtime)(\n options.onConnect!(ctx.connectionParams ?? {})\n )\n if (typeof result === \"object\" && result !== null) {\n Object.assign(extra.connectionParams, result)\n }\n return result !== false\n } catch {\n return false\n }\n }\n}\n\n/**\n * Create the onDisconnect handler for graphql-ws.\n */\nconst makeOnDisconnectHandler = <R>(\n options: GraphQLWSOptions<R> | undefined\n): ServerOptions<Record<string, unknown>, WSExtra<R>>[\"onDisconnect\"] => {\n if (!options?.onDisconnect) return undefined\n\n return async (ctx) => {\n const extra = ctx.extra as WSExtra<R>\n await Runtime.runPromise(extra.runtime)(\n options.onDisconnect!(createConnectionContext(extra))\n ).catch(() => {\n // Ignore cleanup errors\n })\n }\n}\n\n/**\n * Create the onSubscribe handler for graphql-ws with complexity validation.\n */\nconst makeOnSubscribeHandler = <R>(\n options: GraphQLWSOptions<R> | undefined,\n schema: GraphQLSchema,\n complexityConfig: GraphQLWSOptions<R>[\"complexity\"],\n fieldComplexities: FieldComplexityMap\n): ServerOptions<Record<string, unknown>, WSExtra<R>>[\"onSubscribe\"] => {\n // graphql-ws 6.0: signature changed from (ctx, msg) to (ctx, id, payload)\n return async (ctx, id, payload) => {\n const extra = ctx.extra as WSExtra<R>\n const connectionCtx = createConnectionContext(extra)\n\n // Validate complexity if configured\n if (complexityConfig) {\n const validationEffect = validateComplexity(\n payload.query,\n payload.operationName ?? undefined,\n payload.variables ?? undefined,\n schema,\n fieldComplexities,\n complexityConfig\n ).pipe(\n Effect.catchAll((error) => {\n if (error._tag === \"ComplexityLimitExceededError\") {\n throw new GraphQLError(error.message, {\n extensions: {\n code: \"COMPLEXITY_LIMIT_EXCEEDED\",\n limitType: error.limitType,\n limit: error.limit,\n actual: error.actual,\n },\n })\n }\n return Effect.logWarning(\"Complexity analysis failed for subscription\", error)\n })\n )\n\n await Effect.runPromise(validationEffect)\n }\n\n // Call user's onSubscribe hook if provided\n if (options?.onSubscribe) {\n await Runtime.runPromise(extra.runtime)(\n options.onSubscribe(connectionCtx, {\n id,\n payload: {\n query: payload.query,\n variables: payload.variables ?? undefined,\n operationName: payload.operationName ?? undefined,\n extensions: payload.extensions ?? undefined,\n },\n })\n )\n }\n }\n}\n\n/**\n * Create the onComplete handler for graphql-ws.\n */\nconst makeOnCompleteHandler = <R>(\n options: GraphQLWSOptions<R> | undefined\n): ServerOptions<Record<string, unknown>, WSExtra<R>>[\"onComplete\"] => {\n if (!options?.onComplete) return undefined\n\n // graphql-ws 6.0: signature changed from (ctx, msg) to (ctx, id, payload)\n return async (ctx, id, _payload) => {\n const extra = ctx.extra as WSExtra<R>\n await Runtime.runPromise(extra.runtime)(\n options.onComplete!(createConnectionContext(extra), { id })\n ).catch(() => {\n // Ignore cleanup errors\n })\n }\n}\n\n/**\n * Create the onError handler for graphql-ws.\n */\nconst makeOnErrorHandler = <R>(\n options: GraphQLWSOptions<R> | undefined\n): ServerOptions<Record<string, unknown>, WSExtra<R>>[\"onError\"] => {\n if (!options?.onError) return undefined\n\n // graphql-ws 6.0: signature changed from (ctx, msg, errors) to (ctx, id, payload, errors)\n return async (ctx, _id, _payload, errors) => {\n const extra = ctx.extra as WSExtra<R>\n await Runtime.runPromise(extra.runtime)(\n options.onError!(createConnectionContext(extra), errors)\n ).catch(() => {\n // Ignore error handler errors\n })\n }\n}\n\n/**\n * Create a graphql-ws compatible socket adapter from an EffectWebSocket.\n */\nconst createGraphqlWsSocketAdapter = <R>(socket: EffectWebSocket, runtime: Runtime.Runtime<R>) => {\n let messageCallback: ((message: string) => Promise<void>) | null = null\n\n return {\n adapter: {\n protocol: socket.protocol,\n\n send: (data: string) =>\n Runtime.runPromise(runtime)(\n socket\n .send(data)\n .pipe(Effect.catchAll((error) => Effect.logError(\"WebSocket send error\", error)))\n ),\n\n close: (code?: number, reason?: string) => {\n Runtime.runPromise(runtime)(socket.close(code, reason)).catch(() => {\n // Ignore close errors\n })\n },\n\n onMessage: (cb: (message: string) => Promise<void>) => {\n messageCallback = cb\n },\n\n onPong: (_payload: Record<string, unknown> | undefined) => {\n // Pong handling - can be used for keepalive\n },\n },\n dispatchMessage: async (message: string) => {\n if (messageCallback) {\n await messageCallback(message)\n }\n },\n }\n}\n\n/**\n * Type alias for the graphql-ws server instance.\n */\ntype GraphQLWSServer<R> = ReturnType<\n typeof import(\"graphql-ws\").makeServer<Record<string, unknown>, WSExtra<R>>\n>\n\n/**\n * Run the connection lifecycle - manages message queue, fibers, and cleanup.\n */\nconst runConnectionLifecycle = <R>(\n socket: EffectWebSocket,\n wsServer: GraphQLWSServer<R>,\n extra: WSExtra<R>\n): Effect.Effect<void, never, never> =>\n Effect.gen(function* () {\n // Create message queue for bridging Stream to callback\n const messageQueue = yield* Queue.unbounded<string>()\n const closedDeferred = yield* Deferred.make<CloseEvent, WebSocketError>()\n\n // Fork fiber to consume socket messages and push to queue\n const messageFiber = yield* Effect.fork(\n Stream.runForEach(socket.messages, (msg) => Queue.offer(messageQueue, msg)).pipe(\n Effect.catchAll((error) => Deferred.fail(closedDeferred, error))\n )\n )\n\n // Fork fiber to handle socket close\n const closeFiber = yield* Effect.fork(\n socket.closed.pipe(\n Effect.tap((event) => Deferred.succeed(closedDeferred, event)),\n Effect.catchAll((error) => Deferred.fail(closedDeferred, error))\n )\n )\n\n // Create the graphql-ws socket adapter\n const { adapter, dispatchMessage } = createGraphqlWsSocketAdapter(socket, extra.runtime)\n\n // Open the connection with graphql-ws\n const closedHandler = wsServer.opened(adapter, extra)\n\n // Fork fiber to process messages from queue\n const processMessagesFiber = yield* Effect.fork(\n Effect.gen(function* () {\n while (true) {\n const message = yield* Queue.take(messageQueue)\n yield* Effect.tryPromise({\n try: () => dispatchMessage(message),\n catch: (error) => error,\n }).pipe(Effect.catchAll(() => Effect.void))\n }\n })\n )\n\n // Wait for connection to close\n yield* Deferred.await(closedDeferred).pipe(\n Effect.catchAll(() => Effect.succeed({ code: 1000, reason: \"Error\" }))\n )\n\n // Cleanup\n closedHandler(1000, \"Connection closed\")\n yield* Fiber.interrupt(messageFiber)\n yield* Fiber.interrupt(closeFiber)\n yield* Fiber.interrupt(processMessagesFiber)\n yield* Queue.shutdown(messageQueue)\n }).pipe(\n Effect.catchAllCause(() => Effect.void),\n Effect.scoped\n )\n\n/**\n * Dynamically import graphql-ws to avoid requiring it at module load time.\n * This allows @effect-gql/core to be used without graphql-ws installed\n * as long as WebSocket functionality isn't used.\n */\nconst importGraphqlWs = Effect.tryPromise({\n try: () => import(\"graphql-ws\"),\n catch: () =>\n new Error(\n \"graphql-ws is required for WebSocket subscriptions. Install it with: npm install graphql-ws\"\n ),\n})\n\n/**\n * Create a WebSocket handler for GraphQL subscriptions using the graphql-ws protocol.\n *\n * This function creates a handler that can be used with any WebSocket implementation\n * that conforms to the EffectWebSocket interface. Platform packages (node, bun, express)\n * provide adapters that convert their native WebSocket to EffectWebSocket.\n *\n * The handler:\n * - Uses the graphql-ws protocol for client communication\n * - Creates an Effect runtime from the provided layer for each connection\n * - Executes subscriptions using GraphQL's subscribe() function\n * - Properly cleans up resources when connections close\n *\n * @param schema - The GraphQL schema with subscription definitions\n * @param layer - Effect layer providing services required by resolvers\n * @param options - Optional lifecycle hooks for connection/subscription events\n * @returns A function that handles individual WebSocket connections\n *\n * @example\n * ```typescript\n * import { makeGraphQLWSHandler } from \"@effect-gql/core\"\n *\n * const handler = makeGraphQLWSHandler(schema, serviceLayer, {\n * onConnect: (params) => Effect.gen(function* () {\n * const user = yield* AuthService.validateToken(params.authToken)\n * return { user }\n * }),\n * })\n *\n * // In platform-specific code:\n * const effectSocket = toEffectWebSocket(rawWebSocket)\n * await Effect.runPromise(handler(effectSocket))\n * ```\n */\nexport const makeGraphQLWSHandler = <R>(\n schema: GraphQLSchema,\n layer: Layer.Layer<R>,\n options?: GraphQLWSOptions<R>\n): ((socket: EffectWebSocket) => Effect.Effect<void, never, never>) => {\n const complexityConfig = options?.complexity\n const fieldComplexities: FieldComplexityMap = options?.fieldComplexities ?? new Map()\n\n // Lazily create the server on first connection\n let wsServerPromise: Promise<GraphQLWSServer<R>> | null = null\n\n const getOrCreateServer = async () => {\n if (!wsServerPromise) {\n wsServerPromise = Effect.runPromise(importGraphqlWs).then(({ makeServer }) => {\n // Build server options using extracted handler factories\n const serverOptions: ServerOptions<Record<string, unknown>, WSExtra<R>> = {\n schema,\n\n context: async (ctx): Promise<GraphQLEffectContext<R> & Record<string, unknown>> => {\n const extra = ctx.extra as WSExtra<R>\n return {\n runtime: extra.runtime,\n ...extra.connectionParams,\n }\n },\n\n subscribe: async (args) => subscribe(args),\n\n onConnect: makeOnConnectHandler(options),\n onDisconnect: makeOnDisconnectHandler(options),\n onSubscribe: makeOnSubscribeHandler(options, schema, complexityConfig, fieldComplexities),\n onComplete: makeOnCompleteHandler(options),\n onError: makeOnErrorHandler(options),\n }\n\n return makeServer(serverOptions)\n })\n }\n return wsServerPromise\n }\n\n // Return the connection handler\n return (socket: EffectWebSocket): Effect.Effect<void, never, never> =>\n Effect.gen(function* () {\n const wsServer = yield* Effect.tryPromise({\n try: () => getOrCreateServer(),\n catch: (error) => error as Error,\n })\n\n const runtime = yield* Effect.provide(Effect.runtime<R>(), layer)\n\n const extra: WSExtra<R> = {\n socket,\n runtime,\n connectionParams: {},\n }\n\n yield* runConnectionLifecycle(socket, wsServer, extra)\n }).pipe(\n Effect.catchAllCause(() => Effect.void),\n Effect.scoped\n )\n}\n","import { Effect, Stream, Queue, Deferred } from \"effect\"\nimport type { EffectWebSocket, CloseEvent } from \"./ws-types\"\nimport { WebSocketError } from \"./ws-types\"\n\n/**\n * Interface for the 'ws' library WebSocket.\n * This allows type-safe usage without requiring core to depend on 'ws'.\n */\nexport interface WsWebSocket {\n readonly protocol: string\n readonly readyState: number\n send(data: string, callback?: (error?: Error) => void): void\n close(code?: number, reason?: string): void\n on(event: \"message\", listener: (data: Buffer | string) => void): void\n on(event: \"error\", listener: (error: Error) => void): void\n on(event: \"close\", listener: (code: number, reason: Buffer) => void): void\n removeListener(event: string, listener: (...args: any[]) => void): void\n}\n\n/** WebSocket.CLOSED constant from 'ws' library */\nexport const WS_CLOSED = 3\n\n/**\n * Convert a WebSocket from the 'ws' library to an EffectWebSocket.\n *\n * This creates an Effect-based wrapper around the ws WebSocket instance,\n * providing a Stream for incoming messages and Effect-based send/close operations.\n *\n * This utility is used by platform packages (node, express) that integrate\n * with the 'ws' library for WebSocket support.\n *\n * @param ws - The WebSocket instance from the 'ws' library\n * @returns An EffectWebSocket that can be used with makeGraphQLWSHandler\n *\n * @example\n * ```typescript\n * import { toEffectWebSocketFromWs } from \"@effect-gql/core\"\n * import { WebSocket } from \"ws\"\n *\n * wss.on(\"connection\", (ws: WebSocket) => {\n * const effectSocket = toEffectWebSocketFromWs(ws)\n * Effect.runPromise(handler(effectSocket))\n * })\n * ```\n */\nexport const toEffectWebSocketFromWs = (ws: WsWebSocket): EffectWebSocket => {\n // Create the message stream using a queue\n const messagesEffect = Effect.gen(function* () {\n const queue = yield* Queue.unbounded<string>()\n const closed = yield* Deferred.make<CloseEvent, WebSocketError>()\n\n // Set up message listener\n ws.on(\"message\", (data) => {\n const message = data.toString()\n Effect.runPromise(Queue.offer(queue, message)).catch(() => {\n // Queue might be shutdown\n })\n })\n\n // Set up error listener\n ws.on(\"error\", (error) => {\n Effect.runPromise(Deferred.fail(closed, new WebSocketError({ cause: error }))).catch(() => {\n // Already completed\n })\n })\n\n // Set up close listener\n ws.on(\"close\", (code, reason) => {\n Effect.runPromise(\n Queue.shutdown(queue).pipe(\n Effect.andThen(Deferred.succeed(closed, { code, reason: reason.toString() }))\n )\n ).catch(() => {\n // Already completed\n })\n })\n\n return { queue, closed }\n })\n\n // Create the message stream\n const messages: Stream.Stream<string, WebSocketError> = Stream.unwrap(\n messagesEffect.pipe(\n Effect.map(({ queue }) => Stream.fromQueue(queue).pipe(Stream.catchAll(() => Stream.empty)))\n )\n )\n\n return {\n protocol: ws.protocol || \"graphql-transport-ws\",\n\n send: (data: string) =>\n Effect.async<void, WebSocketError>((resume) => {\n ws.send(data, (error) => {\n if (error) {\n resume(Effect.fail(new WebSocketError({ cause: error })))\n } else {\n resume(Effect.succeed(undefined))\n }\n })\n }),\n\n close: (code?: number, reason?: string) =>\n Effect.sync(() => {\n ws.close(code ?? 1000, reason ?? \"\")\n }),\n\n messages,\n\n closed: Effect.async<CloseEvent, WebSocketError>((resume) => {\n if (ws.readyState === WS_CLOSED) {\n resume(Effect.succeed({ code: 1000, reason: \"\" }))\n return\n }\n\n const onClose = (code: number, reason: Buffer) => {\n cleanup()\n resume(Effect.succeed({ code, reason: reason.toString() }))\n }\n\n const onError = (error: Error) => {\n cleanup()\n resume(Effect.fail(new WebSocketError({ cause: error })))\n }\n\n const cleanup = () => {\n ws.removeListener(\"close\", onClose)\n ws.removeListener(\"error\", onError)\n }\n\n ws.on(\"close\", onClose)\n ws.on(\"error\", onError)\n\n return Effect.sync(cleanup)\n }),\n }\n}\n","import { Data, Effect, Runtime, Stream } from \"effect\"\nimport type { ExecutionResult } from \"graphql\"\nimport type { ComplexityConfig, FieldComplexityMap } from \"./complexity\"\n\n/**\n * Standard SSE response headers following the graphql-sse protocol.\n * Use these headers when writing SSE responses in platform adapters.\n */\nexport const SSE_HEADERS: Record<string, string> = {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"X-Accel-Buffering\": \"no\", // Disable nginx buffering\n} as const\n\n/**\n * Error type for SSE operations\n */\nexport class SSEError extends Data.TaggedError(\"SSEError\")<{\n readonly cause: unknown\n}> {}\n\n/**\n * SSE event types following the graphql-sse protocol (distinct connections mode).\n * @see https://github.com/enisdenjo/graphql-sse/blob/master/PROTOCOL.md\n */\nexport type SSEEventType = \"next\" | \"error\" | \"complete\"\n\n/**\n * An SSE event to be sent to the client.\n */\nexport interface SSEEvent {\n readonly event: SSEEventType\n readonly data: string\n}\n\n/**\n * Platform-neutral SSE response interface using Effect types.\n *\n * This interface abstracts SSE operations across different platforms\n * (Node.js, Bun, Deno, Workers). Platform packages implement this\n * interface to bridge their specific HTTP response implementations.\n *\n * Unlike WebSocket which is bidirectional, SSE is unidirectional\n * (server to client only). The subscription query is provided\n * upfront when creating the SSE connection.\n */\nexport interface EffectSSE {\n /**\n * Send an SSE event to the client.\n * The platform adapter formats this as proper SSE format:\n * ```\n * event: next\n * data: {\"data\":{\"field\":\"value\"}}\n *\n * ```\n */\n readonly sendEvent: (event: SSEEvent) => Effect.Effect<void, SSEError>\n\n /**\n * Effect that completes when the client disconnects.\n * Use this to detect client disconnection and cleanup.\n */\n readonly closed: Effect.Effect<void, SSEError>\n}\n\n/**\n * The GraphQL request payload for SSE subscriptions.\n * Same as a regular GraphQL HTTP request.\n */\nexport interface SSESubscriptionRequest {\n readonly query: string\n readonly variables?: Record<string, unknown>\n readonly operationName?: string\n readonly extensions?: Record<string, unknown>\n}\n\n/**\n * Context available during an SSE subscription.\n * This is passed to lifecycle hooks.\n */\nexport interface SSEConnectionContext<R> {\n /**\n * The Effect runtime for this connection.\n * Use this to run Effects within the connection scope.\n */\n readonly runtime: Runtime.Runtime<R>\n\n /**\n * The original subscription request.\n */\n readonly request: SSESubscriptionRequest\n\n /**\n * Optional authentication/authorization context.\n * Populated by the onConnect hook.\n */\n readonly connectionContext: Record<string, unknown>\n}\n\n/**\n * Options for configuring the GraphQL SSE handler.\n *\n * @template R - Service requirements for lifecycle hooks\n */\nexport interface GraphQLSSEOptions<R> {\n /**\n * Query complexity limiting configuration.\n * When provided, subscriptions are validated against complexity limits\n * before execution begins.\n */\n readonly complexity?: ComplexityConfig\n\n /**\n * Field complexity definitions from the schema builder.\n * If using the platform serve() functions, this is typically\n * passed automatically.\n */\n readonly fieldComplexities?: FieldComplexityMap\n\n /**\n * Called before a subscription starts.\n *\n * Use this for authentication/authorization. Return:\n * - A context object to accept the subscription\n * - Throw/fail to reject the subscription\n *\n * The returned object is available in the GraphQL context.\n *\n * @example\n * ```typescript\n * onConnect: (request, headers) => Effect.gen(function* () {\n * const token = headers.get(\"authorization\")\n * const user = yield* AuthService.validateToken(token)\n * return { user } // Available in GraphQL context\n * })\n * ```\n */\n readonly onConnect?: (\n request: SSESubscriptionRequest,\n headers: Headers\n ) => Effect.Effect<Record<string, unknown>, unknown, R>\n\n /**\n * Called when the subscription starts streaming.\n */\n readonly onSubscribe?: (ctx: SSEConnectionContext<R>) => Effect.Effect<void, never, R>\n\n /**\n * Called when the subscription completes (normally or due to error).\n */\n readonly onComplete?: (ctx: SSEConnectionContext<R>) => Effect.Effect<void, never, R>\n\n /**\n * Called when the client disconnects.\n */\n readonly onDisconnect?: (ctx: SSEConnectionContext<R>) => Effect.Effect<void, never, R>\n\n /**\n * Called when an error occurs during subscription execution.\n */\n readonly onError?: (ctx: SSEConnectionContext<R>, error: unknown) => Effect.Effect<void, never, R>\n}\n\n/**\n * Configuration for the SSE endpoint\n */\nexport interface GraphQLSSEConfig {\n /**\n * Path for SSE connections.\n * @default \"/graphql/stream\"\n */\n readonly path?: string\n}\n\n/**\n * Result of SSE subscription handler creation.\n * This is used by platform packages to implement their SSE response.\n */\nexport interface SSESubscriptionResult {\n /**\n * Stream of SSE events to send to the client.\n * The platform adapter should consume this stream and send events.\n */\n readonly events: Stream.Stream<SSEEvent, SSEError>\n\n /**\n * Effect that should be run when client disconnects.\n * This allows cleanup of resources.\n */\n readonly cleanup: Effect.Effect<void, never, never>\n}\n\n/**\n * Format an ExecutionResult as an SSE \"next\" event.\n */\nexport const formatNextEvent = (result: ExecutionResult): SSEEvent => ({\n event: \"next\",\n data: JSON.stringify(result),\n})\n\n/**\n * Format errors as an SSE \"error\" event.\n */\nexport const formatErrorEvent = (errors: readonly unknown[]): SSEEvent => ({\n event: \"error\",\n data: JSON.stringify({ errors }),\n})\n\n/**\n * Format a \"complete\" event.\n */\nexport const formatCompleteEvent = (): SSEEvent => ({\n event: \"complete\",\n data: \"\",\n})\n\n/**\n * Format an SSE event to the wire format.\n * Each event is formatted as:\n * ```\n * event: <type>\n * data: <json>\n *\n * ```\n */\nexport const formatSSEMessage = (event: SSEEvent): string => {\n const lines = [`event: ${event.event}`]\n if (event.data) {\n lines.push(`data: ${event.data}`)\n }\n lines.push(\"\", \"\") // Two newlines to end the event\n return lines.join(\"\\n\")\n}\n","import { Effect, Layer, Stream } from \"effect\"\nimport {\n GraphQLSchema,\n parse,\n validate,\n subscribe,\n GraphQLError,\n Kind,\n type ExecutionResult,\n type DocumentNode,\n type OperationDefinitionNode,\n} from \"graphql\"\nimport type { GraphQLEffectContext } from \"../builder/types\"\nimport {\n SSEError,\n type GraphQLSSEOptions,\n type SSEConnectionContext,\n type SSESubscriptionRequest,\n type SSEEvent,\n formatNextEvent,\n formatErrorEvent,\n formatCompleteEvent,\n} from \"./sse-types\"\nimport { validateComplexity, type FieldComplexityMap } from \"./complexity\"\n\n/**\n * Create a subscription event stream for SSE.\n *\n * This function handles the GraphQL subscription lifecycle:\n * 1. Parse and validate the query\n * 2. Check complexity limits if configured\n * 3. Execute the subscription\n * 4. Stream results as SSE events\n *\n * @param schema - The GraphQL schema with subscription definitions\n * @param layer - Effect layer providing services required by resolvers\n * @param request - The subscription request (query, variables, operationName)\n * @param headers - HTTP headers from the request (for auth)\n * @param options - Optional lifecycle hooks and configuration\n * @returns A Stream of SSE events to send to the client\n *\n * @example\n * ```typescript\n * const eventStream = makeSSESubscriptionStream(\n * schema,\n * serviceLayer,\n * { query: \"subscription { tick { count } }\" },\n * new Headers(),\n * { onConnect: (req, headers) => Effect.succeed({ user: \"alice\" }) }\n * )\n *\n * // In platform-specific code, consume and send events:\n * Stream.runForEach(eventStream, (event) =>\n * Effect.sync(() => res.write(formatSSEMessage(event)))\n * )\n * ```\n */\nexport const makeSSESubscriptionStream = <R>(\n schema: GraphQLSchema,\n layer: Layer.Layer<R>,\n request: SSESubscriptionRequest,\n headers: Headers,\n options?: GraphQLSSEOptions<R>\n): Stream.Stream<SSEEvent, SSEError> => {\n const complexityConfig = options?.complexity\n const fieldComplexities: FieldComplexityMap = options?.fieldComplexities ?? new Map()\n\n return Stream.unwrap(\n Effect.gen(function* () {\n // Create a runtime from the layer\n const runtime = yield* Effect.provide(Effect.runtime<R>(), layer)\n\n // Run onConnect hook if provided\n let connectionContext: Record<string, unknown> = {}\n if (options?.onConnect) {\n try {\n connectionContext = yield* Effect.provide(options.onConnect(request, headers), layer)\n } catch {\n // Connection rejected\n return Stream.make(\n formatErrorEvent([\n new GraphQLError(\"Subscription connection rejected\", {\n extensions: { code: \"CONNECTION_REJECTED\" },\n }),\n ]),\n formatCompleteEvent()\n )\n }\n }\n\n // Parse the query\n let document: DocumentNode\n try {\n document = parse(request.query)\n } catch (syntaxError) {\n return Stream.make(formatErrorEvent([syntaxError]), formatCompleteEvent())\n }\n\n // Validate the query\n const validationErrors = validate(schema, document)\n if (validationErrors.length > 0) {\n return Stream.make(formatErrorEvent(validationErrors), formatCompleteEvent())\n }\n\n // Find the subscription operation\n const operations = document.definitions.filter(\n (d): d is OperationDefinitionNode => d.kind === Kind.OPERATION_DEFINITION\n )\n\n const operation = request.operationName\n ? operations.find((o) => o.name?.value === request.operationName)\n : operations[0]\n\n if (!operation) {\n return Stream.make(\n formatErrorEvent([new GraphQLError(\"No operation found in query\")]),\n formatCompleteEvent()\n )\n }\n\n if (operation.operation !== \"subscription\") {\n return Stream.make(\n formatErrorEvent([\n new GraphQLError(\n `SSE endpoint only supports subscriptions, received: ${operation.operation}`,\n { extensions: { code: \"OPERATION_NOT_SUPPORTED\" } }\n ),\n ]),\n formatCompleteEvent()\n )\n }\n\n // Validate complexity if configured\n if (complexityConfig) {\n const complexityResult = yield* validateComplexity(\n request.query,\n request.operationName,\n request.variables,\n schema,\n fieldComplexities,\n complexityConfig\n ).pipe(\n Effect.map(() => null),\n Effect.catchAll((error) => {\n if (error._tag === \"ComplexityLimitExceededError\") {\n return Effect.succeed(\n new GraphQLError(error.message, {\n extensions: {\n code: \"COMPLEXITY_LIMIT_EXCEEDED\",\n limitType: error.limitType,\n limit: error.limit,\n actual: error.actual,\n },\n })\n )\n }\n // Log analysis errors but don't block (fail open)\n return Effect.logWarning(\"Complexity analysis failed for SSE subscription\", error).pipe(\n Effect.map(() => null)\n )\n })\n )\n\n if (complexityResult) {\n return Stream.make(formatErrorEvent([complexityResult]), formatCompleteEvent())\n }\n }\n\n // Build the context for the subscription\n const ctx: SSEConnectionContext<R> = {\n runtime,\n request,\n connectionContext,\n }\n\n // Call onSubscribe hook if provided\n if (options?.onSubscribe) {\n yield* Effect.provide(options.onSubscribe(ctx), layer).pipe(\n Effect.catchAll(() => Effect.void)\n )\n }\n\n // Execute the subscription\n const graphqlContext: GraphQLEffectContext<R> & Record<string, unknown> = {\n runtime,\n ...connectionContext,\n }\n\n const subscriptionResult = yield* Effect.tryPromise({\n try: () =>\n subscribe({\n schema,\n document,\n variableValues: request.variables,\n operationName: request.operationName ?? undefined,\n contextValue: graphqlContext,\n }),\n catch: (error) => new SSEError({ cause: error }),\n })\n\n // Check if subscribe returned an error result instead of async iterator\n if (!isAsyncIterable(subscriptionResult)) {\n // It's an ExecutionResult with errors\n const result = subscriptionResult as ExecutionResult\n if (result.errors) {\n return Stream.make(formatErrorEvent(result.errors), formatCompleteEvent())\n }\n // Shouldn't happen, but handle gracefully\n return Stream.make(formatNextEvent(result), formatCompleteEvent())\n }\n\n // Create a stream from the async iterator\n const asyncIterator = subscriptionResult[Symbol.asyncIterator]()\n\n const eventStream = Stream.async<SSEEvent, SSEError>((emit) => {\n let done = false\n\n const iterate = async () => {\n try {\n while (!done) {\n const result = await asyncIterator.next()\n if (result.done) {\n emit.end()\n break\n }\n emit.single(formatNextEvent(result.value))\n }\n } catch (error) {\n if (!done) {\n emit.single(\n formatErrorEvent([\n error instanceof GraphQLError\n ? error\n : new GraphQLError(\n error instanceof Error ? error.message : \"Subscription error\",\n { extensions: { code: \"SUBSCRIPTION_ERROR\" } }\n ),\n ])\n )\n emit.end()\n }\n }\n }\n\n iterate()\n\n // Return cleanup function\n return Effect.sync(() => {\n done = true\n asyncIterator.return?.()\n })\n })\n\n // Add complete event at the end and handle cleanup\n return eventStream.pipe(\n Stream.onDone(() =>\n Effect.gen(function* () {\n yield* Effect.sync(() => {})\n }).pipe(Effect.asVoid)\n ),\n Stream.concat(Stream.make(formatCompleteEvent())),\n Stream.onDone(() => {\n if (options?.onComplete) {\n return Effect.provide(options.onComplete(ctx), layer).pipe(\n Effect.catchAll(() => Effect.void)\n )\n }\n return Effect.void\n })\n )\n }).pipe(\n Effect.catchAll((error) =>\n Effect.succeed(\n Stream.make(\n formatErrorEvent([\n new GraphQLError(error instanceof Error ? error.message : \"Internal error\", {\n extensions: { code: \"INTERNAL_ERROR\" },\n }),\n ]),\n formatCompleteEvent()\n )\n )\n )\n )\n )\n}\n\n/**\n * Create an SSE subscription handler that can be used with platform-specific servers.\n *\n * This is a higher-level API that returns a handler function. The handler\n * takes a request and headers, and returns a Stream of SSE events.\n *\n * @param schema - The GraphQL schema with subscription definitions\n * @param layer - Effect layer providing services required by resolvers\n * @param options - Optional lifecycle hooks and configuration\n * @returns A handler function for SSE subscription requests\n *\n * @example\n * ```typescript\n * const handler = makeGraphQLSSEHandler(schema, serviceLayer, {\n * onConnect: (request, headers) => Effect.gen(function* () {\n * const token = headers.get(\"authorization\")\n * const user = yield* AuthService.validateToken(token)\n * return { user }\n * }),\n * })\n *\n * // In platform-specific code:\n * const events = handler(request, headers)\n * // Stream events to client...\n * ```\n */\nexport const makeGraphQLSSEHandler = <R>(\n schema: GraphQLSchema,\n layer: Layer.Layer<R>,\n options?: GraphQLSSEOptions<R>\n): ((request: SSESubscriptionRequest, headers: Headers) => Stream.Stream<SSEEvent, SSEError>) => {\n return (request, headers) => makeSSESubscriptionStream(schema, layer, request, headers, options)\n}\n\n/**\n * Type guard to check if a value is an AsyncIterable (subscription result)\n */\nfunction isAsyncIterable<T>(value: unknown): value is AsyncIterable<T> {\n return typeof value === \"object\" && value !== null && Symbol.asyncIterator in value\n}\n","import { Effect } from \"effect\"\nimport { Kind, type OperationDefinitionNode } from \"graphql\"\nimport type { GraphQLExtension, ExecutionArgs } from \"./extensions\"\nimport { ExtensionsService } from \"./extensions\"\nimport {\n defaultComplexityCalculator,\n type ComplexityResult,\n type FieldComplexityMap,\n} from \"./server/complexity\"\n\n/**\n * Configuration for the analyzer extension\n */\nexport interface AnalyzerExtensionConfig {\n /**\n * Include the total complexity score in the response.\n * @default true\n */\n readonly includeComplexity?: boolean\n\n /**\n * Include the maximum query depth in the response.\n * @default true\n */\n readonly includeDepth?: boolean\n\n /**\n * Include the total field count in the response.\n * @default false\n */\n readonly includeFieldCount?: boolean\n\n /**\n * Include the alias count in the response.\n * @default false\n */\n readonly includeAliasCount?: boolean\n\n /**\n * The key to use in the response extensions object.\n * @default \"analyzer\"\n */\n readonly key?: string\n\n /**\n * Thresholds for logging warnings when exceeded.\n * When a metric exceeds its threshold, a warning is logged.\n */\n readonly thresholds?: {\n readonly depth?: number\n readonly complexity?: number\n readonly fieldCount?: number\n readonly aliasCount?: number\n }\n\n /**\n * Default complexity cost for fields without explicit costs.\n * @default 1\n */\n readonly defaultFieldComplexity?: number\n\n /**\n * Optional field complexity overrides.\n * If not provided, uses the field complexities from the schema builder\n * (passed via ExecutionArgs).\n */\n readonly fieldComplexities?: FieldComplexityMap\n}\n\n/**\n * Output format for analyzer extension\n */\nexport interface AnalyzerOutput {\n complexity?: number\n depth?: number\n fieldCount?: number\n aliasCount?: number\n}\n\n/**\n * Create an analyzer extension that reports query complexity metrics\n * in the response extensions field.\n *\n * Similar to async-graphql's Analyzer extension, this allows you to\n * monitor the complexity of incoming queries without blocking execution.\n *\n * @example\n * ```typescript\n * // Basic usage - reports complexity and depth\n * const analyzer = createAnalyzerExtension()\n *\n * // With all metrics and warnings\n * const analyzer = createAnalyzerExtension({\n * includeFieldCount: true,\n * includeAliasCount: true,\n * thresholds: {\n * depth: 10,\n * complexity: 100,\n * },\n * })\n *\n * // Add to schema builder\n * const builder = GraphQLSchemaBuilder.empty.pipe(\n * extension(analyzer),\n * // ...queries, mutations, etc.\n * )\n *\n * // Response will include:\n * // {\n * // \"data\": { ... },\n * // \"extensions\": {\n * // \"analyzer\": {\n * // \"complexity\": 42,\n * // \"depth\": 3\n * // }\n * // }\n * // }\n * ```\n */\nexport const createAnalyzerExtension = (\n config: AnalyzerExtensionConfig = {}\n): GraphQLExtension<ExtensionsService> => {\n const {\n includeComplexity = true,\n includeDepth = true,\n includeFieldCount = false,\n includeAliasCount = false,\n key = \"analyzer\",\n thresholds,\n defaultFieldComplexity = 1,\n fieldComplexities: configFieldComplexities,\n } = config\n\n return {\n name: \"analyzer\",\n description: \"Reports query complexity metrics in response extensions\",\n\n onExecuteStart: (args: ExecutionArgs) =>\n Effect.gen(function* () {\n const ext = yield* ExtensionsService\n\n // Find the operation\n const operation = findOperation(args)\n if (!operation) {\n return\n }\n\n // Use config field complexities if provided, otherwise use from args\n const fieldComplexities = configFieldComplexities ?? args.fieldComplexities\n\n // Calculate complexity\n const calculator = defaultComplexityCalculator(defaultFieldComplexity)\n const result = yield* calculator({\n document: args.document,\n operation,\n variables: args.variableValues,\n schema: args.schema,\n fieldComplexities,\n }).pipe(\n Effect.catchAll((error) =>\n Effect.logWarning(\"Analyzer extension: complexity calculation failed\", error).pipe(\n Effect.as(null)\n )\n )\n )\n\n if (!result) {\n return\n }\n\n // Check thresholds and log warnings\n yield* checkThresholds(result, thresholds)\n\n // Build output\n const output: AnalyzerOutput = {}\n if (includeComplexity) {\n output.complexity = result.complexity\n }\n if (includeDepth) {\n output.depth = result.depth\n }\n if (includeFieldCount) {\n output.fieldCount = result.fieldCount\n }\n if (includeAliasCount) {\n output.aliasCount = result.aliasCount\n }\n\n // Add to extensions\n yield* ext.set(key, output)\n }),\n }\n}\n\n/**\n * Find the operation to analyze from the document\n */\nfunction findOperation(args: ExecutionArgs): OperationDefinitionNode | null {\n const operations = args.document.definitions.filter(\n (d): d is OperationDefinitionNode => d.kind === Kind.OPERATION_DEFINITION\n )\n\n if (operations.length === 0) {\n return null\n }\n\n if (args.operationName) {\n return operations.find((o) => o.name?.value === args.operationName) ?? null\n }\n\n return operations[0]\n}\n\n/**\n * Check thresholds and log warnings for exceeded values\n */\nfunction checkThresholds(\n result: ComplexityResult,\n thresholds?: AnalyzerExtensionConfig[\"thresholds\"]\n): Effect.Effect<void> {\n if (!thresholds) {\n return Effect.void\n }\n\n const warnings: string[] = []\n\n if (thresholds.depth !== undefined && result.depth > thresholds.depth) {\n warnings.push(`Query depth ${result.depth} exceeds threshold ${thresholds.depth}`)\n }\n if (thresholds.complexity !== undefined && result.complexity > thresholds.complexity) {\n warnings.push(\n `Query complexity ${result.complexity} exceeds threshold ${thresholds.complexity}`\n )\n }\n if (thresholds.fieldCount !== undefined && result.fieldCount > thresholds.fieldCount) {\n warnings.push(\n `Query field count ${result.fieldCount} exceeds threshold ${thresholds.fieldCount}`\n )\n }\n if (thresholds.aliasCount !== undefined && result.aliasCount > thresholds.aliasCount) {\n warnings.push(\n `Query alias count ${result.aliasCount} exceeds threshold ${thresholds.aliasCount}`\n )\n }\n\n if (warnings.length > 0) {\n return Effect.logWarning(\"Analyzer extension: thresholds exceeded\", {\n warnings,\n result,\n })\n }\n\n return Effect.void\n}\n"]}
|