@soda-gql/core 0.14.0 → 0.14.2

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["inner: VarRefInner","inner: DirectiveRefInner","INPUT_KIND_MAP: Record<string, InputTypeKind>","OUTPUT_KIND_MAP: Record<string, OutputTypeKind>","fieldTypeSpecifier: ParsedInputSpecifier | null","inlineFragments: InlineFragmentNode[]","curr: Readonly<{ modifier: string; type: TypeNode }>","defaultValue: ConstValueNode | undefined","enumLookup: EnumLookup","cache: { value: T } | null","promise: Promise<void> | null","cache: object | null","lazyCreateEvaluationGenerator","lazyEvaluateSync","document: import(\"graphql\").DocumentNode","parseGraphql","inString: false | '\"' | \"'\"","match: RegExpExecArray | null","levels: TypeLevel[]","operations: ParsedOperation[]","fragments: ParsedFragment[]","variables: ParsedVariable[]","scalars: SchemaIndex[\"scalars\"]","enums: SchemaIndex[\"enums\"]","inputs: SchemaIndex[\"inputs\"]","operationTypes: OperationTypeNames","builtinScalarTypes","lists: (\"[]!\" | \"[]?\")[]","match: RegExpExecArray | null","mergedInner: \"!\" | \"?\"","mergedLists: (\"[]!\" | \"[]?\")[]","usages: VariableUsage[]","error","variables: InferredVariable[]","sorted: ParsedFragment[]","fragments: EnrichedFragment[]","operations: EnrichedOperation[]","variables: EnrichedVariable[]","resolveTypeKind","spreadVariables: InferredVariable[]","obj: Record<string, unknown>","result: Record<string, BuiltVarSpecifier>","defaultMetadataAdapter: DefaultMetadataAdapter","fieldPathContext: { current: FieldPath | null }","newSegment: FieldPathSegment","cacheMap: CacheMap","wrap","result: Record<string, unknown>","fragmentUsageContext: { current: FragmentUsageRecord[] | null }","usages: FragmentUsageRecord[]","merged: Record<string, VariableDefinitions[string]>","proxy: T","varRefTools: VarRefTools","syntheticDoc: import(\"graphql\").DocumentNode","parseGraphql","result: Record<string, unknown>","unionInput: Record<string, unknown>","unsupportedSelections: string[]","spreadFields: AnyFieldsExtended","document: import(\"graphql\").DocumentNode","metadataBuilder: (() => unknown | Promise<unknown>) | null","fragmentUsages: FragmentUsage","fragmentMetaInfos: FragmentMetaInfo<TFragmentMetadata>[]","fragmentMetadataResults: (TFragmentMetadata | undefined | Promise<TFragmentMetadata>)[]","aggregated","parseGraphql","document: import(\"graphql\").DocumentNode","parseGraphql","varSpecifiers: VariableDefinitions","varDefNodes: readonly import(\"graphql\").VariableDefinitionNode[]","elementComposer: GqlElementComposer<typeof context>","baseType: string","memberTypes: string[]","selection: AnyFieldSelection"],"sources":["../src/types/type-foundation/var-ref.ts","../src/types/type-foundation/directive-ref.ts","../src/utils/deferred-specifier-parser.ts","../src/composer/build-document.ts","../src/composer/colocate.ts","../src/utils/promise.ts","../src/types/element/lazy-evaluator.ts","../src/types/element/gql-element.ts","../src/types/element/define.ts","../src/types/element/fragment.ts","../src/types/element/operation.ts","../src/composer/compat-tagged-template.ts","../src/composer/directive-builder.ts","../src/graphql/fragment-args-preprocessor.ts","../src/graphql/result.ts","../src/graphql/parser.ts","../src/graphql/schema-adapter.ts","../src/graphql/schema-index.ts","../src/graphql/transformer.ts","../src/graphql/var-specifier-builder.ts","../src/types/metadata/adapter.ts","../src/composer/field-path-context.ts","../src/composer/fields-builder.ts","../src/composer/fragment-usage-context.ts","../src/utils/map-values.ts","../src/composer/input.ts","../src/composer/merge-variable-definitions.ts","../src/composer/var-ref-tools.ts","../src/composer/fragment-tagged-template.ts","../src/composer/operation-core.ts","../src/composer/extend.ts","../src/composer/operation-tagged-template.ts","../src/composer/gql-composer.ts","../src/prebuilt/type-calculator.ts"],"sourcesContent":["import type { CreatableInputTypeKind } from \"./type-specifier\";\n\n/**\n * VarRef meta interface using typeName + kind instead of full profile.\n * This simplifies type comparison and improves error messages.\n * Uses CreatableInputTypeKind since VarRefs should never reference excluded types.\n */\nexport interface AnyVarRefBrand {\n readonly typeName: string;\n readonly kind: CreatableInputTypeKind;\n readonly signature: unknown;\n}\n\n/**\n * A nested value that can contain:\n * - Primitive ConstValue (string, number, boolean, null, undefined)\n * - VarRef at any nesting level\n * - Objects with NestedValue fields\n * - Arrays of NestedValue\n */\nexport type NestedValue =\n | string\n | number\n | boolean\n | null\n | undefined\n | { readonly [key: string]: NestedValueElement }\n | readonly NestedValueElement[];\n\nexport type NestedValueElement =\n | string\n | number\n | boolean\n | null\n | undefined\n | AnyVarRef\n | { readonly [key: string]: NestedValueElement }\n | readonly NestedValueElement[];\n\nexport type VarRefInner =\n | {\n type: \"variable\";\n name: string;\n }\n | {\n type: \"nested-value\";\n value: NestedValue;\n };\n\nexport type AnyVarRef = VarRef<any>;\n\ndeclare const __VAR_REF_BRAND__: unique symbol;\nexport class VarRef<TBrand extends AnyVarRefBrand> {\n declare readonly [__VAR_REF_BRAND__]: TBrand;\n\n constructor(private readonly inner: VarRefInner) {}\n\n static getInner(varRef: AnyVarRef): VarRefInner {\n return varRef.inner;\n }\n}\n\n/**\n * Creates a VarRef from a variable name.\n * Returns AnyVarRef - type safety is enforced at assignment sites.\n */\nexport function createVarRefFromVariable(name: string): AnyVarRef {\n return new VarRef({ type: \"variable\", name });\n}\n\n/**\n * Creates a VarRef from a nested value.\n * Returns AnyVarRef - type safety is enforced at assignment sites.\n */\nexport function createVarRefFromNestedValue(value: NestedValue): AnyVarRef {\n return new VarRef({ type: \"nested-value\", value });\n}\n","/**\n * DirectiveRef type for representing field-level directives.\n *\n * Similar to VarRef, DirectiveRef uses a branded type pattern to carry\n * type information about the directive (name, locations, arguments) while\n * allowing relaxed type checking at the field builder level.\n *\n * @module\n */\n\nimport type { DeferredInputSpecifier } from \"./type-specifier\";\n\n/**\n * Executable directive locations (used in operations/fragments).\n */\nexport type ExecutableDirectiveLocation =\n | \"QUERY\"\n | \"MUTATION\"\n | \"SUBSCRIPTION\"\n | \"FIELD\"\n | \"FRAGMENT_DEFINITION\"\n | \"FRAGMENT_SPREAD\"\n | \"INLINE_FRAGMENT\"\n | \"VARIABLE_DEFINITION\";\n\n/**\n * Type system directive locations (used in schema definitions).\n */\nexport type TypeSystemDirectiveLocation =\n | \"SCHEMA\"\n | \"SCALAR\"\n | \"OBJECT\"\n | \"FIELD_DEFINITION\"\n | \"ARGUMENT_DEFINITION\"\n | \"INTERFACE\"\n | \"UNION\"\n | \"ENUM\"\n | \"ENUM_VALUE\"\n | \"INPUT_OBJECT\"\n | \"INPUT_FIELD_DEFINITION\";\n\n/**\n * All valid locations where a directive can be applied.\n * Matches GraphQL specification DirectiveLocation enum.\n */\nexport type DirectiveLocation = ExecutableDirectiveLocation | TypeSystemDirectiveLocation;\n\n/**\n * Brand interface for DirectiveRef type information.\n * Contains the directive name and valid locations.\n */\nexport interface AnyDirectiveRefBrand {\n readonly directiveName: string;\n readonly locations: readonly DirectiveLocation[];\n}\n\n/**\n * Type specifier for a directive argument.\n * Uses deferred string format for consistency with other type specifiers.\n * @see DeferredInputSpecifier\n */\nexport type DirectiveArgumentSpecifier = DeferredInputSpecifier;\n\n/**\n * Internal structure of a DirectiveRef.\n * Contains the directive name, arguments, valid locations, and optional argument specifiers.\n */\nexport type DirectiveRefInner = {\n readonly name: string;\n readonly arguments: Readonly<Record<string, unknown>>;\n readonly locations: readonly DirectiveLocation[];\n /**\n * Type specifiers for arguments, enabling enum detection.\n * Generated by codegen for typed directives.\n */\n readonly argumentSpecs?: Readonly<Record<string, DirectiveArgumentSpecifier>>;\n};\n\ndeclare const __DIRECTIVE_REF_BRAND__: unique symbol;\n\n/**\n * A reference to a directive that can be applied to fields.\n *\n * DirectiveRef carries type information about the directive via the TBrand\n * type parameter, but this information is only used for type inference,\n * not for runtime validation.\n *\n * @example\n * ```typescript\n * const skipDirective = new DirectiveRef({\n * name: \"skip\",\n * arguments: { if: true },\n * locations: [\"FIELD\", \"FRAGMENT_SPREAD\", \"INLINE_FRAGMENT\"],\n * });\n * ```\n */\nexport class DirectiveRef<TBrand extends AnyDirectiveRefBrand> {\n declare readonly [__DIRECTIVE_REF_BRAND__]: TBrand;\n\n constructor(private readonly inner: DirectiveRefInner) {}\n\n /**\n * Extracts the inner structure from a DirectiveRef.\n * Used by build-document.ts to generate DirectiveNode.\n */\n static getInner(ref: AnyDirectiveRef): DirectiveRefInner {\n return ref.inner;\n }\n}\n\n/**\n * Type-erased DirectiveRef for use in contexts where\n * the specific directive type is not needed.\n */\nexport type AnyDirectiveRef = DirectiveRef<AnyDirectiveRefBrand>;\n","/**\n * Runtime parser for deferred specifier strings.\n *\n * Parses string literal specifiers like \"s|uuid|!\" into structured objects\n * for runtime operations that need to access specifier properties.\n */\n\nimport type {\n DeferredOutputField,\n DeferredOutputFieldWithArgs,\n InputTypeKind,\n OutputTypeKind,\n} from \"../types/type-foundation/type-specifier\";\n\nexport type ParsedInputSpecifier = {\n kind: InputTypeKind;\n name: string;\n modifier: string;\n hasDefault: boolean;\n};\n\nexport type ParsedOutputSpecifier = {\n kind: OutputTypeKind;\n name: string;\n modifier: string;\n /** Deferred input specifier strings for arguments */\n arguments: Record<string, string>;\n};\n\nconst INPUT_KIND_MAP: Record<string, InputTypeKind> = {\n s: \"scalar\",\n e: \"enum\",\n i: \"input\",\n x: \"excluded\",\n};\n\nconst OUTPUT_KIND_MAP: Record<string, OutputTypeKind> = {\n s: \"scalar\",\n e: \"enum\",\n o: \"object\",\n u: \"union\",\n x: \"excluded\",\n};\n\n/**\n * Parse a deferred input specifier string into a structured object.\n *\n * @example\n * parseInputSpecifier(\"s|uuid|!\")\n * // { kind: \"scalar\", name: \"uuid\", modifier: \"!\", hasDefault: false }\n *\n * parseInputSpecifier(\"e|order_by|?|D\")\n * // { kind: \"enum\", name: \"order_by\", modifier: \"?\", hasDefault: true }\n */\nexport function parseInputSpecifier(spec: string): ParsedInputSpecifier {\n const hasDefault = spec.endsWith(\"|D\");\n const parts = spec.split(\"|\");\n\n const kindChar = parts[0];\n const name = parts[1];\n if (!kindChar || !name) {\n throw new Error(`Invalid input specifier format: ${spec}`);\n }\n // Modifier is everything after kind|name| but before any |D suffix\n const modifier = hasDefault ? (parts[2] ?? \"\") : parts.slice(2).join(\"|\");\n\n const kind = INPUT_KIND_MAP[kindChar];\n if (!kind) {\n throw new Error(`Invalid input specifier kind: ${kindChar}`);\n }\n\n return { kind, name, modifier, hasDefault };\n}\n\n/**\n * Parse a deferred output specifier string into a structured object.\n * Note: Output specifiers no longer contain inline arguments.\n * Use parseOutputField() for field specifiers that may have arguments.\n *\n * @example\n * parseOutputSpecifier(\"o|users|![]!\")\n * // { kind: \"object\", name: \"users\", modifier: \"![]!\", arguments: {} }\n */\nexport function parseOutputSpecifier(spec: string): ParsedOutputSpecifier {\n const parts = spec.split(\"|\");\n\n const kindChar = parts[0];\n const name = parts[1];\n const modifier = parts[2];\n if (!kindChar || !name || modifier === undefined) {\n throw new Error(`Invalid output specifier format: ${spec}`);\n }\n\n const kind = OUTPUT_KIND_MAP[kindChar];\n if (!kind) {\n throw new Error(`Invalid output specifier kind: ${kindChar}`);\n }\n\n return { kind, name, modifier, arguments: {} };\n}\n\n// ============================================================\n// Field Specifier Parsing (handles both string and object formats)\n// ============================================================\n\n/**\n * Type guard to check if a field specifier has extracted arguments.\n *\n * @example\n * isFieldWithArgs(\"o|User|!\") // false\n * isFieldWithArgs({ spec: \"o|User|!\", arguments: { id: \"s|ID|!\" } }) // true\n */\nexport function isFieldWithArgs(field: DeferredOutputField): field is DeferredOutputFieldWithArgs {\n return typeof field === \"object\" && field !== null && \"spec\" in field;\n}\n\n/**\n * Parse a field specifier into a structured object.\n * Handles both string format (no arguments) and object format (with arguments).\n *\n * @example\n * // Object format (with arguments)\n * parseOutputField({ spec: \"o|User|!\", arguments: { id: \"s|ID|!\" } })\n * // { kind: \"object\", name: \"User\", modifier: \"!\", arguments: { id: \"s|ID|!\" } }\n *\n * // String format (no arguments)\n * parseOutputField(\"s|String|!\")\n * // { kind: \"scalar\", name: \"String\", modifier: \"!\", arguments: {} }\n */\nexport function parseOutputField(field: DeferredOutputField): ParsedOutputSpecifier {\n if (isFieldWithArgs(field)) {\n // Object format - arguments in separate property\n const spec = parseOutputSpecifier(field.spec);\n return { ...spec, arguments: field.arguments };\n }\n // String format - no arguments\n return parseOutputSpecifier(field);\n}\n","/**\n * Builds GraphQL AST nodes from field selections.\n *\n * Converts the type-safe field selection DSL into GraphQL AST,\n * producing a TypedDocumentNode for use with GraphQL clients.\n *\n * @module\n */\n\nimport type { TypedDocumentNode } from \"@graphql-typed-document-node/core\";\nimport {\n type ArgumentNode,\n type ConstObjectFieldNode,\n type ConstValueNode,\n type DirectiveNode,\n type DocumentNode,\n type FieldNode,\n type InlineFragmentNode,\n Kind,\n type NamedTypeNode,\n type ObjectFieldNode,\n OperationTypeNode,\n type SelectionNode,\n type TypeNode,\n type ValueNode,\n type VariableDefinitionNode,\n} from \"graphql\";\nimport {\n type AnyAssignableInput,\n type AnyAssignableInputValue,\n type AnyDirectiveAttachments,\n type AnyFieldSelection,\n type AnyFieldsExtended,\n type AnyFieldValue,\n type AnyUnionSelection,\n type ScalarShorthand,\n VarRef,\n} from \"../types/fragment\";\nimport type { AnyGraphqlSchema, OperationType } from \"../types/schema\";\nimport type {\n ConstValue,\n DeferredInputSpecifier,\n InputTypeSpecifiers,\n TypeModifier,\n VariableDefinitions,\n VarSpecifier,\n} from \"../types/type-foundation\";\nimport { type AnyDirectiveRef, type DirectiveLocation, DirectiveRef } from \"../types/type-foundation/directive-ref\";\nimport { type ParsedInputSpecifier, parseInputSpecifier, parseOutputField } from \"../utils/deferred-specifier-parser\";\n\n/**\n * Context for determining if a value should be output as an enum.\n * Contains the schema for looking up nested input types and the current type specifier.\n */\nexport type EnumLookup = {\n schema: AnyGraphqlSchema;\n /** Parsed type specifier for the current value. null means enum detection is skipped. */\n typeSpecifier: ParsedInputSpecifier | null;\n};\n\n/**\n * Converts an assignable input value to a GraphQL AST ValueNode.\n *\n * Handles primitives, arrays, objects, and variable references.\n * Returns null for undefined values (field is omitted).\n *\n * @param value - The value to convert\n * @param enumLookup - Context for enum detection. String values will be output\n * as Kind.ENUM if typeSpecifier indicates an enum type.\n */\nexport const buildArgumentValue = (value: AnyAssignableInputValue, enumLookup: EnumLookup): ValueNode | null => {\n if (value === undefined) {\n return null;\n }\n\n if (value === null) {\n return {\n kind: Kind.NULL,\n };\n }\n\n if (value instanceof VarRef) {\n const inner = VarRef.getInner(value);\n if (inner.type === \"variable\") {\n return {\n kind: Kind.VARIABLE,\n name: { kind: Kind.NAME, value: inner.name },\n };\n }\n\n if (inner.type === \"nested-value\") {\n // Recursively process the nested value\n // This handles VarRefs inside the nested structure\n return buildArgumentValue(inner.value as AnyAssignableInputValue, enumLookup);\n }\n\n throw new Error(`Unknown var ref type: ${inner satisfies never}`);\n }\n\n if (Array.isArray(value)) {\n // For list types, the inner type specifier remains the same (e.g., [Status!]! uses Status for each item)\n return {\n kind: Kind.LIST,\n values: value.map((item) => buildArgumentValue(item, enumLookup)).filter((item) => item !== null),\n };\n }\n\n if (typeof value === \"object\") {\n return {\n kind: Kind.OBJECT,\n fields: Object.entries(value)\n .map(([key, fieldValue]): ObjectFieldNode | null => {\n // Look up field type in nested InputObject for enum detection\n let fieldTypeSpecifier: ParsedInputSpecifier | null = null;\n if (enumLookup.typeSpecifier?.kind === \"input\") {\n const inputDefs = enumLookup.schema.input;\n const inputDef = inputDefs?.[enumLookup.typeSpecifier.name];\n const fieldSpec = inputDef?.fields[key];\n fieldTypeSpecifier = fieldSpec ? parseInputSpecifier(fieldSpec) : null;\n }\n\n const valueNode = buildArgumentValue(fieldValue, {\n schema: enumLookup.schema,\n typeSpecifier: fieldTypeSpecifier,\n });\n return valueNode\n ? {\n kind: Kind.OBJECT_FIELD,\n name: { kind: Kind.NAME, value: key },\n value: valueNode,\n }\n : null;\n })\n .filter((item) => item !== null),\n };\n }\n\n if (typeof value === \"string\") {\n // Output as Kind.ENUM if the type specifier indicates this is an enum type\n if (enumLookup.typeSpecifier?.kind === \"enum\") {\n return {\n kind: Kind.ENUM,\n value,\n };\n }\n return {\n kind: Kind.STRING,\n value,\n };\n }\n\n if (typeof value === \"number\") {\n // Distinguish between INT and FLOAT\n const isFloat = !Number.isInteger(value) || value.toString().includes(\".\");\n return {\n kind: isFloat ? Kind.FLOAT : Kind.INT,\n value: value.toString(),\n };\n }\n\n if (typeof value === \"boolean\") {\n return {\n kind: Kind.BOOLEAN,\n value,\n };\n }\n\n throw new Error(`Unknown value type: ${typeof (value satisfies never)}`);\n};\n\nconst buildArguments = (\n args: AnyAssignableInput,\n argumentSpecifiers: InputTypeSpecifiers,\n schema: AnyGraphqlSchema,\n): ArgumentNode[] =>\n Object.entries(args ?? {})\n .map(([name, value]): ArgumentNode | null => {\n const specifierStr = argumentSpecifiers[name];\n const typeSpecifier = specifierStr ? parseInputSpecifier(specifierStr) : null;\n const valueNode = buildArgumentValue(value, { schema, typeSpecifier });\n return valueNode\n ? {\n kind: Kind.ARGUMENT,\n name: { kind: Kind.NAME, value: name },\n value: valueNode,\n }\n : null;\n })\n .filter((item) => item !== null);\n\n/**\n * Build arguments from directive argument specifiers (deferred string format).\n * Uses parseInputSpecifier to convert deferred strings to structured format.\n */\nconst buildDirectiveArguments = (\n args: AnyAssignableInput,\n argumentSpecifiers: Readonly<Record<string, DeferredInputSpecifier>> | undefined,\n schema: AnyGraphqlSchema,\n): ArgumentNode[] =>\n Object.entries(args ?? {})\n .map(([name, value]): ArgumentNode | null => {\n const spec = argumentSpecifiers?.[name];\n const typeSpecifier = spec ? parseInputSpecifier(spec) : null;\n const valueNode = buildArgumentValue(value, { schema, typeSpecifier });\n return valueNode\n ? {\n kind: Kind.ARGUMENT,\n name: { kind: Kind.NAME, value: name },\n value: valueNode,\n }\n : null;\n })\n .filter((item) => item !== null);\n\n/**\n * Validates that a directive can be used at the specified location.\n *\n * @param directive - The directive reference to validate\n * @param expectedLocation - The location where the directive is being used\n * @throws Error if the directive is not valid at the specified location\n */\nconst validateDirectiveLocation = (directive: AnyDirectiveRef, expectedLocation: DirectiveLocation): void => {\n const inner = DirectiveRef.getInner(directive);\n if (!inner.locations.includes(expectedLocation)) {\n throw new Error(\n `Directive @${inner.name} cannot be used on ${expectedLocation}. ` + `Valid locations: ${inner.locations.join(\", \")}`,\n );\n }\n};\n\n/**\n * Builds DirectiveNode array from field directives.\n *\n * Filters for DirectiveRef instances, validates their locations,\n * and converts them to GraphQL AST DirectiveNode objects.\n *\n * @param directives - Array of directive references (or unknown values)\n * @param location - The location context for validation\n * @param schema - The schema for type lookups\n * @returns Array of DirectiveNode for the GraphQL AST\n *\n * Uses argument specifiers from DirectiveRef (when available via createTypedDirectiveMethod)\n * to properly output enum arguments as Kind.ENUM instead of Kind.STRING.\n */\nconst buildDirectives = (\n directives: AnyDirectiveAttachments,\n location: DirectiveLocation,\n schema: AnyGraphqlSchema,\n): DirectiveNode[] => {\n return directives\n .filter((d): d is AnyDirectiveRef => d instanceof DirectiveRef)\n .map((directive) => {\n validateDirectiveLocation(directive, location);\n const inner = DirectiveRef.getInner(directive);\n\n return {\n kind: Kind.DIRECTIVE as const,\n name: { kind: Kind.NAME as const, value: inner.name },\n arguments: buildDirectiveArguments(inner.arguments as AnyAssignableInput, inner.argumentSpecs, schema),\n };\n });\n};\n\n/**\n * Check if value is shorthand (true) vs factory return (AnyFieldSelection).\n * Used for field selection shorthand syntax support.\n */\nconst isShorthand = (value: AnyFieldValue): value is ScalarShorthand => {\n return value === true;\n};\n\n/**\n * Expand shorthand to AnyFieldSelection using schema type info.\n * Used at document build time to convert `true` to full field selection.\n *\n * @param schema - The GraphQL schema\n * @param typeName - The parent object type name\n * @param fieldName - The field name to select\n */\nconst expandShorthand = (schema: AnyGraphqlSchema, typeName: string, fieldName: string): AnyFieldSelection => {\n const typeDef = schema.object[typeName];\n if (!typeDef) {\n throw new Error(`Type \"${typeName}\" not found in schema`);\n }\n\n // Runtime duck-typing: codegen may emit string or { spec, arguments }\n const fieldDef = typeDef.fields[fieldName];\n if (!fieldDef) {\n throw new Error(`Field \"${fieldName}\" not found on type \"${typeName}\"`);\n }\n\n const fieldSpec = typeof fieldDef === \"string\" ? fieldDef : (fieldDef as { spec: string }).spec;\n\n return {\n parent: typeName,\n field: fieldName,\n type: fieldSpec as unknown as import(\"../types/type-foundation\").DeferredOutputFieldWithArgs,\n args: {},\n directives: [],\n object: null,\n union: null,\n };\n};\n\nconst buildUnionSelection = (union: AnyUnionSelection, schema: AnyGraphqlSchema): SelectionNode[] => {\n const { selections, __typename: hasTypenameFlag } = union;\n\n const inlineFragments: InlineFragmentNode[] = Object.entries(selections)\n .map(([typeName, member]): InlineFragmentNode | null => {\n // Skip undefined values and non-object values (shouldn't happen but guard against it)\n if (!member || typeof member !== \"object\") {\n return null;\n }\n const { fields, directives: memberDirectives } = member as import(\"../types/fragment\").UnionMemberSelection;\n const builtDirectives = buildDirectives(memberDirectives, \"INLINE_FRAGMENT\", schema);\n return {\n kind: Kind.INLINE_FRAGMENT,\n typeCondition: {\n kind: Kind.NAMED_TYPE,\n name: { kind: Kind.NAME, value: typeName },\n },\n ...(builtDirectives.length > 0 ? { directives: builtDirectives } : {}),\n selectionSet: {\n kind: Kind.SELECTION_SET,\n selections: buildField(fields, schema, typeName),\n },\n };\n })\n .filter((item) => item !== null);\n\n if (hasTypenameFlag) {\n const typenameField: FieldNode = {\n kind: Kind.FIELD,\n name: { kind: Kind.NAME, value: \"__typename\" },\n };\n return [typenameField, ...inlineFragments];\n }\n\n return inlineFragments;\n};\n\n/**\n * Builds field nodes from extended fields map.\n * Supports both shorthand (true) and factory (AnyFieldSelection) syntax.\n *\n * @param fields - Field selections (shorthand or factory)\n * @param schema - The GraphQL schema\n * @param typeName - Parent type name (required for shorthand expansion)\n */\nconst buildField = (fields: AnyFieldsExtended, schema: AnyGraphqlSchema, typeName?: string): FieldNode[] =>\n Object.entries(fields).map(([alias, value]): FieldNode => {\n // __typename is an implicit introspection field on all object types\n if (alias === \"__typename\" && isShorthand(value)) {\n return {\n kind: Kind.FIELD,\n name: { kind: Kind.NAME, value: \"__typename\" },\n };\n }\n // Expand shorthand to AnyFieldSelection if needed\n if (isShorthand(value) && !typeName) {\n throw new Error(`typeName is required for shorthand expansion of field \"${alias}\"`);\n }\n // typeName is guaranteed to be defined here when isShorthand(value) is true\n const selection = isShorthand(value) ? expandShorthand(schema, typeName as string, alias) : value;\n\n const { args, field, object, union, directives, type } = selection;\n const parsedType = parseOutputField(type);\n const builtDirectives = buildDirectives(directives, \"FIELD\", schema);\n return {\n kind: Kind.FIELD,\n name: { kind: Kind.NAME, value: field },\n alias: alias !== field ? { kind: Kind.NAME, value: alias } : undefined,\n arguments: buildArguments(args, parsedType.arguments as InputTypeSpecifiers, schema),\n directives: builtDirectives.length > 0 ? builtDirectives : undefined,\n selectionSet: object\n ? {\n kind: Kind.SELECTION_SET,\n selections: buildField(object, schema, parsedType.name),\n }\n : union\n ? {\n kind: Kind.SELECTION_SET,\n selections: buildUnionSelection(union, schema),\n }\n : undefined,\n };\n });\n\n/**\n * Converts a constant value to a GraphQL AST ConstValueNode.\n *\n * Unlike `buildArgumentValue`, this only handles literal values\n * (no variable references). Used for default values.\n *\n * @param value - The constant value to convert\n * @param enumLookup - Context for enum detection. String values will be output\n * as Kind.ENUM if typeSpecifier indicates an enum type.\n */\nexport const buildConstValueNode = (value: ConstValue, enumLookup: EnumLookup): ConstValueNode | null => {\n if (value === undefined) {\n return null;\n }\n\n if (value === null) {\n return { kind: Kind.NULL };\n }\n\n if (Array.isArray(value)) {\n // For list types, the inner type specifier remains the same\n return {\n kind: Kind.LIST,\n values: value.map((item) => buildConstValueNode(item, enumLookup)).filter((item) => item !== null),\n };\n }\n\n if (typeof value === \"object\") {\n return {\n kind: Kind.OBJECT,\n fields: Object.entries(value)\n .map(([key, fieldValue]): ConstObjectFieldNode | null => {\n // Look up field type in nested InputObject for enum detection\n let fieldTypeSpecifier: ParsedInputSpecifier | null = null;\n if (enumLookup.typeSpecifier?.kind === \"input\") {\n const inputDefs = enumLookup.schema.input;\n const inputDef = inputDefs?.[enumLookup.typeSpecifier.name];\n const fieldSpec = inputDef?.fields[key];\n fieldTypeSpecifier = fieldSpec ? parseInputSpecifier(fieldSpec) : null;\n }\n\n const valueNode = buildConstValueNode(fieldValue, {\n schema: enumLookup.schema,\n typeSpecifier: fieldTypeSpecifier,\n });\n return valueNode\n ? {\n kind: Kind.OBJECT_FIELD,\n name: { kind: Kind.NAME, value: key },\n value: valueNode,\n }\n : null;\n })\n .filter((item) => item !== null),\n };\n }\n\n if (typeof value === \"string\") {\n // Output as Kind.ENUM if the type specifier indicates this is an enum type\n if (enumLookup.typeSpecifier?.kind === \"enum\") {\n return { kind: Kind.ENUM, value };\n }\n return { kind: Kind.STRING, value };\n }\n\n if (typeof value === \"boolean\") {\n return { kind: Kind.BOOLEAN, value };\n }\n\n if (typeof value === \"number\") {\n // Distinguish between INT and FLOAT\n const isFloat = !Number.isInteger(value) || value.toString().includes(\".\");\n return { kind: isFloat ? Kind.FLOAT : Kind.INT, value: value.toString() };\n }\n\n throw new Error(`Unknown value type: ${typeof (value satisfies never)}`);\n};\n\n/**\n * Wraps a named type with modifiers (non-null, list).\n *\n * Modifier format: starts with `?` (nullable) or `!` (non-null),\n * followed by `[]?` or `[]!` pairs for lists.\n *\n * @example\n * - `\"!\"` -> `String!`\n * - `\"?\"` -> `String`\n * - `\"![]!\"` -> `[String!]!`\n * - `\"?[]?\"` -> `[String]`\n */\nexport const buildWithTypeModifier = (modifier: TypeModifier, buildType: () => NamedTypeNode): TypeNode => {\n const baseType = buildType();\n\n if (modifier === \"?\") {\n return baseType;\n }\n\n if (modifier === \"!\") {\n return { kind: Kind.NON_NULL_TYPE, type: baseType };\n }\n\n // Validate modifier format: must start with ? or !, followed by []? or []! pairs\n // Valid patterns: \"?\", \"!\", \"?[]?\", \"?[]!\", \"![]?\", \"![]!\", \"?[]?[]?\", etc.\n const validModifierPattern = /^[?!](\\[\\][?!])*$/;\n if (!validModifierPattern.test(modifier)) {\n throw new Error(`Unknown modifier: ${modifier}`);\n }\n\n // New format: starts with inner type modifier (? or !), then []? or []! pairs\n // e.g., \"?[]?\" = nullable list of nullable, \"![]!\" = non-null list of non-null\n let curr: Readonly<{ modifier: string; type: TypeNode }> = {\n modifier,\n type: baseType,\n };\n\n while (curr.modifier.length > 0) {\n // Handle inner type modifier (? or !)\n if (curr.modifier.startsWith(\"?\")) {\n // Nullable inner type - type stays as-is\n curr = {\n modifier: curr.modifier.slice(1),\n type: curr.type,\n };\n continue;\n }\n\n if (curr.modifier.startsWith(\"!\")) {\n // Non-null inner type\n curr = {\n modifier: curr.modifier.slice(1),\n type: curr.type.kind === Kind.NON_NULL_TYPE ? curr.type : { kind: Kind.NON_NULL_TYPE, type: curr.type },\n };\n continue;\n }\n\n // Handle list modifiers ([]? or []!)\n if (curr.modifier.startsWith(\"[]?\")) {\n // Nullable list\n curr = {\n modifier: curr.modifier.slice(3),\n type: { kind: Kind.LIST_TYPE, type: curr.type },\n };\n continue;\n }\n\n if (curr.modifier.startsWith(\"[]!\")) {\n // Non-null list\n curr = {\n modifier: curr.modifier.slice(3),\n type: {\n kind: Kind.NON_NULL_TYPE,\n type: { kind: Kind.LIST_TYPE, type: curr.type },\n },\n };\n continue;\n }\n\n throw new Error(`Unknown modifier: ${curr.modifier}`);\n }\n\n return curr.type;\n};\n\n/**\n * Builds VariableDefinitionNode[] from VarSpecifier records.\n * Kept as private fallback for callers that don't provide pre-parsed nodes.\n */\nconst buildVariables = (variables: Record<string, VarSpecifier>, schema: AnyGraphqlSchema): VariableDefinitionNode[] => {\n return Object.entries(variables).map(([name, varSpec]): VariableDefinitionNode => {\n // Build default value if present\n let defaultValue: ConstValueNode | undefined;\n if (varSpec.defaultValue) {\n // Convert VarSpecifier to ParsedInputSpecifier format for enum lookup\n const parsedSpec: ParsedInputSpecifier = {\n kind: varSpec.kind,\n name: varSpec.name,\n modifier: varSpec.modifier,\n hasDefault: true,\n };\n const enumLookup: EnumLookup = { schema, typeSpecifier: parsedSpec };\n const constValue = buildConstValueNode(varSpec.defaultValue.default, enumLookup);\n defaultValue = constValue ?? undefined;\n }\n\n return {\n kind: Kind.VARIABLE_DEFINITION,\n variable: { kind: Kind.VARIABLE, name: { kind: Kind.NAME, value: name } },\n defaultValue,\n type: buildWithTypeModifier(varSpec.modifier, () => ({\n kind: Kind.NAMED_TYPE,\n name: { kind: Kind.NAME, value: varSpec.name },\n })),\n };\n });\n};\n\n/**\n * Converts an operation type string to a GraphQL AST OperationTypeNode.\n */\nexport const buildOperationTypeNode = (operation: OperationType): OperationTypeNode => {\n switch (operation) {\n case \"query\":\n return OperationTypeNode.QUERY;\n case \"mutation\":\n return OperationTypeNode.MUTATION;\n case \"subscription\":\n return OperationTypeNode.SUBSCRIPTION;\n default:\n throw new Error(`Unknown operation type: ${operation}`);\n }\n};\n\n/**\n * Builds a TypedDocumentNode from operation options.\n *\n * This is the main entry point for converting field selections into\n * a GraphQL document AST. The result can be used with any GraphQL\n * client that supports TypedDocumentNode.\n *\n * @param options - Operation configuration (name, type, variables, fields, schema)\n * @returns TypedDocumentNode with inferred input/output types\n */\nexport const buildDocument = <\n TSchema extends AnyGraphqlSchema,\n TTypeName extends keyof TSchema[\"object\"] & string,\n TFields extends AnyFieldsExtended,\n TVarDefinitions extends VariableDefinitions,\n>(options: {\n operationName: string;\n operationType: OperationType;\n operationTypeName: TTypeName;\n variableDefinitionNodes?: readonly VariableDefinitionNode[];\n variables: TVarDefinitions;\n fields: TFields;\n schema: TSchema;\n // biome-ignore lint/suspicious/noExplicitAny: Type inference deferred to prebuilt types\n}): TypedDocumentNode<any, any> => {\n const { operationName, operationType, operationTypeName, variableDefinitionNodes, variables, fields, schema } = options;\n\n // Use pre-parsed variable definition nodes if provided, otherwise fall back to building from VarSpecifier records\n const varDefs = variableDefinitionNodes ?? buildVariables(variables, schema);\n\n return {\n kind: Kind.DOCUMENT,\n definitions: [\n {\n kind: Kind.OPERATION_DEFINITION,\n operation: buildOperationTypeNode(operationType),\n name: { kind: Kind.NAME, value: operationName },\n variableDefinitions: varDefs as VariableDefinitionNode[],\n // directives: directives || [],\n selectionSet: {\n kind: Kind.SELECTION_SET,\n selections: buildField(fields, schema, operationTypeName),\n },\n },\n ],\n // biome-ignore lint/suspicious/noExplicitAny: Type inference deferred to prebuilt types\n } satisfies DocumentNode as TypedDocumentNode<any, any>;\n};\n","import type { AnyFieldsExtended } from \"../types/fragment\";\nimport type { UnionToIntersection } from \"../utils/type-utils\";\n\n/**\n * Type for colocated field entries.\n * Maps labels to their corresponding field selections.\n */\nexport type ColocatedEntries = Record<string, AnyFieldsExtended>;\n\n/**\n * Result type for colocated fields.\n * Merges all prefixed entries into a single object.\n */\nexport type ColocatedFields<TEntries extends ColocatedEntries> = UnionToIntersection<\n {\n [KPrefix in keyof TEntries]: KPrefix extends string\n ? {\n [KField in keyof TEntries[KPrefix] as KField extends string\n ? `${KPrefix}_${KField}`\n : never]: TEntries[KPrefix][KField];\n }\n : never;\n }[keyof TEntries]\n>;\n\n/**\n * Creates a $colocate helper function for fragment colocation.\n *\n * $colocate takes an object of { label: fields } and applies prefix-based\n * aliasing to each entry. This mirrors the structure of createExecutionResultParser\n * from @soda-gql/colocation-tools.\n *\n * @example\n * ```typescript\n * // In operation definition\n * query(\"GetData\")({\n * variables: `($userId: ID!)`,\n * fields: ({ f, $ }) => $colocate({\n * userCard: { ...f(\"user\", { id: $.userId })(() => ({ ...userCardFragment.spread() })) },\n * posts: { ...f(\"posts\", { userId: $.userId })(() => ({ ...postsFragment.spread() })) },\n * }),\n * })({});\n *\n * // In parser definition (same labels)\n * createExecutionResultParser({\n * userCard: userCardProjection,\n * posts: postsProjection,\n * });\n * ```\n */\nexport const createColocateHelper = () => {\n /**\n * Colocate multiple field selections with labeled prefixes.\n *\n * @param entries - Object mapping labels to field selections\n * @returns Merged object of all prefixed field entries\n */\n const $colocate = <TEntries extends ColocatedEntries>(entries: TEntries): ColocatedFields<TEntries> =>\n Object.fromEntries(\n Object.entries(entries).flatMap(([label, fields]) =>\n Object.entries(fields).map(([key, value]) => [`${label}_${key}`, value] as const),\n ),\n ) as ColocatedFields<TEntries>;\n\n return $colocate;\n};\n\nexport type ColocateHelper = ReturnType<typeof createColocateHelper>;\n","/**\n * Promise detection utilities for cross-realm compatibility.\n * @module\n */\n\n/**\n * Check if a value is Promise-like (has .then method).\n *\n * This function uses duck typing instead of `instanceof Promise` to work across\n * VM sandbox boundaries where Promises created in a different realm have a\n * different constructor.\n *\n * @example\n * ```typescript\n * // Works with native Promises\n * isPromiseLike(Promise.resolve(42)); // true\n *\n * // Works with VM sandbox Promises (instanceof would fail)\n * const vmPromise = vm.runInContext(\"Promise.resolve(42)\", context);\n * isPromiseLike(vmPromise); // true (instanceof Promise would be false)\n *\n * // Rejects non-Promises\n * isPromiseLike({ then: \"not a function\" }); // false\n * isPromiseLike(null); // false\n * isPromiseLike(42); // false\n * ```\n */\nexport const isPromiseLike = <T>(value: unknown): value is PromiseLike<T> => {\n return value !== null && typeof value === \"object\" && \"then\" in value && typeof value.then === \"function\";\n};\n","import { isPromiseLike } from \"../../utils/promise\";\n\n/**\n * Context passed to the definition factory during evaluation.\n */\nexport type LazyEvaluatorContext = {\n canonicalId: string;\n};\n\n/**\n * Factory function that produces the definition value.\n * Can be sync or async.\n */\nexport type LazyDefinitionFactory<T> = (context: LazyEvaluatorContext | null) => T | Promise<T>;\n\n/**\n * Function that provides dependencies to evaluate before the main definition.\n */\nexport type LazyDependencyProvider<TDep> = () => TDep[];\n\n/**\n * Internal generator that handles the evaluation protocol.\n */\nexport type LazyEvaluatorExecutor<T> = (context: LazyEvaluatorContext | null) => Generator<Promise<void>, T, void>;\n\n/**\n * Creates a lazy evaluator with caching, async support, and dependency ordering.\n *\n * @param define - Factory function that produces the value\n * @param getDeps - Optional function returning dependencies to evaluate first\n * @param createDepGenerator - Function to create evaluation generator for a dependency\n * @returns An executor generator function\n */\nexport const createLazyEvaluator = <T, TDep>(\n define: LazyDefinitionFactory<T>,\n getDeps: LazyDependencyProvider<TDep> | undefined,\n createDepGenerator: (dep: TDep) => Generator<Promise<void>, void, void>,\n): LazyEvaluatorExecutor<T> => {\n let cache: { value: T } | null = null;\n let promise: Promise<void> | null = null;\n\n return function* execute(context: LazyEvaluatorContext | null): Generator<Promise<void>, T, void> {\n if (cache) {\n return cache.value;\n }\n\n if (promise) {\n yield promise;\n // biome-ignore lint/style/noNonNullAssertion: cache is guaranteed to be set after promise resolves\n return cache!.value;\n }\n\n if (getDeps) {\n // Need to evaluate the dependencies before the current element is evaluated.\n //\n // When dependencies is evaluated while the current element is being evaluated,\n // the evaluation method will be synchronous regardless of how the current builder\n // performs. If the dependencies need to be evaluated asynchronously, they throw an error.\n for (const dep of getDeps()) {\n yield* createDepGenerator(dep);\n }\n }\n\n const defined = define(context);\n // Use duck typing for VM sandbox compatibility (instanceof Promise fails for cross-realm Promises)\n if (!isPromiseLike(defined)) {\n return (cache = { value: defined }).value;\n }\n\n // Create a promise to resolve the value of the element asynchronously.\n // Yield the promise to make the builder process handle the asynchronous operation if it supports it.\n promise = defined.then((value) => {\n cache = { value };\n promise = null;\n });\n\n yield promise;\n // biome-ignore lint/style/noNonNullAssertion: cache is guaranteed to be set after promise resolves\n return cache!.value;\n };\n};\n\n/**\n * Creates an evaluation generator from an executor.\n * Wraps the executor's generator and discards its return value.\n */\nexport function* createEvaluationGenerator<T>(\n executor: LazyEvaluatorExecutor<T>,\n context: LazyEvaluatorContext | null,\n): Generator<Promise<void>, void, void> {\n yield* executor(context);\n}\n\n/**\n * Executes the evaluator synchronously.\n * Throws if async operation is encountered.\n */\nexport const evaluateSync = <T>(executor: LazyEvaluatorExecutor<T>, context: LazyEvaluatorContext | null): T => {\n const result = executor(context).next();\n\n if (!result.done) {\n throw new Error(\"Async operation is not supported in sync evaluation.\");\n }\n\n return result.value;\n};\n","import type { AttachmentShape, AttachmentsTupleToIntersection } from \"./attachment-types\";\nimport {\n createLazyEvaluator,\n type LazyEvaluatorContext,\n type LazyEvaluatorExecutor,\n createEvaluationGenerator as lazyCreateEvaluationGenerator,\n evaluateSync as lazyEvaluateSync,\n} from \"./lazy-evaluator\";\n\nconst GQL_ELEMENT_FACTORY = Symbol(\"GQL_ELEMENT_FACTORY\");\nconst GQL_ELEMENT_CONTEXT = Symbol(\"GQL_ELEMENT_CONTEXT\");\n\n/**\n * Context passed to element definition factories, containing the canonical ID.\n */\nexport type GqlElementContext = LazyEvaluatorContext;\n\n/**\n * Factory function that produces the element definition.\n * May be sync or async (async requires async build mode).\n */\nexport type GqlElementDefinitionFactory<T> = (context: GqlElementContext | null) => T | Promise<T>;\n\n/**\n * Configuration for attaching a computed property to an element.\n */\nexport type GqlElementAttachment<TElement extends object, TName extends string, TValue extends object> = {\n name: TName;\n createValue: (element: TElement) => TValue;\n};\n\n/**\n * Abstract base class for all GraphQL elements (Fragment, Operation).\n *\n * Uses lazy evaluation with caching - definition is computed on first access.\n * Subclasses should not be instantiated directly; use static `create` methods.\n *\n * @template TDefinition - The shape of the evaluated definition\n * @template TInfer - Type inference metadata (access via `$infer`)\n */\nexport abstract class GqlElement<TDefinition extends object, TInfer extends object> {\n /**\n * Type-only property for inference. Throws at runtime.\n * Use with `typeof element.$infer` to extract input/output types.\n */\n declare readonly $infer: TInfer;\n\n private [GQL_ELEMENT_FACTORY]: LazyEvaluatorExecutor<TDefinition>;\n private [GQL_ELEMENT_CONTEXT]: GqlElementContext | null = null;\n\n protected constructor(define: GqlElementDefinitionFactory<TDefinition>, getDeps?: () => GqlElement<any, any>[]) {\n this[GQL_ELEMENT_FACTORY] = createLazyEvaluator(define, getDeps, GqlElement.createEvaluationGenerator);\n\n Object.defineProperty(this, \"$infer\", {\n get() {\n throw new Error(\"This property is only for type meta. Do not access this property directly.\");\n },\n });\n }\n\n /**\n * Attaches lazily-computed properties to this element.\n * Properties are computed once on first access after evaluation.\n *\n * @example Single attachment\n * ```typescript\n * const fragment = gql.default(...)\n * .attach({ name: \"utils\", createValue: (el) => ({ ... }) });\n * ```\n *\n * @example Multiple attachments (use `as const` for full type inference)\n * ```typescript\n * const fragment = gql.default(...)\n * .attach([\n * { name: \"a\", createValue: () => ({ x: 1 }) },\n * { name: \"b\", createValue: () => ({ y: 2 }) },\n * ] as const);\n * ```\n */\n public attach<TName extends string, TValue extends object>(\n attachment: GqlElementAttachment<this, TName, TValue>,\n ): this & { [K in TName]: TValue };\n public attach<const TAttachments extends readonly AttachmentShape[]>(\n attachments: TAttachments,\n ): this & AttachmentsTupleToIntersection<TAttachments>;\n public attach<TName extends string, TValue extends object>(\n attachmentOrAttachments: GqlElementAttachment<this, TName, TValue> | readonly AttachmentShape[],\n ): this & { [K in TName]: TValue } {\n const attachments = Array.isArray(attachmentOrAttachments) ? attachmentOrAttachments : [attachmentOrAttachments];\n\n for (const attachment of attachments) {\n let cache: object | null = null;\n const self = this;\n\n Object.defineProperty(this, attachment.name, {\n get() {\n if (cache) {\n return cache;\n }\n\n GqlElement.evaluateInstantly(self);\n\n return (cache = attachment.createValue(self));\n },\n });\n }\n\n return this as this & { [K in TName]: TValue };\n }\n\n /**\n * Sets the canonical context for an element. Used by the builder.\n * @internal\n */\n static setContext<TElement extends GqlElement<any, any>>(element: TElement, context: GqlElementContext): void {\n element[GQL_ELEMENT_CONTEXT] = context;\n }\n\n /**\n * Gets the canonical context of an element, if set.\n * @internal\n */\n static getContext(element: GqlElement<any, any>): GqlElementContext | null {\n return element[GQL_ELEMENT_CONTEXT];\n }\n\n /**\n * Creates a generator for async evaluation. Used by the builder.\n * @internal\n */\n static createEvaluationGenerator(element: GqlElement<any, any>): Generator<Promise<void>, void, void> {\n return lazyCreateEvaluationGenerator(element[GQL_ELEMENT_FACTORY], element[GQL_ELEMENT_CONTEXT]);\n }\n\n private static evaluateInstantly<TValue extends object>(element: GqlElement<TValue, any>): TValue {\n return lazyEvaluateSync(element[GQL_ELEMENT_FACTORY], element[GQL_ELEMENT_CONTEXT]);\n }\n\n /**\n * Forces synchronous evaluation. Throws if async operation is needed.\n * @internal\n */\n static evaluateSync(element: GqlElement<any, any>): void {\n void GqlElement.evaluateInstantly(element);\n }\n\n /**\n * Evaluates and returns the element's definition.\n * Throws if async operation is needed.\n * @internal\n */\n static get<TValue extends object>(element: GqlElement<TValue, any>): TValue {\n return GqlElement.evaluateInstantly(element);\n }\n}\n","/**\n * Define element for storing arbitrary value factories.\n * @module\n */\n\nimport { isPromiseLike } from \"../../utils/promise\";\nimport { GqlElement, type GqlElementContext } from \"./gql-element\";\n\n/**\n * Type alias for any GqlDefine instance.\n */\nexport type AnyGqlDefine = GqlDefine<unknown>;\n\n/**\n * Type inference metadata for define elements.\n * Access via `typeof defineElement.$infer`.\n */\ntype DefineInferMeta<TValue> = {\n readonly value: TValue;\n};\n\ndeclare const __DEFINE_BRAND__: unique symbol;\n\n/**\n * Internal artifact shape produced by define evaluation.\n * @internal\n */\ntype DefineArtifact<TValue> = {\n readonly factoryResult: TValue;\n};\n\n/**\n * Represents a factory-based value definition.\n *\n * Define elements are created via `gql(({ define }) => define(() => value))`.\n * The factory is evaluated lazily and the result is cached.\n *\n * @template TValue - The type of value produced by the factory\n *\n * @example\n * ```typescript\n * // Store a primitive value\n * const myNumber = gql.default(({ define }) => define(() => 42));\n * console.log(myNumber.value); // 42\n *\n * // Store a plain object\n * const myConfig = gql.default(({ define }) => define(() => ({\n * apiUrl: \"https://api.example.com\",\n * timeout: 5000,\n * })));\n * console.log(myConfig.value.apiUrl); // \"https://api.example.com\"\n * ```\n */\nexport class GqlDefine<TValue> extends GqlElement<DefineArtifact<TValue>, DefineInferMeta<TValue>> {\n private declare readonly [__DEFINE_BRAND__]: void;\n\n private constructor(define: (context: GqlElementContext | null) => DefineArtifact<TValue> | Promise<DefineArtifact<TValue>>) {\n super(define);\n }\n\n /**\n * The evaluated value from the factory.\n * Triggers lazy evaluation on first access.\n */\n public get value(): TValue {\n return GqlElement.get(this).factoryResult;\n }\n\n /**\n * Creates a new GqlDefine instance.\n *\n * Prefer using the `gql(({ define }) => define(() => value))` API instead.\n *\n * @param factory - Function that produces the value. Can be sync or async.\n * @returns A new GqlDefine instance wrapping the factory result.\n *\n * @example\n * ```typescript\n * // Sync factory\n * const syncDefine = GqlDefine.create(() => 42);\n *\n * // Async factory\n * const asyncDefine = GqlDefine.create(async () => {\n * const data = await fetch('/api/config');\n * return data.json();\n * });\n * ```\n */\n static create<TValue>(factory: () => TValue | Promise<TValue>): GqlDefine<TValue> {\n return new GqlDefine((_context) => {\n const result = factory();\n // Handle async factories\n if (isPromiseLike<TValue>(result)) {\n return result.then((value) => ({ factoryResult: value }));\n }\n return { factoryResult: result as TValue };\n });\n }\n}\n","/**\n * Fragment types for reusable field selections.\n * @module\n */\n\nimport type { OptionalArg } from \"../../utils/empty-object\";\nimport type { AnyAssignableInput, AnyFieldsExtended, AssignableInputFromVarDefs, InferFieldsExtended } from \"../fragment\";\nimport type { AnyGraphqlSchema } from \"../schema\";\nimport type { VariableDefinitions } from \"../type-foundation\";\nimport { GqlElement } from \"./gql-element\";\n\n/**\n * Type alias for any Fragment instance.\n */\nexport type AnyFragment = Fragment<string, any, any, any>;\n\n/**\n * Type inference metadata for fragments.\n * Access via `typeof fragment.$infer`.\n */\nexport type FragmentInferMeta<TVariables, TOutput extends object> = {\n readonly input: TVariables;\n readonly output: TOutput;\n};\n\n/**\n * Internal artifact shape produced by fragment evaluation.\n * @internal\n */\ninterface FragmentArtifact<\n TTypeName extends string,\n TVariables extends Partial<AnyAssignableInput> | void,\n TFields extends Partial<AnyFieldsExtended>,\n> {\n readonly typename: TTypeName;\n readonly key: string | undefined;\n readonly schemaLabel: string;\n readonly variableDefinitions: VariableDefinitions;\n readonly spread: (...args: TVariables extends void ? [] : [variables: TVariables]) => TFields;\n}\n\ndeclare const __FRAGMENT_BRAND__: unique symbol;\n\n/**\n * Represents a reusable GraphQL field selection on a specific type.\n *\n * Fragments are created via `gql(({ fragment }) => fragment(\"Name\", \"TypeName\")\\`{ ... }\\`())`.\n * Use `spread()` to include the fragment's fields in an operation.\n *\n * @template TTypeName - The GraphQL type this fragment selects from\n * @template TVariables - Variables required when spreading\n * @template TFields - The selected fields structure\n * @template TOutput - Inferred output type from selected fields\n */\nexport class Fragment<\n TTypeName extends string,\n TVariables extends Partial<AnyAssignableInput> | void,\n TFields extends Partial<AnyFieldsExtended>,\n TOutput extends object,\n >\n extends GqlElement<FragmentArtifact<TTypeName, TVariables, TFields>, FragmentInferMeta<TVariables, TOutput>>\n implements FragmentArtifact<TTypeName, TVariables, TFields>\n{\n private declare readonly [__FRAGMENT_BRAND__]: void;\n\n private constructor(define: () => FragmentArtifact<TTypeName, TVariables, TFields>) {\n super(define);\n }\n\n /** The GraphQL type name this fragment selects from. */\n public get typename() {\n return GqlElement.get(this).typename;\n }\n\n /** Optional unique key for prebuilt type lookup. */\n public get key() {\n return GqlElement.get(this).key;\n }\n\n /** The schema label this fragment belongs to. */\n public get schemaLabel() {\n return GqlElement.get(this).schemaLabel;\n }\n\n /** Variable definitions for this fragment. */\n public get variableDefinitions() {\n return GqlElement.get(this).variableDefinitions;\n }\n\n /**\n * Spreads this fragment's fields into a parent selection.\n * Pass variables if the fragment defines any.\n */\n public get spread() {\n return GqlElement.get(this).spread;\n }\n\n /**\n * Creates a new Fragment instance.\n * Prefer using the `gql(({ fragment }) => ...)` API instead.\n * @internal\n */\n static create<\n TSchema extends AnyGraphqlSchema,\n TTypeName extends keyof TSchema[\"object\"] & string,\n TVariableDefinitions extends VariableDefinitions,\n TFields extends AnyFieldsExtended,\n >(\n define: () => {\n typename: TTypeName;\n key: string | undefined;\n schemaLabel: TSchema[\"label\"];\n variableDefinitions: TVariableDefinitions;\n spread: (\n ...args: OptionalArg<AssignableInputFromVarDefs<TSchema, TVariableDefinitions>> extends void\n ? []\n : [variables: OptionalArg<AssignableInputFromVarDefs<TSchema, TVariableDefinitions>>]\n ) => TFields;\n },\n ) {\n type Fields = TFields & { [key: symbol]: never };\n type Output = InferFieldsExtended<TSchema, TTypeName, TFields> & { [key: symbol]: never };\n type Variables = OptionalArg<AssignableInputFromVarDefs<TSchema, TVariableDefinitions>>;\n\n return new Fragment<TTypeName, Variables, Fields, Output>(define as () => FragmentArtifact<TTypeName, Variables, Fields>);\n }\n}\n","/**\n * Operation types for GraphQL queries, mutations, and subscriptions.\n * @module\n */\n\nimport type { TypedDocumentNode } from \"@graphql-typed-document-node/core\";\nimport type { AnyFieldsExtended, InferFieldsExtended } from \"../fragment\";\nimport type { AnyGraphqlSchema, ConstAssignableInputFromVarDefs, OperationType } from \"../schema\";\nimport type { VariableDefinitions } from \"../type-foundation\";\nimport { GqlElement, type GqlElementContext } from \"./gql-element\";\n\n/**\n * Type alias for any Operation instance.\n */\nexport type AnyOperation = AnyOperationOf<\"query\"> | AnyOperationOf<\"mutation\"> | AnyOperationOf<\"subscription\">;\n\n/**\n * Type alias for an Operation of a specific type.\n */\nexport type AnyOperationOf<TOperationType extends OperationType> = Operation<TOperationType, string, string[], any, any, any>;\n\n/**\n * Type inference metadata for operations.\n * Access via `typeof operation.$infer`.\n */\nexport type OperationInferMeta<TVariables, TData extends object> = {\n readonly input: TVariables;\n readonly output: TData;\n};\n\ndeclare const __OPERATION_BRAND__: unique symbol;\n\n/**\n * Internal artifact shape produced by operation evaluation.\n * @internal\n */\ntype OperationArtifact<\n TOperationType extends OperationType,\n TOperationName extends string,\n TVariableNames extends string[],\n TVariables extends Record<string, unknown>,\n TFields extends Partial<AnyFieldsExtended>,\n TData extends object,\n> = {\n readonly operationType: TOperationType;\n readonly operationName: TOperationName;\n readonly schemaLabel: string;\n readonly variableNames: TVariableNames;\n readonly documentSource: () => TFields;\n readonly document: TypedDocumentNode<TData, TVariables>;\n readonly metadata?: unknown;\n};\n\n/**\n * Represents a GraphQL operation (query, mutation, or subscription).\n *\n * Operations are created via `gql(({ query }) => query(\"Name\")\\`{ ... }\\`())`.\n * Produces a TypedDocumentNode for type-safe execution with GraphQL clients.\n *\n * @template TOperationType - 'query' | 'mutation' | 'subscription'\n * @template TOperationName - The unique operation name\n * @template TVariableNames - Tuple of variable names\n * @template TVariables - Variable types for the operation\n * @template TFields - Selected fields structure\n * @template TData - Inferred response data type\n */\nexport class Operation<\n TOperationType extends OperationType,\n TOperationName extends string,\n TVariableNames extends string[],\n TVariables extends Record<string, unknown>,\n TFields extends Partial<AnyFieldsExtended>,\n TData extends object,\n >\n extends GqlElement<\n OperationArtifact<TOperationType, TOperationName, TVariableNames, TVariables, TFields, TData>,\n OperationInferMeta<TVariables, TData>\n >\n implements OperationArtifact<TOperationType, TOperationName, TVariableNames, TVariables, TFields, TData>\n{\n private declare readonly [__OPERATION_BRAND__]: void;\n\n private constructor(\n define: (\n context: GqlElementContext | null,\n ) =>\n | OperationArtifact<TOperationType, TOperationName, TVariableNames, TVariables, TFields, TData>\n | Promise<OperationArtifact<TOperationType, TOperationName, TVariableNames, TVariables, TFields, TData>>,\n ) {\n super(define);\n }\n\n /** The operation type: 'query', 'mutation', or 'subscription'. */\n public get operationType() {\n return GqlElement.get(this).operationType;\n }\n\n /** The unique name of this operation. */\n public get operationName() {\n return GqlElement.get(this).operationName;\n }\n\n /** The schema label this operation belongs to. */\n public get schemaLabel() {\n return GqlElement.get(this).schemaLabel;\n }\n\n /** List of variable names defined for this operation. */\n public get variableNames() {\n return GqlElement.get(this).variableNames;\n }\n\n /**\n * Returns the field selections. Used for document reconstruction.\n * @internal\n */\n public get documentSource() {\n return GqlElement.get(this).documentSource;\n }\n\n /** The TypedDocumentNode for use with GraphQL clients. */\n public get document() {\n return GqlElement.get(this).document;\n }\n\n /** Custom metadata attached to this operation, if any. */\n public get metadata() {\n return GqlElement.get(this).metadata;\n }\n\n /**\n * Creates a new Operation instance.\n * Prefer using the `gql(({ query }) => ...)` API instead.\n * @internal\n */\n static create<\n TSchema extends AnyGraphqlSchema,\n TOperationType extends OperationType,\n TOperationName extends string,\n TVariableDefinitions extends VariableDefinitions,\n TFields extends AnyFieldsExtended,\n >(\n define: (context: GqlElementContext | null) =>\n | {\n operationType: TOperationType;\n operationName: TOperationName;\n schemaLabel: TSchema[\"label\"];\n variableNames: (keyof TVariableDefinitions & string)[];\n documentSource: () => TFields;\n document: TypedDocumentNode<\n InferFieldsExtended<TSchema, TSchema[\"operations\"][TOperationType] & keyof TSchema[\"object\"] & string, TFields>,\n ConstAssignableInputFromVarDefs<TSchema, TVariableDefinitions>\n >;\n metadata?: unknown;\n }\n | Promise<{\n operationType: TOperationType;\n operationName: TOperationName;\n schemaLabel: TSchema[\"label\"];\n variableNames: (keyof TVariableDefinitions & string)[];\n documentSource: () => TFields;\n document: TypedDocumentNode<\n InferFieldsExtended<TSchema, TSchema[\"operations\"][TOperationType] & keyof TSchema[\"object\"] & string, TFields>,\n ConstAssignableInputFromVarDefs<TSchema, TVariableDefinitions>\n >;\n metadata?: unknown;\n }>,\n ) {\n return new Operation(define);\n }\n}\n","/**\n * Compat tagged template function for creating deferred GraphQL operation specs.\n * @module\n */\n\nimport { Kind, parse as parseGraphql } from \"graphql\";\nimport { GqlDefine } from \"../types/element\";\nimport type { TemplateCompatSpec } from \"../types/element/compat-spec\";\nimport type { AnyGraphqlSchema, OperationType } from \"../types/schema\";\n\n/** Tagged template function type for compat operations. */\nexport type CompatTaggedTemplate = (strings: TemplateStringsArray, ...values: never[]) => GqlDefine<TemplateCompatSpec>;\n\n/** Curried compat function type: query.compat(\"name\")`{ fields }` */\nexport type CurriedCompatFunction = (operationName: string) => CompatTaggedTemplate;\n\n/**\n * Creates a curried tagged template function for compat mode operations.\n * New API: `query.compat(\"name\")\\`($vars) { fields }\\`` returns GqlDefine<TemplateCompatSpec>.\n *\n * @param schema - The GraphQL schema definition\n * @param operationType - The operation type (query, mutation, subscription)\n */\nexport const createCompatTaggedTemplate = <TSchema extends AnyGraphqlSchema>(\n schema: TSchema,\n operationType: OperationType,\n): CurriedCompatFunction => {\n const operationTypeName = schema.operations[operationType];\n if (operationTypeName === null) {\n throw new Error(`Operation type ${operationType} is not defined in schema roots`);\n }\n\n return (operationName: string): CompatTaggedTemplate => {\n return (strings: TemplateStringsArray, ...values: never[]): GqlDefine<TemplateCompatSpec> => {\n if (values.length > 0) {\n throw new Error(\"Tagged templates must not contain interpolated expressions\");\n }\n\n const body = strings[0] ?? \"\";\n\n // Construct synthetic GraphQL source from JS args and template body\n const source = `${operationType} ${operationName} ${body.trim()}`;\n\n let document: import(\"graphql\").DocumentNode;\n try {\n document = parseGraphql(source);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`GraphQL parse error in tagged template: ${message}`);\n }\n\n const opDefs = document.definitions.filter((def) => def.kind === Kind.OPERATION_DEFINITION);\n if (opDefs.length !== 1) {\n throw new Error(`Internal error: expected exactly one operation definition in synthesized source`);\n }\n\n // biome-ignore lint/style/noNonNullAssertion: Length checked above\n const opNode = opDefs[0]!;\n if (opNode.kind !== Kind.OPERATION_DEFINITION) {\n throw new Error(\"Unexpected definition kind\");\n }\n\n return GqlDefine.create(() => ({\n schema,\n operationType,\n operationName,\n graphqlSource: source,\n }));\n };\n };\n};\n","/**\n * Directive builder utilities for creating field-level directives.\n *\n * Provides type-safe methods for creating directive references that can be\n * applied to field selections. The builder follows a similar pattern to\n * the variable builder ($var).\n *\n * @module\n */\n\nimport {\n type AnyDirectiveRef,\n type DirectiveArgumentSpecifier,\n type DirectiveLocation,\n DirectiveRef,\n} from \"../types/type-foundation/directive-ref\";\nimport type { AnyVarRef } from \"../types/type-foundation/var-ref\";\n\n/**\n * A method that creates a DirectiveRef with specific type information.\n * The TArgs type defines the expected argument shape for the directive.\n */\nexport type DirectiveMethod<TDirectiveName extends string, TLocations extends readonly DirectiveLocation[], TArgs> = (\n args: TArgs,\n) => DirectiveRef<{\n directiveName: TDirectiveName;\n locations: TLocations;\n}>;\n\n/**\n * Type for directive arguments that can include VarRef values.\n * This allows using variables in directive arguments like `{ if: $.shouldSkip }`.\n */\nexport type DirectiveArgValue = boolean | string | number | null | AnyVarRef;\n\n/**\n * Standard GraphQL directives that are always available.\n */\nexport type StandardDirectives = {\n /**\n * @skip directive - conditionally skip a field.\n * @example\n * ```typescript\n * f.email({}, { directives: [$dir.skip({ if: $.hideEmail })] })\n * ```\n */\n skip: DirectiveMethod<\"skip\", readonly [\"FIELD\", \"FRAGMENT_SPREAD\", \"INLINE_FRAGMENT\"], { if: DirectiveArgValue }>;\n\n /**\n * @include directive - conditionally include a field.\n * @example\n * ```typescript\n * f.email({}, { directives: [$dir.include({ if: $.showEmail })] })\n * ```\n */\n include: DirectiveMethod<\"include\", readonly [\"FIELD\", \"FRAGMENT_SPREAD\", \"INLINE_FRAGMENT\"], { if: DirectiveArgValue }>;\n};\n\n/**\n * Creates a directive method factory for a specific directive.\n *\n * @param name - The directive name (without @)\n * @param locations - Valid locations where the directive can be applied\n * @returns A function that creates DirectiveRef instances\n *\n * @example\n * ```typescript\n * const skipMethod = createDirectiveMethod(\"skip\", [\"FIELD\", \"FRAGMENT_SPREAD\", \"INLINE_FRAGMENT\"] as const);\n * const skipDirective = skipMethod({ if: true });\n * ```\n */\nexport const createDirectiveMethod = <TDirectiveName extends string, const TLocations extends readonly DirectiveLocation[]>(\n name: TDirectiveName,\n locations: TLocations,\n): (<TArgs extends Record<string, unknown>>(\n args: TArgs,\n) => DirectiveRef<{\n directiveName: TDirectiveName;\n locations: TLocations;\n}>) => {\n return (args) =>\n new DirectiveRef({\n name,\n arguments: args,\n locations,\n }) as DirectiveRef<{\n directiveName: TDirectiveName;\n locations: TLocations;\n }>;\n};\n\n/**\n * Type for directive argument specifiers.\n * Maps argument names to their type information.\n */\nexport type DirectiveArgumentSpecifiers = {\n readonly [argName: string]: DirectiveArgumentSpecifier;\n};\n\n/**\n * Creates a typed directive method with argument type specifiers.\n * Enables enum value output in directive arguments.\n *\n * @param name - The directive name (without @)\n * @param locations - Valid locations where the directive can be applied\n * @param argSpecs - Type specifiers for directive arguments (deferred string format)\n * @returns A function that creates DirectiveRef instances with argument type info\n *\n * @example\n * ```typescript\n * const authMethod = createTypedDirectiveMethod(\n * \"auth\",\n * [\"FIELD\"] as const,\n * { role: \"e|Role|!\" }\n * );\n * const authDirective = authMethod({ role: \"ADMIN\" });\n * ```\n */\nexport const createTypedDirectiveMethod = <\n TDirectiveName extends string,\n const TLocations extends readonly DirectiveLocation[],\n const TArgSpecs extends DirectiveArgumentSpecifiers,\n>(\n name: TDirectiveName,\n locations: TLocations,\n argSpecs: TArgSpecs,\n): (<TArgs extends Record<string, unknown>>(\n args: TArgs,\n) => DirectiveRef<{\n directiveName: TDirectiveName;\n locations: TLocations;\n}>) => {\n return (args) =>\n new DirectiveRef({\n name,\n arguments: args,\n locations,\n argumentSpecs: argSpecs,\n }) as DirectiveRef<{\n directiveName: TDirectiveName;\n locations: TLocations;\n }>;\n};\n\n/**\n * Standard directive locations for @skip and @include.\n */\nconst CONDITIONAL_DIRECTIVE_LOCATIONS = [\"FIELD\", \"FRAGMENT_SPREAD\", \"INLINE_FRAGMENT\"] as const;\n\n/**\n * Creates the standard GraphQL directives (@skip, @include).\n * These are always available regardless of schema definition.\n *\n * @returns Object containing skip and include directive methods\n *\n * @example\n * ```typescript\n * const $dir = createStandardDirectives();\n * const skipDirective = $dir.skip({ if: true });\n * ```\n */\nexport const createStandardDirectives = (): StandardDirectives => ({\n skip: createDirectiveMethod(\"skip\", CONDITIONAL_DIRECTIVE_LOCATIONS),\n include: createDirectiveMethod(\"include\", CONDITIONAL_DIRECTIVE_LOCATIONS),\n});\n\n/**\n * Type for any directive method (type-erased).\n */\n// biome-ignore lint/suspicious/noExplicitAny: intentionally erased for flexibility\nexport type AnyDirectiveMethod = (args: any) => AnyDirectiveRef;\n\n/**\n * Type for the directive builder that includes standard directives\n * and can be extended with schema-specific directives.\n */\nexport type DirectiveBuilder<TCustomDirectives extends Record<string, AnyDirectiveMethod> = {}> = StandardDirectives &\n TCustomDirectives;\n\n/**\n * Creates a directive builder with standard directives and optional custom directives.\n *\n * @param customDirectives - Additional directive methods from schema (generated by codegen)\n * @returns Combined directive builder with all available directives\n *\n * @internal Used by codegen to create schema-specific directive builders\n */\nexport const createDirectiveBuilder = <TCustomDirectives extends Record<string, AnyDirectiveMethod> = {}>(\n customDirectives?: TCustomDirectives,\n): DirectiveBuilder<TCustomDirectives> => {\n return {\n ...createStandardDirectives(),\n ...(customDirectives ?? ({} as TCustomDirectives)),\n };\n};\n\n/**\n * Type guard to check if a value is a DirectiveRef.\n *\n * @param value - Value to check\n * @returns True if value is a DirectiveRef instance\n */\nexport const isDirectiveRef = (value: unknown): value is AnyDirectiveRef => {\n return value instanceof DirectiveRef;\n};\n","/**\n * Preprocessor for Fragment Arguments RFC syntax.\n *\n * Strips fragment argument declarations and spread arguments by replacing\n * them with equal-length whitespace to preserve line/column alignment.\n *\n * @module\n */\n\n/** Result of fragment arguments preprocessing. */\nexport type PreprocessResult = {\n /** Content with Fragment Arguments syntax replaced by whitespace. */\n readonly preprocessed: string;\n /** Whether any preprocessing was applied. */\n readonly modified: boolean;\n};\n\n/**\n * Find the matching closing parenthesis for a balanced group.\n * Handles nested parentheses, string literals, and comments.\n * Returns the index of the closing ')' or -1 if not found.\n */\nexport const findMatchingParen = (content: string, openIndex: number): number => {\n let depth = 1;\n let inString: false | '\"' | \"'\" = false;\n\n for (let i = openIndex + 1; i < content.length; i++) {\n // biome-ignore lint/style/noNonNullAssertion: Loop index is within bounds\n const ch = content[i]!;\n\n if (inString) {\n if (ch === inString) {\n let backslashes = 0;\n for (let j = i - 1; j >= 0 && content[j] === \"\\\\\"; j--) {\n backslashes++;\n }\n if (backslashes % 2 === 0) {\n inString = false;\n }\n }\n continue;\n }\n\n if (ch === '\"' || ch === \"'\") {\n inString = ch;\n continue;\n }\n\n if (ch === \"(\") {\n depth++;\n } else if (ch === \")\") {\n depth--;\n if (depth === 0) {\n return i;\n }\n }\n }\n\n return -1;\n};\n\n/**\n * Replace a range [start, end] (inclusive) with spaces, preserving newlines.\n */\nconst replaceWithSpaces = (content: string, start: number, end: number): string => {\n let result = content.slice(0, start);\n for (let i = start; i <= end; i++) {\n result += content[i] === \"\\n\" ? \"\\n\" : \" \";\n }\n result += content.slice(end + 1);\n return result;\n};\n\n// Pattern: fragment Name( at word boundary, not followed by \"on\"\nconst FRAGMENT_DEF_PATTERN = /\\bfragment\\s+(\\w+)\\s*\\(/g;\n\n// Pattern: ...FragmentName(\nconst FRAGMENT_SPREAD_PATTERN = /\\.\\.\\.(\\w+)\\s*\\(/g;\n\n/**\n * Preprocess Fragment Arguments RFC syntax by replacing argument lists with spaces.\n *\n * Transforms:\n * - `fragment UserProfile($showEmail: Boolean = false) on User` -> `fragment UserProfile on User`\n * - `...UserProfile(showEmail: true)` -> `...UserProfile `\n */\nexport const preprocessFragmentArgs = (content: string): PreprocessResult => {\n let result = content;\n let modified = false;\n\n // Pass 1: Fragment definition arguments\n // Match \"fragment Name(\" and find the matching \")\" to strip\n let match: RegExpExecArray | null;\n FRAGMENT_DEF_PATTERN.lastIndex = 0;\n while ((match = FRAGMENT_DEF_PATTERN.exec(result)) !== null) {\n const openParenIndex = match.index + match[0].length - 1;\n\n // Check that the next non-whitespace after \")\" is \"on\" (to distinguish from non-fragment-args parens)\n const closeParenIndex = findMatchingParen(result, openParenIndex);\n if (closeParenIndex === -1) {\n continue;\n }\n\n // Verify this is a fragment definition (followed by \"on\")\n const afterParen = result.slice(closeParenIndex + 1).trimStart();\n if (!afterParen.startsWith(\"on\")) {\n continue;\n }\n\n result = replaceWithSpaces(result, openParenIndex, closeParenIndex);\n modified = true;\n // Reset regex since we modified the string (positions may shift)\n FRAGMENT_DEF_PATTERN.lastIndex = 0;\n }\n\n // Pass 2: Fragment spread arguments\n FRAGMENT_SPREAD_PATTERN.lastIndex = 0;\n while ((match = FRAGMENT_SPREAD_PATTERN.exec(result)) !== null) {\n const openParenIndex = match.index + match[0].length - 1;\n const closeParenIndex = findMatchingParen(result, openParenIndex);\n if (closeParenIndex === -1) {\n continue;\n }\n\n result = replaceWithSpaces(result, openParenIndex, closeParenIndex);\n modified = true;\n FRAGMENT_SPREAD_PATTERN.lastIndex = 0;\n }\n\n return { preprocessed: result, modified };\n};\n","/**\n * Self-contained Result type for GraphQL parser utilities.\n * Avoids neverthrow dependency in @soda-gql/core.\n * @module\n */\n\n/** Discriminated union: ok=true carries value, ok=false carries error */\nexport type Result<T, E> = OkResult<T> | ErrResult<E>;\n\nexport type OkResult<T> = {\n readonly ok: true;\n readonly value: T;\n};\n\nexport type ErrResult<E> = {\n readonly ok: false;\n readonly error: E;\n};\n\n/** Create a successful Result */\nexport const ok = <T>(value: T): OkResult<T> => ({\n ok: true,\n value,\n});\n\n/** Create a failed Result */\nexport const err = <E>(error: E): ErrResult<E> => ({\n ok: false,\n error,\n});\n","/**\n * GraphQL parser utilities.\n * Extracts operations and fragments from GraphQL source strings.\n * @module\n */\n\nimport {\n type ArgumentNode,\n type DocumentNode,\n type FieldNode,\n type FragmentDefinitionNode,\n type FragmentSpreadNode,\n type InlineFragmentNode,\n Kind,\n type OperationDefinitionNode,\n parse,\n type SelectionNode,\n type TypeNode,\n type ValueNode,\n type VariableDefinitionNode,\n} from \"graphql\";\nimport { err, ok, type Result } from \"./result\";\n\nimport type {\n GraphqlAnalysisError,\n ParsedArgument,\n ParsedFieldSelection,\n ParsedFragment,\n ParsedFragmentSpread,\n ParsedInlineFragment,\n ParsedOperation,\n ParsedSelection,\n ParsedValue,\n ParsedVariable,\n ParseResult,\n TypeInfo,\n} from \"./types\";\n\n/** Parse GraphQL source string directly. No file I/O. */\nexport const parseGraphqlSource = (source: string, sourceFile: string): Result<ParseResult, GraphqlAnalysisError> => {\n try {\n const document = parse(source);\n return ok({ document, ...extractFromDocument(document, sourceFile) });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return err({\n code: \"GRAPHQL_PARSE_ERROR\",\n message: `GraphQL parse error: ${message}`,\n filePath: sourceFile,\n });\n }\n};\n\n/**\n * Parse a GraphQL TypeNode into type name and modifier.\n *\n * Format: inner nullability + list modifiers\n * - Inner: `!` (non-null) or `?` (nullable)\n * - List: `[]!` (non-null list) or `[]?` (nullable list)\n */\nexport const parseTypeNode = (node: TypeNode): TypeInfo => {\n type TypeLevel = { kind: \"list\" | \"named\"; nonNull: boolean };\n const levels: TypeLevel[] = [];\n\n const collect = (n: TypeNode, nonNull: boolean): string => {\n if (n.kind === Kind.NON_NULL_TYPE) {\n return collect(n.type, true);\n }\n if (n.kind === Kind.LIST_TYPE) {\n levels.push({ kind: \"list\", nonNull });\n return collect(n.type, false);\n }\n levels.push({ kind: \"named\", nonNull });\n return n.name.value;\n };\n\n const typeName = collect(node, false);\n\n // Build modifier from levels (reverse order)\n let modifier = \"?\";\n for (const level of levels.slice().reverse()) {\n if (level.kind === \"named\") {\n modifier = level.nonNull ? \"!\" : \"?\";\n continue;\n }\n const listSuffix = level.nonNull ? \"[]!\" : \"[]?\";\n modifier = `${modifier}${listSuffix}`;\n }\n\n return { typeName, modifier };\n};\n\n/** Extract operations and fragments from a parsed GraphQL document. */\nconst extractFromDocument = (\n document: DocumentNode,\n sourceFile: string,\n): { operations: ParsedOperation[]; fragments: ParsedFragment[] } => {\n const operations: ParsedOperation[] = [];\n const fragments: ParsedFragment[] = [];\n\n for (const definition of document.definitions) {\n if (definition.kind === Kind.OPERATION_DEFINITION) {\n const operation = extractOperation(definition, sourceFile);\n if (operation) {\n operations.push(operation);\n }\n } else if (definition.kind === Kind.FRAGMENT_DEFINITION) {\n fragments.push(extractFragment(definition, sourceFile));\n }\n }\n\n return { operations, fragments };\n};\n\n/** Extract a single operation from an OperationDefinitionNode. */\nconst extractOperation = (node: OperationDefinitionNode, sourceFile: string): ParsedOperation | null => {\n if (!node.name) {\n return null;\n }\n\n const variables: ParsedVariable[] = (node.variableDefinitions ?? []).map(extractVariable);\n const selections = extractSelections(node.selectionSet.selections);\n\n return {\n kind: node.operation,\n name: node.name.value,\n variables,\n selections,\n sourceFile,\n };\n};\n\n/** Extract a fragment from a FragmentDefinitionNode. */\nconst extractFragment = (node: FragmentDefinitionNode, sourceFile: string): ParsedFragment => {\n const selections = extractSelections(node.selectionSet.selections);\n\n return {\n name: node.name.value,\n onType: node.typeCondition.name.value,\n selections,\n sourceFile,\n };\n};\n\n/** Extract a variable definition. */\nconst extractVariable = (node: VariableDefinitionNode): ParsedVariable => {\n const { typeName, modifier } = parseTypeNode(node.type);\n const defaultValue = node.defaultValue ? extractValue(node.defaultValue) : undefined;\n\n return {\n name: node.variable.name.value,\n typeName,\n modifier,\n typeKind: \"scalar\",\n defaultValue,\n };\n};\n\n/** Extract selections from a SelectionSet. */\nconst extractSelections = (selections: readonly SelectionNode[]): ParsedSelection[] => {\n return selections.map(extractSelection);\n};\n\n/** Extract a single selection. */\nconst extractSelection = (node: SelectionNode): ParsedSelection => {\n switch (node.kind) {\n case Kind.FIELD:\n return extractFieldSelection(node);\n case Kind.FRAGMENT_SPREAD:\n return extractFragmentSpread(node);\n case Kind.INLINE_FRAGMENT:\n return extractInlineFragment(node);\n }\n};\n\n/** Extract a field selection. */\nconst extractFieldSelection = (node: FieldNode): ParsedFieldSelection => {\n const args = node.arguments?.length ? node.arguments.map(extractArgument) : undefined;\n const selections = node.selectionSet ? extractSelections(node.selectionSet.selections) : undefined;\n\n return {\n kind: \"field\",\n name: node.name.value,\n alias: node.alias?.value,\n arguments: args,\n selections,\n };\n};\n\n/** Extract a fragment spread. */\nconst extractFragmentSpread = (node: FragmentSpreadNode): ParsedFragmentSpread => {\n return {\n kind: \"fragmentSpread\",\n name: node.name.value,\n };\n};\n\n/** Extract an inline fragment. */\nconst extractInlineFragment = (node: InlineFragmentNode): ParsedInlineFragment => {\n return {\n kind: \"inlineFragment\",\n onType: node.typeCondition?.name.value ?? \"\",\n selections: extractSelections(node.selectionSet.selections),\n };\n};\n\n/** Extract an argument. */\nconst extractArgument = (node: ArgumentNode): ParsedArgument => {\n return {\n name: node.name.value,\n value: extractValue(node.value),\n };\n};\n\n/** Assert unreachable code path (for exhaustiveness checks). */\nconst assertUnreachable = (value: never): never => {\n throw new Error(`Unexpected value: ${JSON.stringify(value)}`);\n};\n\n/** Extract a value (literal or variable reference). */\nconst extractValue = (node: ValueNode): ParsedValue => {\n switch (node.kind) {\n case Kind.VARIABLE:\n return { kind: \"variable\", name: node.name.value };\n case Kind.INT:\n return { kind: \"int\", value: node.value };\n case Kind.FLOAT:\n return { kind: \"float\", value: node.value };\n case Kind.STRING:\n return { kind: \"string\", value: node.value };\n case Kind.BOOLEAN:\n return { kind: \"boolean\", value: node.value };\n case Kind.NULL:\n return { kind: \"null\" };\n case Kind.ENUM:\n return { kind: \"enum\", value: node.value };\n case Kind.LIST:\n return { kind: \"list\", values: node.values.map(extractValue) };\n case Kind.OBJECT:\n return {\n kind: \"object\",\n fields: node.fields.map((field) => ({\n name: field.name.value,\n value: extractValue(field.value),\n })),\n };\n default:\n return assertUnreachable(node);\n }\n};\n","/**\n * Adapter to create a minimal SchemaIndex from AnyGraphqlSchema.\n * Only name-level Maps are populated (.has() lookups work).\n * Field-level data is NOT populated.\n * @module\n */\n\nimport type { AnyGraphqlSchema } from \"../types/schema/schema\";\nimport type { SchemaIndex } from \"./schema-index\";\n\n/**\n * Create a minimal SchemaIndex from AnyGraphqlSchema.\n *\n * IMPORTANT: This adapter produces a \"name-resolution only\" SchemaIndex.\n * Only the name-level Maps are populated (.has() lookups work).\n * Field-level data (FieldDefinitionNode, InputValueDefinitionNode, etc.)\n * is NOT populated -- those Maps are empty.\n *\n * Use this when you need SchemaIndex for type kind resolution only\n * (e.g., buildVarSpecifier). For full SchemaIndex with field-level data,\n * use createSchemaIndex(DocumentNode) from schema-index.ts.\n */\nexport const createSchemaIndexFromSchema = (schema: AnyGraphqlSchema): SchemaIndex => {\n const scalars: SchemaIndex[\"scalars\"] = new Map(Object.keys(schema.scalar).map((n) => [n, { name: n, directives: [] }]));\n const enums: SchemaIndex[\"enums\"] = new Map(\n Object.keys(schema.enum).map((n) => [n, { name: n, values: new Map(), directives: [] }]),\n );\n const inputs: SchemaIndex[\"inputs\"] = new Map(\n Object.keys(schema.input).map((n) => [n, { name: n, fields: new Map(), directives: [] }]),\n );\n const objects: SchemaIndex[\"objects\"] = new Map(\n Object.keys(schema.object).map((n) => [n, { name: n, fields: new Map(), directives: [] }]),\n );\n const unions: SchemaIndex[\"unions\"] = new Map(\n Object.keys(schema.union).map((n) => [n, { name: n, members: new Map(), directives: [] }]),\n );\n\n return {\n objects,\n inputs,\n enums,\n unions,\n scalars,\n directives: new Map(),\n operationTypes: {\n query: schema.operations.query ?? undefined,\n mutation: schema.operations.mutation ?? undefined,\n subscription: schema.operations.subscription ?? undefined,\n },\n };\n};\n","/**\n * SchemaIndex type and factory for building a schema index from a GraphQL DocumentNode.\n * Extracted from packages/codegen/src/generator.ts for shared use.\n * @module\n */\n\nimport type {\n ConstDirectiveNode,\n DocumentNode,\n EnumValueDefinitionNode,\n FieldDefinitionNode,\n InputValueDefinitionNode,\n NamedTypeNode,\n SchemaDefinitionNode,\n SchemaExtensionNode,\n} from \"graphql\";\nimport { Kind } from \"graphql\";\n\nexport type OperationTypeNames = {\n query?: string;\n mutation?: string;\n subscription?: string;\n};\n\nexport type ObjectRecord = {\n readonly name: string;\n readonly fields: Map<string, FieldDefinitionNode>;\n directives: ConstDirectiveNode[];\n};\n\nexport type InputRecord = {\n readonly name: string;\n readonly fields: Map<string, InputValueDefinitionNode>;\n directives: ConstDirectiveNode[];\n};\n\nexport type EnumRecord = {\n readonly name: string;\n readonly values: Map<string, EnumValueDefinitionNode>;\n directives: ConstDirectiveNode[];\n};\n\nexport type UnionRecord = {\n readonly name: string;\n readonly members: Map<string, NamedTypeNode>;\n directives: ConstDirectiveNode[];\n};\n\nexport type ScalarRecord = {\n readonly name: string;\n directives: ConstDirectiveNode[];\n};\n\nexport type DirectiveRecord = {\n readonly name: string;\n readonly locations: readonly string[];\n readonly args: Map<string, InputValueDefinitionNode>;\n readonly isRepeatable: boolean;\n};\n\nexport type SchemaIndex = {\n readonly objects: Map<string, ObjectRecord>;\n readonly inputs: Map<string, InputRecord>;\n readonly enums: Map<string, EnumRecord>;\n readonly unions: Map<string, UnionRecord>;\n readonly scalars: Map<string, ScalarRecord>;\n readonly directives: Map<string, DirectiveRecord>;\n readonly operationTypes: OperationTypeNames;\n};\n\nconst ensureRecord = <T>(collection: Map<string, T>, key: string, factory: (name: string) => T): T => {\n const existing = collection.get(key);\n if (existing) {\n return existing;\n }\n const created = factory(key);\n collection.set(key, created);\n return created;\n};\n\nconst addObjectFields = (target: Map<string, FieldDefinitionNode>, fields: readonly FieldDefinitionNode[] | undefined): void => {\n if (!fields) return;\n for (const field of fields) {\n target.set(field.name.value, field);\n }\n};\n\nconst addInputFields = (\n target: Map<string, InputValueDefinitionNode>,\n fields: readonly InputValueDefinitionNode[] | undefined,\n): void => {\n if (!fields) return;\n for (const field of fields) {\n target.set(field.name.value, field);\n }\n};\n\nconst addEnumValues = (\n target: Map<string, EnumValueDefinitionNode>,\n values: readonly EnumValueDefinitionNode[] | undefined,\n): void => {\n if (!values) return;\n for (const value of values) {\n target.set(value.name.value, value);\n }\n};\n\nconst addUnionMembers = (target: Map<string, NamedTypeNode>, members: readonly NamedTypeNode[] | undefined): void => {\n if (!members) return;\n for (const member of members) {\n target.set(member.name.value, member);\n }\n};\n\nconst mergeDirectives = (\n existing: ConstDirectiveNode[] | undefined,\n incoming: readonly ConstDirectiveNode[] | undefined,\n precedence: \"definition\" | \"extension\",\n): ConstDirectiveNode[] => {\n const current = existing ?? [];\n const next = incoming ? Array.from(incoming) : [];\n return precedence === \"definition\" ? [...next, ...current] : [...current, ...next];\n};\n\nconst updateOperationTypes = (\n operationTypes: OperationTypeNames,\n definition: SchemaDefinitionNode | SchemaExtensionNode,\n): void => {\n for (const operation of definition.operationTypes ?? []) {\n const typeName = operation.type.name.value;\n switch (operation.operation) {\n case \"query\":\n operationTypes.query = typeName;\n break;\n case \"mutation\":\n operationTypes.mutation = typeName;\n break;\n case \"subscription\":\n operationTypes.subscription = typeName;\n break;\n default:\n break;\n }\n }\n};\n\nconst addDirectiveArgs = (\n target: Map<string, InputValueDefinitionNode>,\n args: readonly InputValueDefinitionNode[] | undefined,\n): void => {\n if (!args) return;\n for (const arg of args) {\n target.set(arg.name.value, arg);\n }\n};\n\n/** Build a schema index from a parsed GraphQL schema document. */\nexport const createSchemaIndex = (document: DocumentNode): SchemaIndex => {\n const objects = new Map<string, ObjectRecord>();\n const inputs = new Map<string, InputRecord>();\n const enums = new Map<string, EnumRecord>();\n const unions = new Map<string, UnionRecord>();\n const scalars = new Map<string, ScalarRecord>();\n const directives = new Map<string, DirectiveRecord>();\n const operationTypes: OperationTypeNames = {};\n\n for (const definition of document.definitions) {\n switch (definition.kind) {\n case Kind.OBJECT_TYPE_DEFINITION:\n case Kind.OBJECT_TYPE_EXTENSION: {\n const precedence = definition.kind === Kind.OBJECT_TYPE_DEFINITION ? \"definition\" : \"extension\";\n const record = ensureRecord(objects, definition.name.value, (name) => ({\n name,\n fields: new Map<string, FieldDefinitionNode>(),\n directives: [],\n }));\n addObjectFields(record.fields, definition.fields);\n record.directives = mergeDirectives(record.directives, definition.directives, precedence);\n break;\n }\n case Kind.INPUT_OBJECT_TYPE_DEFINITION:\n case Kind.INPUT_OBJECT_TYPE_EXTENSION: {\n const precedence = definition.kind === Kind.INPUT_OBJECT_TYPE_DEFINITION ? \"definition\" : \"extension\";\n const record = ensureRecord(inputs, definition.name.value, (name) => ({\n name,\n fields: new Map<string, InputValueDefinitionNode>(),\n directives: [],\n }));\n addInputFields(record.fields, definition.fields);\n record.directives = mergeDirectives(record.directives, definition.directives, precedence);\n break;\n }\n case Kind.ENUM_TYPE_DEFINITION:\n case Kind.ENUM_TYPE_EXTENSION: {\n const precedence = definition.kind === Kind.ENUM_TYPE_DEFINITION ? \"definition\" : \"extension\";\n const record = ensureRecord(enums, definition.name.value, (name) => ({\n name,\n values: new Map<string, EnumValueDefinitionNode>(),\n directives: [],\n }));\n addEnumValues(record.values, definition.values);\n record.directives = mergeDirectives(record.directives, definition.directives, precedence);\n break;\n }\n case Kind.UNION_TYPE_DEFINITION:\n case Kind.UNION_TYPE_EXTENSION: {\n const precedence = definition.kind === Kind.UNION_TYPE_DEFINITION ? \"definition\" : \"extension\";\n const record = ensureRecord(unions, definition.name.value, (name) => ({\n name,\n members: new Map<string, NamedTypeNode>(),\n directives: [],\n }));\n addUnionMembers(record.members, definition.types);\n record.directives = mergeDirectives(record.directives, definition.directives, precedence);\n break;\n }\n case Kind.SCALAR_TYPE_DEFINITION:\n case Kind.SCALAR_TYPE_EXTENSION: {\n const precedence = definition.kind === Kind.SCALAR_TYPE_DEFINITION ? \"definition\" : \"extension\";\n const record = ensureRecord(scalars, definition.name.value, (name) => ({\n name,\n directives: [],\n }));\n record.directives = mergeDirectives(record.directives, definition.directives, precedence);\n break;\n }\n case Kind.DIRECTIVE_DEFINITION: {\n const name = definition.name.value;\n if (name === \"skip\" || name === \"include\" || name === \"deprecated\" || name === \"specifiedBy\") {\n break;\n }\n const args = new Map<string, InputValueDefinitionNode>();\n addDirectiveArgs(args, definition.arguments);\n directives.set(name, {\n name,\n locations: definition.locations.map((loc) => loc.value),\n args,\n isRepeatable: definition.repeatable,\n });\n break;\n }\n case Kind.SCHEMA_DEFINITION:\n case Kind.SCHEMA_EXTENSION:\n updateOperationTypes(operationTypes, definition);\n break;\n default:\n break;\n }\n }\n\n if (!operationTypes.query && objects.has(\"Query\")) {\n operationTypes.query = \"Query\";\n }\n if (!operationTypes.mutation && objects.has(\"Mutation\")) {\n operationTypes.mutation = \"Mutation\";\n }\n if (!operationTypes.subscription && objects.has(\"Subscription\")) {\n operationTypes.subscription = \"Subscription\";\n }\n\n return {\n objects,\n inputs,\n enums,\n unions,\n scalars,\n directives,\n operationTypes,\n };\n};\n","/**\n * Transformer for enriching parsed GraphQL operations with schema information.\n * @module\n */\n\nimport type { DocumentNode } from \"graphql\";\nimport { parseTypeNode } from \"./parser\";\nimport { err, ok, type Result } from \"./result\";\nimport { createSchemaIndex, type SchemaIndex } from \"./schema-index\";\nimport type {\n GraphqlAnalysisError,\n InferredVariable,\n ParsedArgument,\n ParsedFragment,\n ParsedOperation,\n ParsedSelection,\n ParsedValue,\n ParsedVariable,\n ParseResult,\n TypeInfo,\n} from \"./types\";\n\nconst builtinScalarTypes = new Set([\"ID\", \"String\", \"Int\", \"Float\", \"Boolean\"]);\n\n// ============================================================================\n// Modifier Merging Utilities\n// ============================================================================\n\ntype ModifierStructure = {\n readonly inner: \"!\" | \"?\";\n readonly lists: readonly (\"[]!\" | \"[]?\")[];\n};\n\nconst parseModifierStructure = (modifier: string): ModifierStructure => {\n const inner = modifier[0] === \"!\" ? \"!\" : \"?\";\n const lists: (\"[]!\" | \"[]?\")[] = [];\n const listPattern = /\\[\\]([!?])/g;\n let match: RegExpExecArray | null;\n while ((match = listPattern.exec(modifier)) !== null) {\n lists.push(`[]${match[1]}` as \"[]!\" | \"[]?\");\n }\n return { inner, lists };\n};\n\nconst buildModifier = (structure: ModifierStructure): string => {\n return structure.inner + structure.lists.join(\"\");\n};\n\nexport const isModifierAssignable = (source: string, target: string): boolean => {\n const srcStruct = parseModifierStructure(source);\n const tgtStruct = parseModifierStructure(target);\n\n const depthDiff = tgtStruct.lists.length - srcStruct.lists.length;\n if (depthDiff < 0 || depthDiff > 1) return false;\n\n const tgtListsToCompare = depthDiff === 1 ? tgtStruct.lists.slice(1) : tgtStruct.lists;\n\n if (depthDiff === 1 && srcStruct.lists.length === 0 && srcStruct.inner === \"?\" && tgtStruct.lists[0] === \"[]!\") {\n return false;\n }\n\n if (srcStruct.inner === \"?\" && tgtStruct.inner === \"!\") return false;\n\n for (let i = 0; i < srcStruct.lists.length; i++) {\n // biome-ignore lint/style/noNonNullAssertion: Loop index is within bounds\n const srcList = srcStruct.lists[i]!;\n // biome-ignore lint/style/noNonNullAssertion: Loop index is within bounds\n const tgtList = tgtListsToCompare[i]!;\n if (srcList === \"[]?\" && tgtList === \"[]!\") return false;\n }\n\n return true;\n};\n\nconst deriveMinimumModifier = (expectedModifier: string): string => {\n const struct = parseModifierStructure(expectedModifier);\n if (struct.lists.length > 0) {\n return buildModifier({ inner: struct.inner, lists: struct.lists.slice(1) });\n }\n return expectedModifier;\n};\n\nexport const mergeModifiers = (a: string, b: string): { ok: true; value: string } | { ok: false; reason: string } => {\n const structA = parseModifierStructure(a);\n const structB = parseModifierStructure(b);\n\n if (structA.lists.length !== structB.lists.length) {\n return {\n ok: false,\n reason: `Incompatible list depths: \"${a}\" has ${structA.lists.length} list level(s), \"${b}\" has ${structB.lists.length}`,\n };\n }\n\n const mergedInner: \"!\" | \"?\" = structA.inner === \"!\" || structB.inner === \"!\" ? \"!\" : \"?\";\n const mergedLists: (\"[]!\" | \"[]?\")[] = [];\n for (let i = 0; i < structA.lists.length; i++) {\n // biome-ignore lint/style/noNonNullAssertion: Loop index is within bounds\n const listA = structA.lists[i]!;\n // biome-ignore lint/style/noNonNullAssertion: Loop index is within bounds\n const listB = structB.lists[i]!;\n mergedLists.push(listA === \"[]!\" || listB === \"[]!\" ? \"[]!\" : \"[]?\");\n }\n\n return { ok: true, value: buildModifier({ inner: mergedInner, lists: mergedLists }) };\n};\n\n// ============================================================================\n// Variable Collection from Selections\n// ============================================================================\n\nexport type VariableUsage = {\n readonly name: string;\n readonly typeName: string;\n readonly expectedModifier: string;\n readonly minimumModifier: string;\n readonly typeKind: \"scalar\" | \"enum\" | \"input\";\n};\n\nexport const getArgumentType = (\n schema: SchemaIndex,\n parentTypeName: string,\n fieldName: string,\n argumentName: string,\n): TypeInfo | null => {\n const objectRecord = schema.objects.get(parentTypeName);\n if (!objectRecord) return null;\n\n const fieldDef = objectRecord.fields.get(fieldName);\n if (!fieldDef) return null;\n\n const argDef = fieldDef.arguments?.find((arg) => arg.name.value === argumentName);\n if (!argDef) return null;\n\n return parseTypeNode(argDef.type);\n};\n\nexport const getInputFieldType = (schema: SchemaIndex, inputTypeName: string, fieldName: string): TypeInfo | null => {\n const inputRecord = schema.inputs.get(inputTypeName);\n if (!inputRecord) return null;\n\n const fieldDef = inputRecord.fields.get(fieldName);\n if (!fieldDef) return null;\n\n return parseTypeNode(fieldDef.type);\n};\n\nconst resolveTypeKindFromName = (schema: SchemaIndex, typeName: string): \"scalar\" | \"enum\" | \"input\" | null => {\n if (isScalarName(schema, typeName)) return \"scalar\";\n if (isEnumName(schema, typeName)) return \"enum\";\n if (schema.inputs.has(typeName)) return \"input\";\n return null;\n};\n\nconst collectVariablesFromValue = (\n value: ParsedValue,\n expectedTypeName: string,\n expectedModifier: string,\n schema: SchemaIndex,\n usages: VariableUsage[],\n): GraphqlAnalysisError | null => {\n if (value.kind === \"variable\") {\n const typeKind = resolveTypeKindFromName(schema, expectedTypeName);\n if (!typeKind) {\n return {\n code: \"GRAPHQL_UNKNOWN_TYPE\",\n message: `Unknown type \"${expectedTypeName}\" for variable \"$${value.name}\"`,\n typeName: expectedTypeName,\n };\n }\n usages.push({\n name: value.name,\n typeName: expectedTypeName,\n expectedModifier,\n minimumModifier: deriveMinimumModifier(expectedModifier),\n typeKind,\n });\n return null;\n }\n\n if (value.kind === \"object\") {\n for (const field of value.fields) {\n const fieldType = getInputFieldType(schema, expectedTypeName, field.name);\n if (!fieldType) {\n return {\n code: \"GRAPHQL_UNKNOWN_FIELD\",\n message: `Unknown field \"${field.name}\" on input type \"${expectedTypeName}\"`,\n typeName: expectedTypeName,\n fieldName: field.name,\n };\n }\n const error = collectVariablesFromValue(field.value, fieldType.typeName, fieldType.modifier, schema, usages);\n if (error) return error;\n }\n return null;\n }\n\n if (value.kind === \"list\") {\n const struct = parseModifierStructure(expectedModifier);\n if (struct.lists.length > 0) {\n const innerModifier = buildModifier({\n inner: struct.inner,\n lists: struct.lists.slice(1),\n });\n for (const item of value.values) {\n const error = collectVariablesFromValue(item, expectedTypeName, innerModifier, schema, usages);\n if (error) return error;\n }\n }\n }\n\n return null;\n};\n\nconst collectVariablesFromArguments = (\n args: readonly ParsedArgument[],\n parentTypeName: string,\n fieldName: string,\n schema: SchemaIndex,\n usages: VariableUsage[],\n): GraphqlAnalysisError | null => {\n for (const arg of args) {\n const argType = getArgumentType(schema, parentTypeName, fieldName, arg.name);\n if (!argType) {\n return {\n code: \"GRAPHQL_UNKNOWN_ARGUMENT\",\n message: `Unknown argument \"${arg.name}\" on field \"${fieldName}\"`,\n fieldName,\n argumentName: arg.name,\n };\n }\n const error = collectVariablesFromValue(arg.value, argType.typeName, argType.modifier, schema, usages);\n if (error) return error;\n }\n return null;\n};\n\nexport const collectVariableUsages = (\n selections: readonly ParsedSelection[],\n parentTypeName: string,\n schema: SchemaIndex,\n): Result<VariableUsage[], GraphqlAnalysisError> => {\n const usages: VariableUsage[] = [];\n\n const collect = (sels: readonly ParsedSelection[], parentType: string): GraphqlAnalysisError | null => {\n for (const sel of sels) {\n switch (sel.kind) {\n case \"field\": {\n if (sel.arguments && sel.arguments.length > 0) {\n const error = collectVariablesFromArguments(sel.arguments, parentType, sel.name, schema, usages);\n if (error) return error;\n }\n if (sel.selections && sel.selections.length > 0) {\n const fieldReturnType = getFieldReturnType(schema, parentType, sel.name);\n if (!fieldReturnType) {\n return {\n code: \"GRAPHQL_UNKNOWN_FIELD\",\n message: `Unknown field \"${sel.name}\" on type \"${parentType}\"`,\n typeName: parentType,\n fieldName: sel.name,\n };\n }\n const error = collect(sel.selections, fieldReturnType);\n if (error) return error;\n }\n break;\n }\n case \"inlineFragment\": {\n const error = collect(sel.selections, sel.onType);\n if (error) return error;\n break;\n }\n case \"fragmentSpread\":\n break;\n }\n }\n return null;\n };\n\n const error = collect(selections, parentTypeName);\n if (error) return err(error);\n\n return ok(usages);\n};\n\nexport const getFieldReturnType = (schema: SchemaIndex, parentTypeName: string, fieldName: string): string | null => {\n const objectRecord = schema.objects.get(parentTypeName);\n if (!objectRecord) return null;\n\n const fieldDef = objectRecord.fields.get(fieldName);\n if (!fieldDef) return null;\n\n const { typeName } = parseTypeNode(fieldDef.type);\n return typeName;\n};\n\nexport const mergeVariableUsages = (\n variableName: string,\n usages: readonly VariableUsage[],\n): Result<InferredVariable, GraphqlAnalysisError> => {\n if (usages.length === 0) {\n return err({\n code: \"GRAPHQL_UNDECLARED_VARIABLE\",\n message: `No usages found for variable \"${variableName}\"`,\n variableName,\n });\n }\n\n // biome-ignore lint/style/noNonNullAssertion: Length checked above\n const first = usages[0]!;\n\n for (const usage of usages) {\n if (usage.typeName !== first.typeName) {\n return err({\n code: \"GRAPHQL_VARIABLE_TYPE_MISMATCH\",\n message: `Variable \"$${variableName}\" has conflicting types: \"${first.typeName}\" and \"${usage.typeName}\"`,\n variableName,\n });\n }\n }\n\n let candidateModifier = first.minimumModifier;\n for (let i = 1; i < usages.length; i++) {\n // biome-ignore lint/style/noNonNullAssertion: Loop index is within bounds\n const result = mergeModifiers(candidateModifier, usages[i]!.minimumModifier);\n if (!result.ok) {\n return err({\n code: \"GRAPHQL_VARIABLE_MODIFIER_INCOMPATIBLE\",\n message: `Variable \"$${variableName}\" has incompatible modifiers: ${result.reason}`,\n variableName,\n });\n }\n candidateModifier = result.value;\n }\n\n for (const usage of usages) {\n if (!isModifierAssignable(candidateModifier, usage.expectedModifier)) {\n return err({\n code: \"GRAPHQL_VARIABLE_MODIFIER_INCOMPATIBLE\",\n message: `Variable \"$${variableName}\" with modifier \"${candidateModifier}\" cannot satisfy expected \"${usage.expectedModifier}\"`,\n variableName,\n });\n }\n }\n\n return ok({\n name: variableName,\n typeName: first.typeName,\n modifier: candidateModifier,\n typeKind: first.typeKind,\n });\n};\n\nexport const inferVariablesFromUsages = (usages: readonly VariableUsage[]): Result<InferredVariable[], GraphqlAnalysisError> => {\n const byName = new Map<string, VariableUsage[]>();\n for (const usage of usages) {\n const existing = byName.get(usage.name);\n if (existing) {\n existing.push(usage);\n } else {\n byName.set(usage.name, [usage]);\n }\n }\n\n const variables: InferredVariable[] = [];\n for (const [name, group] of byName) {\n const result = mergeVariableUsages(name, group);\n if (!result.ok) return err(result.error);\n variables.push(result.value);\n }\n\n variables.sort((a, b) => a.name.localeCompare(b.name));\n return ok(variables);\n};\n\nconst isScalarName = (schema: SchemaIndex, name: string): boolean => builtinScalarTypes.has(name) || schema.scalars.has(name);\n\n// ============================================================================\n// Fragment Dependency Ordering\n// ============================================================================\n\nexport const sortFragmentsByDependency = (\n fragments: readonly ParsedFragment[],\n): Result<ParsedFragment[], GraphqlAnalysisError> => {\n const graph = new Map<string, Set<string>>();\n for (const fragment of fragments) {\n const deps = collectFragmentDependenciesSet(fragment.selections);\n graph.set(fragment.name, deps);\n }\n\n const fragmentByName = new Map<string, ParsedFragment>();\n for (const f of fragments) {\n fragmentByName.set(f.name, f);\n }\n\n const sorted: ParsedFragment[] = [];\n const visited = new Set<string>();\n const visiting = new Set<string>();\n\n const visit = (name: string, path: string[]): GraphqlAnalysisError | null => {\n if (visited.has(name)) return null;\n\n if (visiting.has(name)) {\n const cycleStart = path.indexOf(name);\n const cycle = path.slice(cycleStart).concat(name);\n return {\n code: \"GRAPHQL_FRAGMENT_CIRCULAR_DEPENDENCY\",\n message: `Circular dependency detected in fragments: ${cycle.join(\" -> \")}`,\n fragmentNames: cycle,\n };\n }\n\n const fragment = fragmentByName.get(name);\n if (!fragment) {\n visited.add(name);\n return null;\n }\n\n visiting.add(name);\n const deps = graph.get(name) ?? new Set();\n\n for (const dep of deps) {\n const error = visit(dep, [...path, name]);\n if (error) return error;\n }\n\n visiting.delete(name);\n visited.add(name);\n sorted.push(fragment);\n return null;\n };\n\n for (const fragment of fragments) {\n const error = visit(fragment.name, []);\n if (error) return err(error);\n }\n\n return ok(sorted);\n};\n\nconst collectFragmentDependenciesSet = (selections: readonly ParsedSelection[]): Set<string> => {\n const deps = new Set<string>();\n\n const collect = (sels: readonly ParsedSelection[]): void => {\n for (const sel of sels) {\n switch (sel.kind) {\n case \"fragmentSpread\":\n deps.add(sel.name);\n break;\n case \"field\":\n if (sel.selections) {\n collect(sel.selections);\n }\n break;\n case \"inlineFragment\":\n collect(sel.selections);\n break;\n }\n }\n };\n\n collect(selections);\n return deps;\n};\n\nconst isEnumName = (schema: SchemaIndex, name: string): boolean => schema.enums.has(name);\n\n// ============================================================================\n// Enriched Types\n// ============================================================================\n\nexport type EnrichedOperation = Omit<ParsedOperation, \"variables\"> & {\n readonly variables: readonly EnrichedVariable[];\n readonly fragmentDependencies: readonly string[];\n};\n\nexport type EnrichedFragment = ParsedFragment & {\n readonly fragmentDependencies: readonly string[];\n readonly variables: readonly InferredVariable[];\n};\n\nexport type EnrichedVariable = Omit<ParsedVariable, \"typeKind\"> & {\n readonly typeKind: \"scalar\" | \"enum\" | \"input\";\n};\n\nexport type TransformResult = {\n readonly operations: readonly EnrichedOperation[];\n readonly fragments: readonly EnrichedFragment[];\n};\n\nexport type TransformOptions = {\n readonly schemaDocument: DocumentNode;\n};\n\n// ============================================================================\n// Full Transformation Pipeline\n// ============================================================================\n\nexport const transformParsedGraphql = (\n parsed: ParseResult,\n options: TransformOptions,\n): Result<TransformResult, GraphqlAnalysisError> => {\n const schema = createSchemaIndex(options.schemaDocument);\n\n const sortResult = sortFragmentsByDependency(parsed.fragments);\n if (!sortResult.ok) {\n return err(sortResult.error);\n }\n const sortedFragments = sortResult.value;\n\n const resolvedFragmentVariables = new Map<string, readonly InferredVariable[]>();\n const fragments: EnrichedFragment[] = [];\n\n for (const frag of sortedFragments) {\n const result = transformFragment(frag, schema, resolvedFragmentVariables);\n if (!result.ok) {\n return err(result.error);\n }\n resolvedFragmentVariables.set(frag.name, result.value.variables);\n fragments.push(result.value);\n }\n\n const operations: EnrichedOperation[] = [];\n for (const op of parsed.operations) {\n const result = transformOperation(op, schema);\n if (!result.ok) {\n return err(result.error);\n }\n operations.push(result.value);\n }\n\n return ok({ operations, fragments });\n};\n\nconst transformOperation = (op: ParsedOperation, schema: SchemaIndex): Result<EnrichedOperation, GraphqlAnalysisError> => {\n const variables: EnrichedVariable[] = [];\n for (const v of op.variables) {\n const typeKind = resolveTypeKind(schema, v.typeName);\n if (typeKind === null) {\n return err({\n code: \"GRAPHQL_UNKNOWN_TYPE\",\n message: `Unknown type \"${v.typeName}\" in variable \"${v.name}\"`,\n typeName: v.typeName,\n });\n }\n variables.push({ ...v, typeKind });\n }\n\n const fragmentDependencies = collectFragmentDependencies(op.selections);\n\n return ok({\n ...op,\n variables,\n fragmentDependencies,\n });\n};\n\nconst transformFragment = (\n frag: ParsedFragment,\n schema: SchemaIndex,\n resolvedFragmentVariables: Map<string, readonly InferredVariable[]>,\n): Result<EnrichedFragment, GraphqlAnalysisError> => {\n const fragmentDependencies = collectFragmentDependencies(frag.selections);\n\n const directUsagesResult = collectVariableUsages(frag.selections, frag.onType, schema);\n if (!directUsagesResult.ok) {\n return err(directUsagesResult.error);\n }\n const directUsages = directUsagesResult.value;\n\n const spreadVariables: InferredVariable[] = [];\n for (const depName of fragmentDependencies) {\n const depVariables = resolvedFragmentVariables.get(depName);\n if (depVariables) {\n spreadVariables.push(...depVariables);\n }\n }\n\n const allUsages: VariableUsage[] = [\n ...directUsages,\n ...spreadVariables.map((v) => ({\n name: v.name,\n typeName: v.typeName,\n expectedModifier: v.modifier,\n minimumModifier: v.modifier,\n typeKind: v.typeKind,\n })),\n ];\n\n const variablesResult = inferVariablesFromUsages(allUsages);\n if (!variablesResult.ok) {\n return err(variablesResult.error);\n }\n\n return ok({\n ...frag,\n fragmentDependencies,\n variables: variablesResult.value,\n });\n};\n\nconst resolveTypeKind = (schema: SchemaIndex, typeName: string): \"scalar\" | \"enum\" | \"input\" | null => {\n if (isScalarName(schema, typeName)) return \"scalar\";\n if (isEnumName(schema, typeName)) return \"enum\";\n if (schema.inputs.has(typeName)) return \"input\";\n return null;\n};\n\nconst collectFragmentDependencies = (selections: readonly ParsedSelection[]): readonly string[] => {\n const fragments = new Set<string>();\n\n const collect = (sels: readonly ParsedSelection[]): void => {\n for (const sel of sels) {\n switch (sel.kind) {\n case \"fragmentSpread\":\n fragments.add(sel.name);\n break;\n case \"field\":\n if (sel.selections) {\n collect(sel.selections);\n }\n break;\n case \"inlineFragment\":\n collect(sel.selections);\n break;\n }\n }\n };\n\n collect(selections);\n return [...fragments];\n};\n","/**\n * Converts VariableDefinitionNode from graphql-js AST into VarSpecifier objects\n * compatible with the composer's GenericVarSpecifier type.\n *\n * Uses throw (not Result) because it will be called from the composer layer.\n * @module\n */\n\nimport { Kind, type ValueNode, type VariableDefinitionNode } from \"graphql\";\nimport { parseTypeNode } from \"./parser\";\nimport type { SchemaIndex } from \"./schema-index\";\n\n/**\n * Runtime VarSpecifier shape produced by this builder.\n * Compatible with GenericVarSpecifier from var-builder.ts.\n */\nexport type BuiltVarSpecifier = {\n readonly kind: \"scalar\" | \"enum\" | \"input\";\n readonly name: string;\n readonly modifier: string;\n readonly defaultValue: null | { readonly default: unknown };\n readonly directives: Record<string, never>;\n};\n\nconst builtinScalarTypes = new Set([\"ID\", \"String\", \"Int\", \"Float\", \"Boolean\"]);\n\nconst resolveTypeKind = (schema: SchemaIndex, typeName: string): \"scalar\" | \"enum\" | \"input\" => {\n if (builtinScalarTypes.has(typeName) || schema.scalars.has(typeName)) return \"scalar\";\n if (schema.enums.has(typeName)) return \"enum\";\n if (schema.inputs.has(typeName)) return \"input\";\n throw new Error(`Cannot resolve type kind for \"${typeName}\": not found in schema as scalar, enum, or input`);\n};\n\n/**\n * Extract a constant value from a ValueNode (for default values).\n * Similar to graphql-js valueFromAST but without type coercion.\n */\nconst extractConstValue = (node: ValueNode): unknown => {\n switch (node.kind) {\n case Kind.INT:\n return Number.parseInt(node.value, 10);\n case Kind.FLOAT:\n return Number.parseFloat(node.value);\n case Kind.STRING:\n return node.value;\n case Kind.BOOLEAN:\n return node.value;\n case Kind.NULL:\n return null;\n case Kind.ENUM:\n return node.value;\n case Kind.LIST:\n return node.values.map(extractConstValue);\n case Kind.OBJECT: {\n const obj: Record<string, unknown> = {};\n for (const field of node.fields) {\n obj[field.name.value] = extractConstValue(field.value);\n }\n return obj;\n }\n case Kind.VARIABLE:\n throw new Error(\"Variable references are not allowed in default values\");\n default:\n throw new Error(`Unexpected value kind: ${(node as { kind: string }).kind}`);\n }\n};\n\nconst extractDefaultValue = (node: VariableDefinitionNode): null | { readonly default: unknown } => {\n if (!node.defaultValue) return null;\n return { default: extractConstValue(node.defaultValue) };\n};\n\n/**\n * Convert a VariableDefinitionNode to a VarSpecifier.\n * Resolves `kind` (scalar/enum/input) from the schema index.\n *\n * @throws Error if type name cannot be resolved in schema\n */\nexport const buildVarSpecifier = (node: VariableDefinitionNode, schema: SchemaIndex): BuiltVarSpecifier => {\n const { typeName, modifier } = parseTypeNode(node.type);\n const kind = resolveTypeKind(schema, typeName);\n const defaultValue = extractDefaultValue(node);\n\n return { kind, name: typeName, modifier, defaultValue, directives: {} as Record<string, never> };\n};\n\n/**\n * Convert all variable definitions from a list of VariableDefinitionNodes\n * into a record keyed by variable name.\n *\n * @throws Error if any type name cannot be resolved in schema\n */\nexport const buildVarSpecifiers = (\n nodes: readonly VariableDefinitionNode[],\n schema: SchemaIndex,\n): Record<string, BuiltVarSpecifier> => {\n const result: Record<string, BuiltVarSpecifier> = {};\n for (const node of nodes) {\n result[node.variable.name.value] = buildVarSpecifier(node, schema);\n }\n return result;\n};\n","import type { DocumentNode } from \"graphql\";\nimport type { FieldPath } from \"../../composer/field-path-context\";\nimport type { OperationType } from \"../schema\";\nimport type { OperationMetadata } from \"./metadata\";\n\n/**\n * Information about a fragment's metadata when spread in an operation.\n */\nexport type FragmentMetaInfo<TFragmentMetadata> = {\n /** The evaluated metadata from the fragment, if defined */\n readonly metadata: TFragmentMetadata | undefined;\n /** Field path where the fragment was spread */\n readonly fieldPath: FieldPath | null;\n};\n\n/**\n * Metadata adapter that defines how fragment metadata is aggregated\n * and provides schema-level configuration.\n *\n * This adapter allows complete customization of:\n * - Fragment metadata type (TFragmentMetadata)\n * - How fragment metadata is aggregated (aggregateFragmentMetadata)\n * - Schema-level fixed values available to all operation metadata builders (schemaLevel)\n *\n * Note: Operation metadata type is inferred from the operation's metadata callback return type.\n *\n * @template TFragmentMetadata - The metadata type returned by fragment metadata builders\n * @template TAggregatedFragmentMetadata - The type returned by aggregateFragmentMetadata\n * @template TSchemaLevel - The type of schema-level configuration values\n */\nexport type MetadataAdapter<TFragmentMetadata = unknown, TAggregatedFragmentMetadata = unknown, TSchemaLevel = unknown> = {\n /**\n * Aggregates metadata from all spread fragments in an operation.\n * Called with the metadata from each spread fragment.\n * The return type becomes the `fragmentMetadata` parameter in operation metadata builders.\n */\n readonly aggregateFragmentMetadata: (fragments: readonly FragmentMetaInfo<TFragmentMetadata>[]) => TAggregatedFragmentMetadata;\n /**\n * Schema-level fixed values that are passed to all operation metadata builders.\n * Useful for configuration that should be consistent across all operations.\n */\n readonly schemaLevel?: TSchemaLevel;\n};\n\n/**\n * Extracts the type parameters from a MetadataAdapter.\n */\nexport type ExtractAdapterTypes<T> = T extends MetadataAdapter<infer TFragment, infer TAggregated, infer TSchemaLevel>\n ? {\n fragmentMetadata: TFragment;\n aggregatedFragmentMetadata: TAggregated;\n schemaLevel: TSchemaLevel;\n }\n : never;\n\n/**\n * Generic type for any metadata adapter.\n */\nexport type AnyMetadataAdapter = MetadataAdapter<any, any, any>;\n\n/**\n * Arguments passed to document transformer function.\n * Destructurable for convenient access.\n *\n * @template TSchemaLevel - Schema-level configuration type\n * @template TAggregatedFragmentMetadata - Aggregated fragment metadata type\n */\nexport type DocumentTransformArgs<TSchemaLevel = unknown, TAggregatedFragmentMetadata = unknown> = {\n /** The GraphQL document to transform */\n readonly document: DocumentNode;\n /** The operation name */\n readonly operationName: string;\n /** The operation type (query, mutation, subscription) */\n readonly operationType: OperationType;\n /** Variable names defined for this operation */\n readonly variableNames: readonly string[];\n /** Schema-level configuration from adapter */\n readonly schemaLevel: TSchemaLevel | undefined;\n /** Aggregated fragment metadata */\n readonly fragmentMetadata: TAggregatedFragmentMetadata | undefined;\n};\n\n/**\n * Document transformer function.\n * Receives the built DocumentNode and returns a transformed DocumentNode.\n *\n * @template TSchemaLevel - Schema-level configuration type\n * @template TAggregatedFragmentMetadata - Aggregated fragment metadata type\n */\nexport type DocumentTransformer<TSchemaLevel = unknown, TAggregatedFragmentMetadata = unknown> = (\n args: DocumentTransformArgs<TSchemaLevel, TAggregatedFragmentMetadata>,\n) => DocumentNode;\n\n/**\n * Arguments passed to operation-level document transformer.\n * Receives typed operation metadata.\n *\n * @template TOperationMetadata - The operation's metadata type\n */\nexport type OperationDocumentTransformArgs<TOperationMetadata = unknown> = {\n /** The GraphQL document to transform */\n readonly document: DocumentNode;\n /** The operation metadata (typed per-operation) */\n readonly metadata: TOperationMetadata | undefined;\n};\n\n/**\n * Operation-level document transformer function.\n * Applied before the adapter-level transform.\n *\n * **Best Practice:** Define transform logic in adapter helpers for reusability,\n * then reference the helper in the operation's `transformDocument` option.\n *\n * @example\n * ```typescript\n * // Define in adapter helpers\n * const adapter = defineAdapter({\n * helpers: {\n * transform: {\n * addCache: (ttl: number) => ({ document }) => visit(document, { ... }),\n * },\n * },\n * });\n *\n * // Use in operation\n * query(\"GetUser\")`{ ... }`({\n * transformDocument: transform.addCache(300),\n * });\n * ```\n *\n * @template TOperationMetadata - The operation's metadata type\n */\nexport type OperationDocumentTransformer<TOperationMetadata = unknown> = (\n args: OperationDocumentTransformArgs<TOperationMetadata>,\n) => DocumentNode;\n\n/**\n * Unified adapter that combines helpers and metadata configuration.\n *\n * @template THelpers - Custom helper functions accessible in gql composer callbacks\n * @template TFragmentMetadata - The metadata type returned by fragment metadata builders\n * @template TAggregatedFragmentMetadata - The type returned by aggregateFragmentMetadata\n * @template TSchemaLevel - The type of schema-level configuration values\n *\n * @example\n * ```typescript\n * const adapter = defineAdapter({\n * helpers: {\n * auth: {\n * requiresLogin: () => ({ requiresAuth: true }),\n * },\n * },\n * metadata: {\n * aggregateFragmentMetadata: (fragments) => fragments.map((m) => m.metadata),\n * schemaLevel: { apiVersion: \"v2\" },\n * },\n * });\n * ```\n */\nexport type Adapter<\n THelpers extends object = object,\n TFragmentMetadata = unknown,\n TAggregatedFragmentMetadata = unknown,\n TSchemaLevel = unknown,\n> = {\n /** Custom helper functions accessible in gql composer callbacks */\n readonly helpers?: THelpers;\n /** Metadata configuration for fragments and operations */\n readonly metadata?: MetadataAdapter<TFragmentMetadata, TAggregatedFragmentMetadata, TSchemaLevel>;\n /** Optional document transformer called after document building */\n readonly transformDocument?: DocumentTransformer<TSchemaLevel, TAggregatedFragmentMetadata>;\n};\n\n/**\n * Generic type for any unified adapter.\n */\nexport type AnyAdapter = Adapter<any, any, any, any>;\n\n/**\n * Extracts the type parameters from a unified Adapter.\n */\nexport type ExtractUnifiedAdapterTypes<T> = T extends Adapter<\n infer THelpers,\n infer TFragment,\n infer TAggregated,\n infer TSchemaLevel\n>\n ? {\n helpers: THelpers;\n fragmentMetadata: TFragment;\n aggregatedFragmentMetadata: TAggregated;\n schemaLevel: TSchemaLevel;\n }\n : never;\n\n/**\n * Default adapter that maintains backwards compatibility with the original behavior.\n * Uses OperationMetadata for fragment metadata and aggregates by collecting metadata into a readonly array.\n */\nexport type DefaultMetadataAdapter = MetadataAdapter<OperationMetadata, readonly (OperationMetadata | undefined)[]>;\n\n/**\n * Default unified adapter type.\n */\nexport type DefaultAdapter = Adapter<object, OperationMetadata, readonly (OperationMetadata | undefined)[]>;\n\n/**\n * Creates the default adapter instance.\n * @internal\n */\nexport const createDefaultAdapter = (): DefaultMetadataAdapter => ({\n aggregateFragmentMetadata: (fragments) => fragments.map((m) => m.metadata),\n});\n\n/**\n * The default adapter instance.\n */\nexport const defaultMetadataAdapter: DefaultMetadataAdapter = createDefaultAdapter();\n","/**\n * Field path context using shared value container pattern.\n *\n * This module tracks the current field path during field building,\n * similar to how React tracks the current fiber.\n * No changes to field builder arguments are needed - use getCurrentFieldPath() to access.\n */\n\n/**\n * A segment in the field path.\n */\nexport type FieldPathSegment = {\n /** The field name */\n readonly field: string;\n /** The parent type name */\n readonly parent: string;\n /** Whether this field returns a list */\n readonly isList: boolean;\n};\n\n/**\n * Complete field path from root to current position.\n */\nexport type FieldPath = {\n /** Full path string (e.g., \"$.user.posts[].author\") */\n readonly full: string;\n /** Individual path segments */\n readonly segments: readonly FieldPathSegment[];\n};\n\n/**\n * Shared mutable container for field path context.\n * Only synchronous access is supported.\n */\nconst fieldPathContext: { current: FieldPath | null } = {\n current: null,\n};\n\n/**\n * Get the current field path.\n * Returns null if not in a field building context.\n *\n * @example\n * ```typescript\n * import { getCurrentFieldPath } from '@soda-gql/core';\n *\n * // Inside a field builder or model spread:\n * const path = getCurrentFieldPath();\n * console.log(path?.full); // \"$.user.posts[].author\"\n * ```\n */\nexport const getCurrentFieldPath = (): FieldPath | null => fieldPathContext.current;\n\n/**\n * Run a function with a specific field path context.\n * Restores the previous path after the function completes.\n *\n * @internal\n */\nexport const withFieldPath = <T>(path: FieldPath, fn: () => T): T => {\n const previousPath = fieldPathContext.current;\n fieldPathContext.current = path;\n try {\n return fn();\n } finally {\n fieldPathContext.current = previousPath;\n }\n};\n\n/**\n * Append a new segment to the current path.\n *\n * @internal\n */\nexport const appendToPath = (\n parent: FieldPath | null,\n segment: { field: string; parentType: string; isList: boolean },\n): FieldPath => {\n const listSuffix = segment.isList ? \"[]\" : \"\";\n const newSegment: FieldPathSegment = {\n field: segment.field,\n parent: segment.parentType,\n isList: segment.isList,\n };\n\n if (!parent) {\n return {\n full: `$.${segment.field}${listSuffix}`,\n segments: [newSegment],\n };\n }\n\n return {\n full: `${parent.full}.${segment.field}${listSuffix}`,\n segments: [...parent.segments, newSegment],\n };\n};\n\n/**\n * Check if a type specifier represents a list type.\n * Matches patterns like \"Type:![]!\", \"Type:![]?\", \"Type:?[]!\", etc.\n *\n * @internal\n */\nexport const isListType = (typeString: string): boolean => {\n return typeString.includes(\"[]\");\n};\n","/**\n * Creates field selection factories for building GraphQL selections.\n * @module\n */\n\nimport type { AnyFieldSelection, AnyFieldsExtended, AnyNestedObject, AnyNestedUnion } from \"../types/fragment\";\nimport type { AnyGraphqlSchema } from \"../types/schema/schema\";\nimport type { DeferredOutputField } from \"../types/type-foundation\";\nimport type { AnyDirectiveRef } from \"../types/type-foundation/directive-ref\";\nimport type { AnyVarRef } from \"../types/type-foundation/var-ref\";\nimport { parseOutputField } from \"../utils/deferred-specifier-parser\";\nimport { wrapByKey } from \"../utils/wrap-by-key\";\nimport { appendToPath, getCurrentFieldPath, isListType, withFieldPath } from \"./field-path-context\";\n\n// ============================================================================\n// Relocated builder contract types (type-erased from types/element/fields-builder.ts)\n// ============================================================================\n\n/** Builder callback for top-level field selections (has $ variable access) */\nexport type FieldsBuilder<TFields extends AnyFieldsExtended = AnyFieldsExtended> = (tools: {\n f: FieldAccessorFunction;\n $: Readonly<Record<string, AnyVarRef>>;\n}) => TFields;\n\n/** Builder callback for nested object field selections (no $ access) */\nexport type NestedObjectFieldsBuilder<TFields extends AnyFieldsExtended = AnyFieldsExtended> = (tools: {\n f: FieldAccessorFunction;\n}) => TFields;\n\n/** Builder for union type selections with per-member field definitions */\nexport type NestedUnionFieldsBuilder = {\n [typeName: string]: NestedObjectFieldsBuilder | undefined;\n} & { __typename?: true };\n\n// ============================================================================\n// FieldAccessorFunction\n// ============================================================================\n\n/**\n * Type-erased return from field accessor.\n * The actual runtime shape is a function: for scalar/enum fields it takes no args,\n * for object fields it takes a NestedObjectFieldsBuilder, for union fields a NestedUnionFieldsBuilder.\n * This type preserves enough structure so that nested `({ f })` callbacks infer `f` properly.\n */\n/**\n * Type-erased return from field accessor.\n * For object fields: accepts NestedObjectFieldsBuilder (typed `{ f }` callback).\n * For union fields and scalar thunks: uses catch-all signature.\n */\n// biome-ignore lint/suspicious/noExplicitAny: Type-erased field accessor return — actual shapes vary by field kind\ntype AnyFieldAccessorReturn = ((nest: NestedObjectFieldsBuilder) => any) & ((...args: any[]) => any);\n\n/** Function-call field accessor: f(\"fieldName\", args, extras) */\nexport type FieldAccessorFunction = (\n fieldName: string,\n fieldArgs?: AnyFieldSelection[\"args\"] | null | void,\n extras?: { alias?: string; directives?: AnyDirectiveRef[] },\n) => AnyFieldAccessorReturn;\n\n// ============================================================================\n// Cache and factory\n// ============================================================================\n\n/**\n * Cache map type for field factories.\n * Schema-scoped to avoid cross-schema contamination.\n * @internal\n */\ntype CacheMap = Map<string, FieldAccessorFunction>;\n\nconst cacheMapBySchema = new WeakMap<AnyGraphqlSchema, CacheMap>();\nconst ensureCacheMapBySchema = (schema: AnyGraphqlSchema) => {\n const cachedCacheMap = cacheMapBySchema.get(schema);\n if (cachedCacheMap) {\n return cachedCacheMap;\n }\n\n const cacheMap: CacheMap = new Map();\n cacheMapBySchema.set(schema, cacheMap);\n return cacheMap;\n};\n\n/**\n * Creates a field accessor function for a given object type.\n *\n * Returns a function f(\"fieldName\", args, extras) for building field selections.\n * Factories are cached per schema+type to avoid recreation.\n *\n * @param schema - The GraphQL schema definition\n * @param typeName - The object type name to create factories for\n * @returns FieldAccessorFunction for building field selections\n *\n * @internal Used by operation and fragment composers\n */\nexport const createFieldFactories = <TSchema extends AnyGraphqlSchema>(\n schema: TSchema,\n typeName: string,\n): FieldAccessorFunction => {\n const cacheMap = ensureCacheMapBySchema(schema);\n const cached = cacheMap.get(typeName);\n if (cached) {\n return cached;\n }\n\n const factory = createFieldFactoriesInner(schema, typeName);\n cacheMap.set(typeName, factory);\n\n return factory;\n};\n\nconst createFieldFactoriesInner = (schema: AnyGraphqlSchema, typeName: string): FieldAccessorFunction => {\n const typeDef = schema.object[typeName];\n if (!typeDef) {\n throw new Error(`Type ${typeName} is not defined in schema objects`);\n }\n\n return (fieldName, fieldArgs, extras) => {\n // __typename is an implicit introspection field\n if (fieldName === \"__typename\") {\n const wrap = <T>(value: T) => wrapByKey(extras?.alias ?? fieldName, value);\n return (() =>\n wrap({\n parent: typeName,\n field: fieldName,\n type: \"s|String|!\",\n args: {},\n directives: extras?.directives ?? [],\n object: null,\n union: null,\n })) as unknown as AnyFieldAccessorReturn;\n }\n\n // Runtime duck-typing: codegen may emit string or { spec, arguments }\n const fieldDef = typeDef.fields[fieldName];\n if (!fieldDef) {\n throw new Error(`Field \"${fieldName}\" is not defined on type \"${typeName}\"`);\n }\n\n const typeSpecifier = typeof fieldDef === \"string\" ? fieldDef : (fieldDef as { spec: string }).spec;\n const parsedType = parseOutputField(typeSpecifier as DeferredOutputField);\n\n const wrap = <T>(value: T) => wrapByKey(extras?.alias ?? fieldName, value);\n const directives = extras?.directives ?? [];\n\n if (parsedType.kind === \"object\") {\n const factoryReturn = (<TNested extends AnyNestedObject>(nest: NestedObjectFieldsBuilder<TNested & AnyFieldsExtended>) => {\n // Build new path for this field\n const currentPath = getCurrentFieldPath();\n const newPath = appendToPath(currentPath, {\n field: fieldName,\n parentType: typeName,\n isList: isListType(parsedType.modifier),\n });\n\n // Run nested builder with updated path context\n const nestedFields = withFieldPath(newPath, () => nest({ f: createFieldFactories(schema, parsedType.name) }));\n\n return wrap({\n parent: typeName,\n field: fieldName,\n type: typeSpecifier,\n args: fieldArgs ?? {},\n directives,\n object: nestedFields,\n union: null,\n });\n }) as unknown as AnyFieldAccessorReturn;\n\n return factoryReturn;\n }\n\n if (parsedType.kind === \"union\") {\n const factoryReturn = (<TNested extends AnyNestedUnion>(nest: NestedUnionFieldsBuilder & TNested) => {\n // Build new path for this field\n const currentPath = getCurrentFieldPath();\n const newPath = appendToPath(currentPath, {\n field: fieldName,\n parentType: typeName,\n isList: isListType(parsedType.modifier),\n });\n\n // Extract __typename flag before processing\n const typenameFlag = (nest as { __typename?: true }).__typename;\n\n // Run nested builders with updated path context, filtering out __typename\n const selections = withFieldPath(newPath, () => {\n const result: Record<string, unknown> = {};\n for (const [memberName, builder] of Object.entries(nest)) {\n if (memberName === \"__typename\") {\n continue; // Skip the flag, stored separately\n }\n if (typeof builder === \"function\") {\n result[memberName] = {\n fields: (builder as NestedObjectFieldsBuilder)({\n f: createFieldFactories(schema, memberName),\n }),\n directives: [],\n };\n } else if (builder && typeof builder === \"object\" && \"fields\" in builder) {\n // Pre-wrapped UnionMemberSelection (tagged template path)\n result[memberName] = builder;\n } else {\n }\n }\n return result;\n });\n\n return wrap({\n parent: typeName,\n field: fieldName,\n type: typeSpecifier,\n args: fieldArgs ?? {},\n directives,\n object: null,\n union: {\n selections,\n __typename: typenameFlag === true,\n },\n });\n }) as unknown as AnyFieldAccessorReturn;\n\n return factoryReturn;\n }\n\n if (parsedType.kind === \"scalar\" || parsedType.kind === \"enum\") {\n const factoryReturn = (() =>\n wrap({\n parent: typeName,\n field: fieldName,\n type: typeSpecifier,\n args: fieldArgs ?? {},\n directives,\n object: null,\n union: null,\n })) as unknown as AnyFieldAccessorReturn;\n return factoryReturn;\n }\n\n throw new Error(`Unsupported field type kind: ${parsedType.kind}`);\n };\n};\n","/**\n * Fragment usage context using shared value container pattern.\n *\n * This module tracks fragment usages during operation building,\n * allowing metadata from spread fragments to be collected and aggregated.\n * Similar to field-path-context, uses a shared mutable container.\n */\n\nimport type { FieldPath } from \"./field-path-context\";\n\n/**\n * Record of a fragment being spread in an operation.\n * Stores metadata builder (not fragment reference) since fragment cannot reference itself.\n *\n * @template TFragmentMetadata - The type of metadata produced by the fragment's metadata builder\n */\nexport type FragmentUsageRecord<TFragmentMetadata = unknown> = {\n /** Metadata builder factory from the fragment, if defined */\n readonly metadataBuilder: (() => TFragmentMetadata | Promise<TFragmentMetadata>) | null;\n /** Field path where the fragment was spread */\n readonly path: FieldPath | null;\n};\n\n/**\n * Shared mutable container for collecting fragment usages.\n * Only synchronous access is supported.\n */\nconst fragmentUsageContext: { current: FragmentUsageRecord[] | null } = {\n current: null,\n};\n\n/**\n * Run a function with fragment usage collection enabled.\n * Returns both the function result and collected fragment usages.\n *\n * @internal\n */\nexport const withFragmentUsageCollection = <T>(fn: () => T): { result: T; usages: FragmentUsageRecord[] } => {\n const previousCollector = fragmentUsageContext.current;\n const usages: FragmentUsageRecord[] = [];\n fragmentUsageContext.current = usages;\n try {\n const result = fn();\n return { result, usages };\n } finally {\n fragmentUsageContext.current = previousCollector;\n }\n};\n\n/**\n * Record a fragment usage. Called when fragment.spread() is invoked.\n * No-op if not in a collection context.\n *\n * @internal\n */\nexport const recordFragmentUsage = (record: FragmentUsageRecord): void => {\n if (fragmentUsageContext.current) {\n fragmentUsageContext.current.push(record);\n }\n};\n","type ArgEntries<T extends object> = { [K in keyof T]-?: [value: T[K], key: K] }[keyof T];\ntype Entries<T extends object> = { [K in keyof T]: [key: K, value: T[K]] }[keyof T];\n\nexport function mapValues<TObject extends object, TMappedValue>(\n obj: TObject,\n fn: (...args: ArgEntries<TObject>) => TMappedValue,\n): {\n [K in keyof TObject]: TMappedValue;\n} {\n return Object.fromEntries((Object.entries(obj) as Entries<TObject>[]).map(([key, value]) => [key, fn(value, key)])) as {\n [K in keyof TObject]: TMappedValue;\n };\n}\n","/**\n * Utilities for creating variable assignments and references.\n * @module\n */\n\nimport { type AnyAssignableInput, createVarRefFromNestedValue, createVarRefFromVariable, VarRef } from \"../types/fragment\";\nimport type { AnyVarRef, NestedValue, VariableDefinitions } from \"../types/type-foundation\";\nimport { mapValues } from \"../utils/map-values\";\n\n/**\n * Creates variable assignments from provided values.\n *\n * Maps variable definitions to VarRefs. If a value is provided,\n * wraps it as a nested-value VarRef. If not provided, creates\n * an undefined VarRef (field will be omitted).\n *\n * Used when spreading fragments with partial variable values.\n *\n * @internal\n */\nexport const createVarAssignments = <TVariableDefinitions extends VariableDefinitions>(\n definitions: TVariableDefinitions,\n providedValues: AnyAssignableInput | void,\n): Readonly<Record<string, AnyVarRef>> => {\n return mapValues(definitions, (_, key): AnyVarRef => {\n const varName = key as string;\n if (!providedValues || providedValues[varName] === undefined) {\n return createVarRefFromNestedValue(undefined);\n }\n\n const provided = providedValues[varName];\n if (provided instanceof VarRef) {\n return provided;\n }\n\n return createVarRefFromNestedValue(provided as NestedValue);\n }) as Readonly<Record<string, AnyVarRef>>;\n};\n\n/**\n * Creates variable references from variable definitions.\n *\n * Maps each variable definition to a VarRef pointing to that variable.\n * Used in operation builders to create the `$` context object.\n *\n * @internal\n */\nexport const createVarRefs = <TVarDefinitions extends VariableDefinitions>(\n definitions: TVarDefinitions,\n): Readonly<Record<string, AnyVarRef>> =>\n mapValues(definitions as VariableDefinitions, (_, name): AnyVarRef => createVarRefFromVariable(name)) as Readonly<\n Record<string, AnyVarRef>\n >;\n","/**\n * Shared utility for merging variable definitions from interpolated fragments.\n * Used by both fragment and operation tagged template implementations.\n * @module\n */\n\nimport { Fragment } from \"../types/element\";\nimport type { AnyFragment } from \"../types/element/fragment\";\nimport type { AnyFieldsExtended } from \"../types/fragment\";\nimport type { AnyVarRef, VariableDefinitions } from \"../types/type-foundation\";\n\n/**\n * Merge variable definitions from interpolated fragments into the parent's variable definitions.\n * Deduplicates variables with matching names and types, throws on conflicting types.\n */\nexport function mergeVariableDefinitions(\n parentVars: VariableDefinitions,\n interpolationMap: ReadonlyMap<string, AnyFragment | ((ctx: { $: Readonly<Record<string, AnyVarRef>> }) => AnyFieldsExtended)>,\n): VariableDefinitions {\n const merged: Record<string, VariableDefinitions[string]> = { ...parentVars };\n\n for (const value of interpolationMap.values()) {\n // Only direct Fragment instances have variable definitions to merge\n // Callback interpolations handle their own variable context\n if (value instanceof Fragment) {\n const childVars = value.variableDefinitions;\n for (const [varName, varDef] of Object.entries(childVars)) {\n if (varName in merged) {\n // Variable already exists - check if types match\n const existing = merged[varName];\n // Compare kind, name, and modifier to determine if types are compatible\n if (existing?.kind !== varDef.kind || existing?.name !== varDef.name || existing?.modifier !== varDef.modifier) {\n throw new Error(\n `Variable definition conflict: $${varName} is defined with incompatible types ` +\n `(${existing?.kind}:${existing?.name}:${existing?.modifier} vs ${varDef.kind}:${varDef.name}:${varDef.modifier})`,\n );\n }\n // Types match - no need to duplicate\n } else {\n // New variable - add to merged definitions\n merged[varName] = varDef;\n }\n }\n }\n }\n\n return merged as VariableDefinitions;\n}\n","/**\n * Utilities for extracting values and paths from VarRefs.\n *\n * Provides type-safe access to nested values within VarRefs,\n * supporting both variable references and literal values.\n *\n * @module\n */\n\nimport type { ConstValue } from \"../types/type-foundation/const-value\";\nimport {\n type AnyVarRef,\n type AnyVarRefBrand,\n type NestedValueElement,\n VarRef,\n type VarRefInner,\n} from \"../types/type-foundation/var-ref\";\n\n/**\n * Recursively checks if a NestedValue contains any VarRef.\n *\n * Used by getVarRefValue to determine if it's safe to return as ConstValue.\n * @internal\n */\nexport const hasVarRefInside = (value: NestedValueElement | unknown): boolean => {\n if (value instanceof VarRef) {\n return true;\n }\n\n if (Array.isArray(value)) {\n return value.some(hasVarRefInside);\n }\n\n if (typeof value === \"object\" && value !== null) {\n return Object.values(value).some(hasVarRefInside);\n }\n\n return false;\n};\n\n/**\n * Get the variable name from a VarRef.\n * Throws if the VarRef contains a nested-value instead of a variable reference.\n */\nexport const getVarRefName = (varRef: AnyVarRef): string => {\n const inner = VarRef.getInner(varRef);\n if (inner.type !== \"variable\") {\n throw new Error(\"Expected variable reference, got nested-value\");\n }\n return inner.name;\n};\n\n/**\n * Get the const value from a VarRef.\n * Throws if the VarRef contains a variable reference instead of a nested-value,\n * or if the nested-value contains any VarRef inside.\n */\nexport const getVarRefValue = (varRef: AnyVarRef): ConstValue => {\n const inner = VarRef.getInner(varRef);\n if (inner.type !== \"nested-value\") {\n throw new Error(\"Expected nested-value, got variable reference\");\n }\n if (hasVarRefInside(inner.value)) {\n throw new Error(\"Cannot get const value: nested-value contains VarRef\");\n }\n return inner.value as ConstValue;\n};\n\n// ============================================================================\n// Path Types and Utilities\n// ============================================================================\n/**\n * Path segment types for navigating nested values.\n */\nexport type PathSegment = string;\n\n// biome-ignore lint/suspicious/noExplicitAny: abstract type\ntype AnySelectableProxy = any;\n\n/**\n * Type-safe path builder function.\n * Used with getNameAt and getValueAt helpers.\n */\nexport type Selector<T, U> = (proxy: T) => U;\ntype ProxyInner = {\n readonly varInner: VarRefInner | { type: \"virtual\"; varName: string; varSegments: readonly PathSegment[] };\n readonly segments: readonly PathSegment[];\n};\nconst SelectableProxyInnerRegistry = new WeakMap<AnySelectableProxy, ProxyInner>();\nconst getSelectableProxyInner = (proxy: AnySelectableProxy): ProxyInner => {\n const inner = SelectableProxyInnerRegistry.get(proxy);\n if (!inner) {\n throw new Error(`Proxy inner not found`);\n }\n return inner;\n};\nconst createSelectableProxy = <T>(current: ProxyInner): T => {\n const proxy: T = new Proxy(Object.create(null), {\n get(_, property) {\n if (typeof property === \"symbol\") {\n throw new Error(`Prohibited property access: ${String(property)}`);\n }\n const nextSegments = [...current.segments, property];\n\n if (current.varInner.type === \"virtual\") {\n return createSelectableProxy({\n varInner: current.varInner,\n segments: nextSegments,\n });\n }\n\n if (current.varInner.type === \"variable\") {\n return createSelectableProxy({\n varInner: { type: \"virtual\", varName: current.varInner.name, varSegments: nextSegments },\n segments: nextSegments,\n });\n }\n\n if (typeof current.varInner.value === \"object\" && current.varInner.value !== null) {\n const value = (current.varInner.value as { [key: string]: NestedValueElement })[property];\n return createSelectableProxy({\n varInner: value instanceof VarRef ? VarRef.getInner(value) : { type: \"nested-value\", value },\n segments: nextSegments,\n });\n }\n\n throw new Error(`Cannot access children of primitive value at path [${current.segments.join(\".\")}]`);\n },\n });\n\n SelectableProxyInnerRegistry.set(proxy, current);\n\n return proxy;\n};\n\n/**\n * Get the variable name from a VarRef at a specific path.\n *\n * @param varRef - The VarRef containing a nested-value\n * @param selector - Path builder function, e.g., p => p.user.age\n * @returns The variable name at the specified path\n * @throws If path doesn't lead to a VarRef with type \"variable\"\n *\n * @example\n * const ref = createVarRefFromNestedValue({\n * user: { age: someVariableRef }\n * });\n * getNameAt(ref, p => p.user.age); // returns the variable name\n */\nexport const getNameAt = <T, U>(varRef: VarRef<AnyVarRefBrand>, selector: (proxy: T) => U): string => {\n const proxy = createSelectableProxy<T>({ varInner: VarRef.getInner(varRef), segments: [] });\n const selected = selector(proxy);\n const inner = getSelectableProxyInner(selected);\n\n if (inner.varInner.type === \"virtual\") {\n throw new Error(`Value at path [${inner.segments.join(\".\")}] is inside a variable`);\n }\n\n if (inner.varInner.type !== \"variable\") {\n throw new Error(`Value at path [${inner.segments.join(\".\")}] is not a variable`);\n }\n\n return inner.varInner.name;\n};\n\n/**\n * Get the const value from a nested-value VarRef at a specific path.\n *\n * @param varRef - The VarRef containing a nested-value\n * @param pathFn - Path builder function, e.g., p => p.user.name\n * @returns The const value at the specified path\n * @throws If path leads to a VarRef or if value contains VarRef inside\n *\n * @example\n * const ref = createVarRefFromNestedValue({\n * user: { name: \"Alice\", age: someVariableRef }\n * });\n * getValueAt(ref, p => p.user.name); // returns \"Alice\"\n */\nexport const getValueAt = <T, U>(varRef: VarRef<AnyVarRefBrand>, selector: (proxy: T) => U): U => {\n const proxy = createSelectableProxy<T>({ varInner: VarRef.getInner(varRef), segments: [] });\n const selected = selector(proxy);\n const inner = getSelectableProxyInner(selected);\n\n if (inner.varInner.type === \"virtual\") {\n throw new Error(`Value at path [${inner.segments.join(\".\")}] is inside a variable`);\n }\n\n if (inner.varInner.type !== \"nested-value\") {\n throw new Error(`Value at path [${inner.segments.join(\".\")}] is not a nested-value`);\n }\n\n if (hasVarRefInside(inner.varInner.value)) {\n throw new Error(`Value at path [${inner.segments.join(\".\")}] contains nested VarRef`);\n }\n\n return inner.varInner.value as U;\n};\n\n/**\n * Gets the full path to a variable within a nested structure.\n *\n * Returns path segments starting with `$variableName` followed by\n * property accesses within that variable's value.\n *\n * @example\n * ```typescript\n * getVariablePath($.filter, p => p.user.id)\n * // Returns: [\"$filter\", \"user\", \"id\"]\n * ```\n */\nexport const getVariablePath = <T, U>(varRef: VarRef<AnyVarRefBrand>, selector: (proxy: T) => U): readonly PathSegment[] => {\n const proxy = createSelectableProxy<T>({ varInner: VarRef.getInner(varRef), segments: [] });\n const selected = selector(proxy);\n const inner = getSelectableProxyInner(selected);\n\n if (inner.varInner.type === \"virtual\") {\n return [`$${inner.varInner.varName}`, ...inner.segments.slice(inner.varInner.varSegments.length)];\n }\n\n if (inner.varInner.type === \"variable\") {\n return [`$${inner.varInner.name}`];\n }\n\n throw new Error(`Value at path [${inner.segments.join(\".\")}] is not a variable or inside a variable`);\n};\n\n// ============================================================================\n// Singleton for metadata builder context\n// ============================================================================\n\nimport type { VarRefTools } from \"../types/metadata/metadata\";\n\n/** Pre-built tools object passed as `$var` in metadata builder callbacks. */\nexport const varRefTools: VarRefTools = Object.freeze({\n getName: getVarRefName,\n getValue: getVarRefValue,\n getNameAt,\n getValueAt,\n getPath: getVariablePath,\n hasVarRefInside,\n});\n","/**\n * Fragment tagged template function for creating GraphQL fragments from template literals.\n * Supports Fragment Arguments RFC syntax for parameterized fragments.\n * @module\n */\n\nimport { Kind, parse as parseGraphql, type SelectionSetNode } from \"graphql\";\nimport { buildVarSpecifiers, createSchemaIndexFromSchema, preprocessFragmentArgs } from \"../graphql\";\nimport { findMatchingParen } from \"../graphql/fragment-args-preprocessor\";\nimport type { SchemaIndex } from \"../graphql/schema-index\";\nimport { Fragment } from \"../types/element\";\nimport type { AnyFragment } from \"../types/element/fragment\";\nimport type { AnyFieldSelection, AnyFieldsExtended } from \"../types/fragment\";\nimport type { VarRefTools } from \"../types/metadata/metadata\";\nimport type { AnyGraphqlSchema } from \"../types/schema\";\nimport type { AnyVarRef, VariableDefinitions } from \"../types/type-foundation\";\nimport type { AnyDirectiveRef } from \"../types/type-foundation/directive-ref\";\nimport { DirectiveRef } from \"../types/type-foundation/directive-ref\";\nimport { createVarRefFromVariable } from \"../types/type-foundation/var-ref\";\nimport { parseOutputField } from \"../utils/deferred-specifier-parser\";\nimport { createFieldFactories } from \"./fields-builder\";\nimport { recordFragmentUsage } from \"./fragment-usage-context\";\nimport { createVarAssignments } from \"./input\";\nimport { mergeVariableDefinitions } from \"./merge-variable-definitions\";\nimport type { FragmentTemplateMetadataOptions, TemplateResult } from \"./operation-tagged-template\";\nimport { varRefTools } from \"./var-ref-tools\";\n\n/** Tagged template function type for fragments. */\nexport type FragmentTaggedTemplateFunction = (\n strings: TemplateStringsArray,\n ...values: (AnyFragment | ((ctx: { $: Readonly<Record<string, AnyVarRef>> }) => AnyFieldsExtended))[]\n) => TemplateResult<AnyFragment>;\n\n/**\n * Extract the argument list text from a fragment definition with Fragment Arguments syntax.\n * Returns the text between parens in `fragment Name(...) on Type`, or null if no args.\n */\nfunction extractFragmentArgText(rawSource: string): string | null {\n const match = /\\bfragment\\s+\\w+\\s*\\(/.exec(rawSource);\n if (!match) return null;\n\n const openIndex = match.index + match[0].length - 1;\n const closeIndex = findMatchingParen(rawSource, openIndex);\n if (closeIndex === -1) return null;\n\n const afterParen = rawSource.slice(closeIndex + 1).trimStart();\n if (afterParen.startsWith(\"on\")) {\n return rawSource.slice(openIndex + 1, closeIndex);\n }\n return null;\n}\n\n/**\n * Extract variable definitions from Fragment Arguments syntax.\n * Wraps the argument list in a synthetic query to parse with graphql-js.\n */\nexport function extractFragmentVariables(rawSource: string, schemaIndex: SchemaIndex): VariableDefinitions {\n const argText = extractFragmentArgText(rawSource);\n if (!argText?.trim()) return {};\n\n const syntheticQuery = `query _Synthetic(${argText}) { __typename }`;\n\n let syntheticDoc: import(\"graphql\").DocumentNode;\n try {\n syntheticDoc = parseGraphql(syntheticQuery);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to parse fragment argument definitions: ${message}`);\n }\n\n const opDef = syntheticDoc.definitions[0];\n if (!opDef || opDef.kind !== Kind.OPERATION_DEFINITION) {\n return {};\n }\n\n const varDefNodes = opDef.variableDefinitions ?? [];\n // BuiltVarSpecifier is structurally compatible at runtime; cast needed because\n // BuiltVarSpecifier.defaultValue uses `unknown` while VarSpecifier uses `ConstValue`\n return buildVarSpecifiers(varDefNodes, schemaIndex) as VariableDefinitions;\n}\n\n/**\n * Filters out named fragment spreads that cannot be resolved without an interpolation map.\n * Used when building fields from compat templates or zero-interpolation tagged templates\n * that may contain standard GraphQL `...FragmentName` spreads.\n */\nexport function filterUnresolvedFragmentSpreads(\n selectionSet: SelectionSetNode,\n interpolationMap?: ReadonlyMap<string, unknown>,\n): SelectionSetNode {\n return {\n ...selectionSet,\n selections: selectionSet.selections\n .filter((sel) => {\n if (sel.kind !== Kind.FRAGMENT_SPREAD) return true;\n // Keep spreads that are in the interpolation map (e.g., __INTERPOLATION_N__)\n return interpolationMap?.has(sel.name.value) ?? false;\n })\n .map((sel) => {\n // Recurse into field and inline fragment selection sets\n if (sel.kind === Kind.FIELD && sel.selectionSet) {\n return { ...sel, selectionSet: filterUnresolvedFragmentSpreads(sel.selectionSet, interpolationMap) };\n }\n if (sel.kind === Kind.INLINE_FRAGMENT && sel.selectionSet) {\n return { ...sel, selectionSet: filterUnresolvedFragmentSpreads(sel.selectionSet, interpolationMap) };\n }\n return sel;\n }),\n };\n}\n\n/**\n * Builds field selections from a GraphQL AST SelectionSet by driving field factories.\n * Converts parsed AST selections into the AnyFieldsExtended format that the document builder expects.\n * Also used by typegen for static field extraction from tagged templates.\n */\nexport function buildFieldsFromSelectionSet(\n selectionSet: SelectionSetNode,\n schema: AnyGraphqlSchema,\n typeName: string,\n varAssignments?: Readonly<Record<string, AnyVarRef>>,\n interpolationMap?: ReadonlyMap<string, AnyFragment | ((ctx: { $: Readonly<Record<string, AnyVarRef>> }) => AnyFieldsExtended)>,\n): AnyFieldsExtended {\n const f = createFieldFactories(schema, typeName);\n const result: Record<string, unknown> = {};\n\n for (const selection of selectionSet.selections) {\n if (selection.kind === Kind.FIELD) {\n const fieldName = selection.name.value;\n const alias = selection.alias?.value ?? fieldName;\n // __typename is an implicit introspection field on all object types\n if (fieldName === \"__typename\") {\n result[alias] = true;\n continue;\n }\n\n // Build args and directives from AST\n const args = buildArgsFromASTArguments(selection.arguments ?? [], varAssignments);\n const directives = buildDirectivesFromAST(selection.directives, varAssignments);\n const hasAlias = alias !== fieldName;\n const extras =\n hasAlias || directives.length > 0\n ? { ...(hasAlias ? { alias } : {}), ...(directives.length > 0 ? { directives } : {}) }\n : undefined;\n\n if (selection.selectionSet) {\n // Object/union field — f(\"fieldName\", args, extras) returns a curried function\n const curried = f(fieldName, args as AnyFieldSelection[\"args\"], extras);\n if (typeof curried === \"function\") {\n // Detect union type via field specifier (runtime duck-typing)\n const typeDef = schema.object[typeName];\n const fieldDefRaw = typeDef?.fields[fieldName];\n const fieldSpec = typeof fieldDefRaw === \"string\" ? fieldDefRaw : (fieldDefRaw as unknown as { spec: string })?.spec;\n const parsedType = parseOutputField(fieldSpec as import(\"../types/type-foundation\").DeferredOutputField);\n\n if (parsedType.kind === \"union\") {\n // Union field: collect InlineFragmentNodes, build NestedUnionFieldsBuilder input\n const unionInput: Record<string, unknown> = {};\n let hasTypename = false;\n const unsupportedSelections: string[] = [];\n\n for (const sel of selection.selectionSet.selections) {\n if (sel.kind === Kind.INLINE_FRAGMENT) {\n if (!sel.typeCondition) {\n throw new Error(\"Inline fragments without type conditions are not supported in tagged templates\");\n }\n const memberName = sel.typeCondition.name.value;\n // Validate member is part of the union\n const unionDef = schema.union[parsedType.name];\n if (!unionDef) {\n throw new Error(`Union \"${parsedType.name}\" is not defined in schema`);\n }\n const isMember = memberName in unionDef.types;\n if (!isMember) {\n throw new Error(\n `Type \"${memberName}\" is not a member of union \"${parsedType.name}\" in tagged template inline fragment`,\n );\n }\n if (memberName in unionInput) {\n throw new Error(\n `Duplicate inline fragment for union member \"${memberName}\" in tagged template. ` +\n `Merge selections into a single \"... on ${memberName} { ... }\" block.`,\n );\n }\n const memberFields = buildFieldsFromSelectionSet(\n sel.selectionSet,\n schema,\n memberName,\n varAssignments,\n interpolationMap,\n );\n const memberDirectives = buildDirectivesFromAST(sel.directives, varAssignments, \"INLINE_FRAGMENT\");\n unionInput[memberName] = { fields: memberFields, directives: memberDirectives };\n } else if (sel.kind === Kind.FIELD && sel.name.value === \"__typename\") {\n if (sel.alias) {\n throw new Error(\n `Aliases on __typename in union selections are not supported in tagged templates. ` +\n `Use \"__typename\" without an alias.`,\n );\n }\n if (sel.directives?.length) {\n throw new Error(`Directives on __typename in union selections are not supported in tagged templates.`);\n }\n hasTypename = true;\n } else {\n // Track unsupported selections for deferred error reporting\n const desc = sel.kind === Kind.FIELD ? `Field \"${sel.name.value}\"` : \"Fragment spread\";\n unsupportedSelections.push(desc);\n }\n }\n\n // Post-loop validation\n const hasInlineFragments = Object.keys(unionInput).length > 0;\n\n if (unsupportedSelections.length > 0) {\n if (hasInlineFragments) {\n // Unsupported selections alongside real inline fragments\n throw new Error(\n `${unsupportedSelections[0]} alongside inline fragments in union selection is not supported in tagged templates. Use per-member inline fragments instead.`,\n );\n }\n // No inline fragments at all — require them\n throw new Error(\n `Union field \"${fieldName}\" requires at least __typename or inline fragment syntax (... on Type { fields }) in tagged templates`,\n );\n }\n\n // Must have at least __typename or an inline fragment\n if (!hasInlineFragments && !hasTypename) {\n throw new Error(\n `Union field \"${fieldName}\" requires at least __typename or inline fragment syntax (... on Type { fields }) in tagged templates`,\n );\n }\n\n if (hasTypename) {\n (unionInput as Record<string, unknown>).__typename = true;\n }\n\n const fieldResult = (curried as (nest: unknown) => Record<string, unknown>)(unionInput);\n Object.assign(result, fieldResult);\n } else {\n // Object field: existing path\n const nestedFields = buildFieldsFromSelectionSet(\n selection.selectionSet,\n schema,\n resolveFieldTypeName(schema, typeName, fieldName),\n varAssignments,\n interpolationMap,\n );\n const fieldResult = (curried as (nest: unknown) => Record<string, unknown>)(\n ({ f: nestedFactories }: { f: unknown }) => {\n // Ignore the provided factories; use pre-built fields\n void nestedFactories;\n return nestedFields;\n },\n );\n Object.assign(result, fieldResult);\n }\n } else {\n Object.assign(result, curried);\n }\n } else {\n // Scalar/enum field — f(\"fieldName\", args, extras) returns the field selection directly\n const fieldResult = f(fieldName, args as AnyFieldSelection[\"args\"], extras);\n if (typeof fieldResult === \"function\") {\n // Object field used without selection set — just call with empty builder\n const emptyResult = (fieldResult as (nest: unknown) => Record<string, unknown>)(() => ({}));\n Object.assign(result, emptyResult);\n } else {\n Object.assign(result, fieldResult);\n }\n }\n } else if (selection.kind === Kind.FRAGMENT_SPREAD) {\n // Handle fragment spread: ...FragmentName\n const fragmentName = selection.name.value;\n\n // Check interpolation map for interpolated fragments\n if (interpolationMap?.has(fragmentName)) {\n const interpolatedValue = interpolationMap.get(fragmentName);\n if (!interpolatedValue) {\n throw new Error(`Interpolation placeholder \"${fragmentName}\" has no value`);\n }\n\n let spreadFields: AnyFieldsExtended;\n if (interpolatedValue instanceof Fragment) {\n // Direct fragment interpolation: ...${frag}\n spreadFields = interpolatedValue.spread(varAssignments as never);\n } else {\n // Callback interpolation: ...${($) => frag.spread(args)}\n if (!varAssignments) {\n throw new Error(`Callback interpolation requires variable context`);\n }\n spreadFields = interpolatedValue({ $: varAssignments });\n }\n Object.assign(result, spreadFields);\n } else {\n // Fragment spread without interpolation - must use interpolation syntax\n throw new Error(\n `Fragment spread \"...${fragmentName}\" in tagged template must use interpolation syntax. ` +\n `Use \\`...@\\${fragment}\\` instead of \\`...FragmentName\\`.`,\n );\n }\n } else if (selection.kind === Kind.INLINE_FRAGMENT) {\n throw new Error(\n \"Inline fragments (... on Type) at the top level are not supported in tagged templates. \" +\n \"Use inline fragments only inside union field selections.\",\n );\n }\n }\n\n return result as AnyFieldsExtended;\n}\n\n/**\n * Convert GraphQL AST DirectiveNodes to DirectiveRef instances.\n * Reuses buildArgsFromASTArguments for directive argument conversion.\n */\nfunction buildDirectivesFromAST(\n directives: readonly import(\"graphql\").DirectiveNode[] | undefined,\n varAssignments?: Readonly<Record<string, AnyVarRef>>,\n location: import(\"../types/type-foundation/directive-ref\").ExecutableDirectiveLocation = \"FIELD\",\n): AnyDirectiveRef[] {\n if (!directives || directives.length === 0) return [];\n return directives.map(\n (d) =>\n new DirectiveRef({\n name: d.name.value,\n arguments: buildArgsFromASTArguments(d.arguments ?? [], varAssignments),\n locations: [location],\n }),\n );\n}\n\n/**\n * Build a simple args object from GraphQL AST argument nodes.\n * Extracts literal values from the AST for passing to field factories.\n */\nfunction buildArgsFromASTArguments(\n args: readonly {\n readonly name: { readonly value: string };\n readonly value: { readonly kind: string; readonly value?: unknown };\n }[],\n varAssignments?: Readonly<Record<string, AnyVarRef>>,\n): Record<string, unknown> {\n if (args.length === 0) return {};\n const result: Record<string, unknown> = {};\n for (const arg of args) {\n result[arg.name.value] = extractASTValue(arg.value, varAssignments);\n }\n return result;\n}\n\n/**\n * Extract a runtime value from a GraphQL AST ValueNode.\n */\nfunction extractASTValue(\n node: {\n readonly kind: string;\n readonly value?: unknown;\n readonly values?: readonly unknown[];\n readonly fields?: readonly { readonly name: { readonly value: string }; readonly value: unknown }[];\n },\n varAssignments?: Readonly<Record<string, AnyVarRef>>,\n): unknown {\n switch (node.kind) {\n case Kind.INT:\n return Number.parseInt(node.value as string, 10);\n case Kind.FLOAT:\n return Number.parseFloat(node.value as string);\n case Kind.STRING:\n case Kind.BOOLEAN:\n case Kind.ENUM:\n return node.value;\n case Kind.NULL:\n return null;\n case Kind.LIST:\n return (node.values as readonly { kind: string; value?: unknown }[])?.map((v) => extractASTValue(v, varAssignments)) ?? [];\n case Kind.OBJECT:\n return Object.fromEntries(\n (node.fields ?? []).map((f) => [\n f.name.value,\n extractASTValue(f.value as { kind: string; value?: unknown }, varAssignments),\n ]),\n );\n case Kind.VARIABLE: {\n const varName = (node as unknown as { name: { value: string } }).name.value;\n if (varAssignments && varName in varAssignments) {\n // biome-ignore lint/style/noNonNullAssertion: Checked with `in` operator above\n return varAssignments[varName]!;\n }\n return createVarRefFromVariable(varName);\n }\n default:\n return undefined;\n }\n}\n\n/**\n * Resolve the output type name for a field on a given type.\n * Looks up the field's type specifier in the schema and extracts the type name.\n * Handles both string specifiers (\"o|Avatar|?\") and object specifiers ({ spec: \"o|Avatar|?\" }).\n */\nfunction resolveFieldTypeName(schema: AnyGraphqlSchema, typeName: string, fieldName: string): string {\n const typeDef = schema.object[typeName];\n if (!typeDef) {\n throw new Error(`Type \"${typeName}\" is not defined in schema objects`);\n }\n // Runtime duck-typing: codegen may emit string or { spec, arguments }\n const fieldDef = typeDef.fields[fieldName] as string | { spec: string } | undefined;\n if (!fieldDef) {\n throw new Error(`Field \"${fieldName}\" is not defined on type \"${typeName}\"`);\n }\n const specStr = typeof fieldDef === \"string\" ? fieldDef : fieldDef.spec;\n const parts = specStr.split(\"|\");\n return parts[1] ?? typeName;\n}\n\n/** Curried fragment function type: fragment(\"name\", \"type\")`{ fields }` */\nexport type CurriedFragmentFunction = (name: string, typeName: string) => FragmentTaggedTemplateFunction;\n\n/**\n * Construct a synthetic GraphQL fragment source from JS arguments and template body.\n * Handles optional variable declarations: `($var: Type!) { fields }` or `{ fields }`.\n */\nfunction buildSyntheticFragmentSource(name: string, typeName: string, body: string): string {\n const trimmed = body.trim();\n if (trimmed.startsWith(\"(\")) {\n // Has variable declarations — find the matching closing paren\n const closeIndex = findMatchingParen(trimmed, 0);\n if (closeIndex === -1) {\n throw new Error(\"Unmatched parenthesis in fragment variable declarations\");\n }\n const varDecls = trimmed.slice(0, closeIndex + 1);\n const selectionSet = trimmed.slice(closeIndex + 1).trim();\n return `fragment ${name}${varDecls} on ${typeName} ${selectionSet}`;\n }\n return `fragment ${name} on ${typeName} ${trimmed}`;\n}\n\n/**\n * Creates a curried tagged template function for fragments.\n * New API: `fragment(\"name\", \"type\")\\`{ fields }\\`` returns TemplateResult<AnyFragment>.\n *\n * @param schema - The GraphQL schema definition\n */\nexport function createFragmentTaggedTemplate<TSchema extends AnyGraphqlSchema>(schema: TSchema): CurriedFragmentFunction {\n const schemaIndex = createSchemaIndexFromSchema(schema);\n\n return (fragmentName: string, onType: string): FragmentTaggedTemplateFunction => {\n // Validate onType exists in schema at curried call time\n if (!(onType in schema.object)) {\n throw new Error(`Type \"${onType}\" is not defined in schema objects`);\n }\n\n return (\n strings: TemplateStringsArray,\n ...values: (AnyFragment | ((ctx: { $: Readonly<Record<string, AnyVarRef>> }) => AnyFieldsExtended))[]\n ): TemplateResult<AnyFragment> => {\n // Validate interpolated values are fragments or callbacks\n for (let i = 0; i < values.length; i++) {\n const value = values[i];\n if (!(value instanceof Fragment) && typeof value !== \"function\") {\n throw new Error(\n `Tagged templates only accept Fragment instances or callback functions as interpolated values. ` +\n `Received ${typeof value} at position ${i}.`,\n );\n }\n }\n\n // Build template body with placeholders for interpolations\n let body = strings[0] ?? \"\";\n const interpolationMap = new Map<\n string,\n AnyFragment | ((ctx: { $: Readonly<Record<string, AnyVarRef>> }) => AnyFieldsExtended)\n >();\n\n for (let i = 0; i < values.length; i++) {\n const placeholderName = `__INTERPOLATION_${i}__`;\n interpolationMap.set(\n placeholderName,\n values[i] as AnyFragment | ((ctx: { $: Readonly<Record<string, AnyVarRef>> }) => AnyFieldsExtended),\n );\n body += placeholderName + (strings[i + 1] ?? \"\");\n }\n\n // Construct synthetic GraphQL source from JS args and template body\n const rawSource = buildSyntheticFragmentSource(fragmentName, onType, body);\n\n // Extract variables from Fragment Arguments syntax\n let varSpecifiers = extractFragmentVariables(rawSource, schemaIndex);\n\n // Merge variable definitions from interpolated fragments\n varSpecifiers = mergeVariableDefinitions(varSpecifiers, interpolationMap);\n\n // Preprocess to strip Fragment Arguments syntax\n const { preprocessed } = preprocessFragmentArgs(rawSource);\n\n // Parse the preprocessed GraphQL\n let document: import(\"graphql\").DocumentNode;\n try {\n document = parseGraphql(preprocessed);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`GraphQL parse error in tagged template: ${message}`);\n }\n\n // Extract the fragment definition (synthesized source guarantees exactly one)\n const fragmentDefs = document.definitions.filter((def) => def.kind === Kind.FRAGMENT_DEFINITION);\n if (fragmentDefs.length !== 1) {\n throw new Error(`Internal error: expected exactly one fragment definition in synthesized source`);\n }\n\n // biome-ignore lint/style/noNonNullAssertion: Length checked above\n const fragNode = fragmentDefs[0]!;\n if (fragNode.kind !== Kind.FRAGMENT_DEFINITION) {\n throw new Error(\"Unexpected definition kind\");\n }\n\n return (options?: FragmentTemplateMetadataOptions): AnyFragment => {\n // biome-ignore lint/suspicious/noExplicitAny: Fragment.create requires concrete schema type\n return Fragment.create<any, typeof onType, typeof varSpecifiers, AnyFieldsExtended>(() => ({\n typename: onType,\n key: fragmentName,\n schemaLabel: schema.label,\n variableDefinitions: varSpecifiers,\n // biome-ignore lint/suspicious/noExplicitAny: Runtime-only spread needs dynamic variable types\n spread: (variables: any) => {\n const $ = createVarAssignments(varSpecifiers, variables);\n\n // Handle metadata - can be static value or callback\n let metadataBuilder: (() => unknown | Promise<unknown>) | null = null;\n if (options?.metadata !== undefined) {\n const metadata = options.metadata;\n if (typeof metadata === \"function\") {\n metadataBuilder = () =>\n (metadata as (ctx: { $: unknown; $var: VarRefTools }) => unknown | Promise<unknown>)({\n $,\n $var: varRefTools,\n });\n } else {\n metadataBuilder = () => metadata;\n }\n }\n\n recordFragmentUsage({\n metadataBuilder,\n path: null,\n });\n\n return buildFieldsFromSelectionSet(\n fragNode.selectionSet,\n schema,\n onType,\n $ as Readonly<Record<string, AnyVarRef>>,\n interpolationMap,\n );\n },\n // biome-ignore lint/suspicious/noExplicitAny: Tagged template fragments bypass full type inference\n })) as any;\n };\n };\n };\n}\n","/**\n * Core operation building logic shared by operation and extend composers.\n * @module\n * @internal\n */\n\nimport type { VariableDefinitionNode } from \"graphql\";\nimport { Operation } from \"../types/element\";\nimport type { AnyOperationOf } from \"../types/element/operation\";\nimport type { AnyFieldsExtended } from \"../types/fragment\";\nimport type {\n AnyMetadataAdapter,\n DocumentTransformer,\n ExtractAdapterTypes,\n FragmentMetaInfo,\n MetadataBuilder,\n OperationDocumentTransformer,\n} from \"../types/metadata\";\nimport type { AnyGraphqlSchema, OperationType } from \"../types/schema\";\nimport type { VariableDefinitions } from \"../types/type-foundation\";\nimport { isPromiseLike } from \"../utils/promise\";\nimport { buildDocument } from \"./build-document\";\nimport type { FieldsBuilder } from \"./fields-builder\";\nimport { createFieldFactories } from \"./fields-builder\";\nimport { withFragmentUsageCollection } from \"./fragment-usage-context\";\nimport { createVarRefs } from \"./input\";\nimport { varRefTools } from \"./var-ref-tools\";\n\n/**\n * Shared base parameters for building an operation artifact.\n * @internal\n */\ntype OperationCoreParamsBase<\n TSchema extends AnyGraphqlSchema,\n TOperationType extends OperationType,\n TOperationName extends string,\n TVarDefinitions extends VariableDefinitions,\n TOperationMetadata,\n TAdapter extends AnyMetadataAdapter,\n> = {\n readonly schema: TSchema;\n readonly operationType: TOperationType;\n readonly operationTypeName: TSchema[\"operations\"][TOperationType] & keyof TSchema[\"object\"] & string;\n readonly operationName: TOperationName;\n readonly variables: TVarDefinitions;\n /** Pre-parsed VariableDefinitionNode[] from tagged template or options object parser */\n readonly variableDefinitionNodes?: readonly VariableDefinitionNode[];\n readonly adapter: TAdapter;\n readonly metadata?: MetadataBuilder<\n Readonly<Record<string, import(\"../types/type-foundation\").AnyVarRef>>,\n TOperationMetadata,\n ExtractAdapterTypes<TAdapter>[\"aggregatedFragmentMetadata\"],\n ExtractAdapterTypes<TAdapter>[\"schemaLevel\"]\n >;\n readonly transformDocument?: OperationDocumentTransformer<TOperationMetadata>;\n readonly adapterTransformDocument?: DocumentTransformer<\n ExtractAdapterTypes<TAdapter>[\"schemaLevel\"],\n ExtractAdapterTypes<TAdapter>[\"aggregatedFragmentMetadata\"]\n >;\n};\n\n/**\n * Parameters for building an operation artifact.\n * Uses `fieldsFactory` to evaluate fields and build document.\n *\n * @internal Used by extend.ts and operation-tagged-template.ts\n */\nexport type OperationCoreParams<\n TSchema extends AnyGraphqlSchema,\n TOperationType extends OperationType,\n TOperationName extends string,\n TVarDefinitions extends VariableDefinitions,\n TFields extends AnyFieldsExtended,\n TOperationMetadata,\n TAdapter extends AnyMetadataAdapter,\n> = OperationCoreParamsBase<TSchema, TOperationType, TOperationName, TVarDefinitions, TOperationMetadata, TAdapter> & {\n readonly fieldsFactory: FieldsBuilder<TFields>;\n};\n\n/**\n * Result type from buildOperationArtifact.\n * Matches the artifact shape expected by Operation.create().\n */\nexport type OperationArtifactResult<\n TOperationType extends OperationType,\n TOperationName extends string,\n TVarDefinitions extends VariableDefinitions,\n TFields extends AnyFieldsExtended,\n TOperationMetadata,\n> = {\n readonly operationType: TOperationType;\n readonly operationName: TOperationName;\n readonly schemaLabel: string;\n readonly variableNames: (keyof TVarDefinitions & string)[];\n readonly documentSource: () => TFields;\n readonly document: ReturnType<typeof buildDocument>;\n readonly metadata: TOperationMetadata | undefined;\n};\n\n/**\n * Builds an operation artifact from the provided parameters.\n *\n * This function contains the core logic for:\n * - Creating variable refs and field factories\n * - Evaluating fields with fragment usage tracking\n * - Building the document\n * - Handling metadata (sync and async)\n * - Applying document transformations\n *\n * @param params - Operation building parameters\n * @returns Operation artifact or Promise of artifact (if async metadata)\n *\n * @internal Used by extend.ts and operation-tagged-template.ts\n */\nexport const buildOperationArtifact = <\n TSchema extends AnyGraphqlSchema,\n TOperationType extends OperationType,\n TOperationName extends string,\n TVarDefinitions extends VariableDefinitions,\n TFields extends AnyFieldsExtended,\n TOperationMetadata,\n TAdapter extends AnyMetadataAdapter,\n>(\n params: OperationCoreParams<TSchema, TOperationType, TOperationName, TVarDefinitions, TFields, TOperationMetadata, TAdapter>,\n):\n | OperationArtifactResult<TOperationType, TOperationName, TVarDefinitions, TFields, TOperationMetadata>\n | Promise<OperationArtifactResult<TOperationType, TOperationName, TVarDefinitions, TFields, TOperationMetadata>> => {\n type TFragmentMetadata = ExtractAdapterTypes<TAdapter>[\"fragmentMetadata\"];\n type TAggregatedFragmentMetadata = ExtractAdapterTypes<TAdapter>[\"aggregatedFragmentMetadata\"];\n type TSchemaLevel = ExtractAdapterTypes<TAdapter>[\"schemaLevel\"];\n\n const {\n schema,\n operationType,\n operationTypeName,\n operationName,\n variables,\n variableDefinitionNodes,\n adapter,\n metadata: metadataBuilder,\n transformDocument: operationTransformDocument,\n adapterTransformDocument,\n } = params;\n\n // Create variable refs (needed for both field factory and metadata builder)\n const $ = createVarRefs<TVarDefinitions>(variables);\n\n const { fieldsFactory } = params;\n const f = createFieldFactories(schema, operationTypeName);\n\n // Evaluate fields with fragment tracking\n const collected = withFragmentUsageCollection(() => fieldsFactory({ f, $ }));\n const fields = collected.result;\n type FragmentUsage = ReturnType<typeof withFragmentUsageCollection>[\"usages\"];\n const fragmentUsages: FragmentUsage = collected.usages;\n\n // Build document\n const document = buildDocument<\n TSchema,\n TSchema[\"operations\"][TOperationType] & keyof TSchema[\"object\"] & string,\n TFields,\n TVarDefinitions\n >({\n operationName,\n operationType,\n operationTypeName,\n variableDefinitionNodes,\n variables,\n fields,\n schema,\n });\n\n const variableNames = Object.keys(variables) as (keyof TVarDefinitions & string)[];\n\n // 4. Check if any fragment has a metadata builder\n const hasFragmentMetadata = fragmentUsages.some((u) => u.metadataBuilder);\n\n // Fast path: no metadata to evaluate and no transform\n if (!hasFragmentMetadata && !metadataBuilder && !adapterTransformDocument && !operationTransformDocument) {\n return {\n operationType,\n operationName,\n schemaLabel: schema.label,\n variableNames,\n documentSource: () => fields,\n document: document as ReturnType<typeof buildDocument>,\n metadata: undefined,\n };\n }\n\n // 5. Helper to aggregate fragment metadata\n const aggregateFragmentMetadata = (\n resolvedFragmentMetadata: (TFragmentMetadata | undefined)[],\n ): TAggregatedFragmentMetadata => {\n const fragmentMetaInfos: FragmentMetaInfo<TFragmentMetadata>[] = fragmentUsages.map((usage, index) => ({\n metadata: resolvedFragmentMetadata[index],\n fieldPath: usage.path,\n }));\n return adapter.aggregateFragmentMetadata(fragmentMetaInfos) as TAggregatedFragmentMetadata;\n };\n\n // 6. Evaluate fragment metadata first (sync or async)\n const fragmentMetadataResults: (TFragmentMetadata | undefined | Promise<TFragmentMetadata>)[] = fragmentUsages.map((usage) =>\n usage.metadataBuilder ? usage.metadataBuilder() : undefined,\n );\n\n // Check if any fragment metadata is async\n const hasAsyncFragmentMetadata = fragmentMetadataResults.some((r) => isPromiseLike(r));\n\n // 7. Helper to build operation metadata from aggregated fragment metadata\n const buildOperationMetadata = (\n aggregatedFragmentMetadata: TAggregatedFragmentMetadata,\n ): TOperationMetadata | undefined | Promise<TOperationMetadata | undefined> => {\n const schemaLevel = adapter.schemaLevel as TSchemaLevel | undefined;\n return metadataBuilder?.({ $, $var: varRefTools, document, fragmentMetadata: aggregatedFragmentMetadata, schemaLevel });\n };\n\n // 8. Factory that creates the final artifact\n const makeCreateArtifact = (aggregated: TAggregatedFragmentMetadata) => {\n return ({\n metadata,\n }: {\n metadata: TOperationMetadata | undefined;\n }): OperationArtifactResult<TOperationType, TOperationName, TVarDefinitions, TFields, TOperationMetadata> => {\n // Step 1: Operation transform (typed metadata) - FIRST\n let finalDocument = operationTransformDocument\n ? (operationTransformDocument({\n document,\n metadata,\n }) as typeof document)\n : document;\n\n // Step 2: Adapter transform (schemaLevel + fragmentMetadata) - SECOND\n if (adapterTransformDocument) {\n finalDocument = adapterTransformDocument({\n document: finalDocument,\n operationName,\n operationType,\n variableNames,\n schemaLevel: adapter.schemaLevel as TSchemaLevel | undefined,\n fragmentMetadata: aggregated,\n }) as typeof document;\n }\n\n return {\n operationType,\n operationName,\n schemaLabel: schema.label,\n variableNames,\n documentSource: () => fields,\n document: finalDocument as ReturnType<typeof buildDocument>,\n metadata,\n };\n };\n };\n\n // 9. Handle async fragment metadata\n if (hasAsyncFragmentMetadata) {\n return Promise.all(fragmentMetadataResults).then(async (resolvedFragmentMetadata) => {\n const aggregated = aggregateFragmentMetadata(resolvedFragmentMetadata);\n const operationMetadata = await buildOperationMetadata(aggregated);\n return makeCreateArtifact(aggregated)({ metadata: operationMetadata });\n });\n }\n\n // 10. All fragment metadata is sync\n const syncFragmentMetadata = fragmentMetadataResults as (TFragmentMetadata | undefined)[];\n const aggregated = aggregateFragmentMetadata(syncFragmentMetadata);\n const createArtifact = makeCreateArtifact(aggregated);\n\n const operationMetadataResult = buildOperationMetadata(aggregated);\n\n // Use duck typing for VM sandbox compatibility\n if (isPromiseLike(operationMetadataResult)) {\n return operationMetadataResult.then((metadata) => createArtifact({ metadata }));\n }\n\n return createArtifact({ metadata: operationMetadataResult });\n};\n\n/**\n * Wraps a buildOperationArtifact call into an Operation.create() invocation,\n * handling both sync and async artifact results.\n *\n * @param artifactFactory - Factory that produces the artifact (may return Promise for async metadata)\n *\n * @internal Used by extend.ts and operation-tagged-template.ts\n */\nexport const wrapArtifactAsOperation = <TOperationType extends OperationType>(\n artifactFactory: () =>\n | OperationArtifactResult<TOperationType, string, VariableDefinitions, AnyFieldsExtended, unknown>\n | Promise<OperationArtifactResult<TOperationType, string, VariableDefinitions, AnyFieldsExtended, unknown>>,\n): AnyOperationOf<TOperationType> => {\n // biome-ignore lint/suspicious/noExplicitAny: Type cast required for Operation.create with dynamic artifact\n return Operation.create(artifactFactory as never) as any;\n};\n","/**\n * Extend composer factory for creating Operations from TemplateCompatSpec.\n * @module\n */\n\nimport { Kind, type OperationDefinitionNode, parse as parseGraphql } from \"graphql\";\nimport { buildVarSpecifiers, createSchemaIndexFromSchema } from \"../graphql\";\nimport type { GqlDefine } from \"../types/element\";\nimport type { TemplateCompatSpec } from \"../types/element/compat-spec\";\nimport type { AnyFields } from \"../types/fragment\";\nimport type {\n AnyMetadataAdapter,\n DefaultMetadataAdapter,\n DocumentTransformer,\n ExtractAdapterTypes,\n MetadataBuilder,\n OperationDocumentTransformer,\n} from \"../types/metadata\";\nimport { defaultMetadataAdapter } from \"../types/metadata\";\nimport type { AnyGraphqlSchema, OperationType } from \"../types/schema\";\nimport type { AnyVarRef, VariableDefinitions } from \"../types/type-foundation\";\nimport { buildFieldsFromSelectionSet, filterUnresolvedFragmentSpreads } from \"./fragment-tagged-template\";\nimport { buildOperationArtifact, wrapArtifactAsOperation } from \"./operation-core\";\n\n/**\n * Options for extending a compat spec into a full operation.\n */\nexport type ExtendOptions<\n _TSchema extends AnyGraphqlSchema,\n _TVarDefinitions extends VariableDefinitions,\n TOperationMetadata,\n TAggregatedFragmentMetadata,\n TSchemaLevel,\n> = {\n /** Optional metadata builder */\n metadata?: MetadataBuilder<Readonly<Record<string, AnyVarRef>>, TOperationMetadata, TAggregatedFragmentMetadata, TSchemaLevel>;\n /** Optional document transformer */\n transformDocument?: OperationDocumentTransformer<TOperationMetadata>;\n};\n\n/**\n * Creates a factory for extending compat specs into full operations.\n *\n * The extend function takes a TemplateCompatSpec (created by `query.compat(\"Name\")\\`...\\``)\n * and optional metadata/transformDocument options, then creates a full Operation.\n *\n * @param schema - The GraphQL schema definition\n * @param adapter - Optional metadata adapter for custom metadata handling\n * @param transformDocument - Optional document transformer\n * @returns Extend composer function\n *\n * @internal Used by `createGqlElementComposer`\n */\nexport const createExtendComposer = <\n TSchema extends AnyGraphqlSchema,\n TAdapter extends AnyMetadataAdapter = DefaultMetadataAdapter,\n>(\n schema: NoInfer<TSchema>,\n adapter?: TAdapter,\n transformDocument?: DocumentTransformer<\n ExtractAdapterTypes<TAdapter>[\"schemaLevel\"],\n ExtractAdapterTypes<TAdapter>[\"aggregatedFragmentMetadata\"]\n >,\n) => {\n const resolvedAdapter = adapter ?? (defaultMetadataAdapter as TAdapter);\n\n type TAggregatedFragmentMetadata = ExtractAdapterTypes<TAdapter>[\"aggregatedFragmentMetadata\"];\n type TSchemaLevel = ExtractAdapterTypes<TAdapter>[\"schemaLevel\"];\n\n return <\n _TOperationType extends OperationType,\n _TOperationName extends string,\n TVarDefinitions extends VariableDefinitions,\n _TFields extends AnyFields,\n TOperationMetadata = unknown,\n >(\n compat: GqlDefine<TemplateCompatSpec>,\n options?: ExtendOptions<TSchema, TVarDefinitions, TOperationMetadata, TAggregatedFragmentMetadata, TSchemaLevel>,\n ) => {\n const spec = compat.value;\n\n return buildOperationFromTemplateSpec(\n schema,\n spec,\n resolvedAdapter,\n // biome-ignore lint/suspicious/noExplicitAny: Options type narrowing not possible across union\n options as any,\n transformDocument,\n );\n };\n};\n\n/**\n * Builds an Operation from a TemplateCompatSpec by parsing the raw GraphQL source.\n * Evaluates fields via buildFieldsFromSelectionSet for correct typegen output.\n */\nconst buildOperationFromTemplateSpec = <TSchema extends AnyGraphqlSchema, TAdapter extends AnyMetadataAdapter>(\n schema: TSchema,\n spec: TemplateCompatSpec,\n adapter: TAdapter,\n options:\n | ExtendOptions<\n TSchema,\n VariableDefinitions,\n unknown,\n ExtractAdapterTypes<TAdapter>[\"aggregatedFragmentMetadata\"],\n ExtractAdapterTypes<TAdapter>[\"schemaLevel\"]\n >\n | undefined,\n adapterTransformDocument:\n | DocumentTransformer<\n ExtractAdapterTypes<TAdapter>[\"schemaLevel\"],\n ExtractAdapterTypes<TAdapter>[\"aggregatedFragmentMetadata\"]\n >\n | undefined,\n) => {\n const { operationType, operationName, graphqlSource } = spec;\n\n // 1. Parse the raw GraphQL source\n const document = parseGraphql(graphqlSource);\n\n // 2. Extract operation definition for variable analysis\n const opDef = document.definitions.find((d): d is OperationDefinitionNode => d.kind === Kind.OPERATION_DEFINITION);\n if (!opDef) {\n throw new Error(\"No operation definition found in compat template spec\");\n }\n\n // 3. Build VarSpecifiers from variable definitions\n const schemaIndex = createSchemaIndexFromSchema(spec.schema);\n const varSpecifiers = buildVarSpecifiers(opDef.variableDefinitions ?? [], schemaIndex);\n\n // 4. Determine root type name\n const operationTypeName = schema.operations[operationType] as keyof typeof schema.object & string;\n\n // 5. Filter named fragment spreads that can't be resolved without interpolation context\n const filteredSelectionSet = filterUnresolvedFragmentSpreads(opDef.selectionSet);\n\n // 6. Delegate to buildOperationArtifact with fieldsFactory and pre-parsed variableDefinitionNodes\n return wrapArtifactAsOperation(\n () =>\n buildOperationArtifact({\n schema,\n operationType,\n operationTypeName,\n operationName,\n variables: varSpecifiers as unknown as VariableDefinitions,\n variableDefinitionNodes: opDef.variableDefinitions ?? [],\n fieldsFactory: ({ $ }) => {\n return buildFieldsFromSelectionSet(\n filteredSelectionSet,\n schema,\n operationTypeName,\n $ as Readonly<Record<string, import(\"../types/type-foundation\").AnyVarRef>>,\n );\n },\n adapter,\n metadata: options?.metadata,\n transformDocument: options?.transformDocument,\n adapterTransformDocument,\n }),\n // biome-ignore lint/suspicious/noExplicitAny: Type cast required for Operation.create with template compat spec\n ) as any;\n};\n","/**\n * Operation tagged template function for creating GraphQL operations from template literals.\n * Also supports options object dispatch for callback builder path.\n * @module\n */\n\nimport { Kind, parse as parseGraphql } from \"graphql\";\nimport { buildVarSpecifiers, createSchemaIndexFromSchema } from \"../graphql\";\nimport { Fragment } from \"../types/element\";\nimport type { AnyFragment } from \"../types/element/fragment\";\nimport type { AnyOperationOf } from \"../types/element/operation\";\nimport type { AnyFieldsExtended } from \"../types/fragment\";\nimport type { AnyMetadataAdapter, DocumentTransformer, OperationDocumentTransformer } from \"../types/metadata\";\nimport { defaultMetadataAdapter } from \"../types/metadata\";\nimport type { AnyGraphqlSchema, OperationType } from \"../types/schema\";\nimport type { AnyVarRef, VariableDefinitions } from \"../types/type-foundation\";\nimport type { FieldsBuilder } from \"./fields-builder\";\nimport { buildFieldsFromSelectionSet, filterUnresolvedFragmentSpreads } from \"./fragment-tagged-template\";\nimport { mergeVariableDefinitions } from \"./merge-variable-definitions\";\nimport { buildOperationArtifact, wrapArtifactAsOperation } from \"./operation-core\";\n\n/** Options for fragment TemplateResult resolution. */\nexport type FragmentTemplateMetadataOptions = {\n metadata?:\n | unknown\n | ((context: {\n $: Readonly<Record<string, unknown>>;\n $var: import(\"../types/metadata/metadata\").VarRefTools;\n }) => unknown | Promise<unknown>);\n};\n\n/** Context provided to operation metadata callbacks. */\nexport type OperationMetadataContext = {\n // biome-ignore lint/suspicious/noExplicitAny: Metadata context types are adapter-dependent; any allows test flexibility\n readonly $: Readonly<Record<string, any>>;\n readonly $var: import(\"../types/metadata/metadata\").VarRefTools;\n readonly document: import(\"graphql\").DocumentNode;\n // biome-ignore lint/suspicious/noExplicitAny: Aggregated fragment metadata shape depends on adapter\n readonly fragmentMetadata: any;\n // biome-ignore lint/suspicious/noExplicitAny: Schema-level metadata shape depends on adapter\n readonly schemaLevel: any;\n};\n\n/** Options for operation TemplateResult resolution — receives full metadata pipeline context. */\nexport type OperationTemplateMetadataOptions = {\n metadata?: unknown;\n /** Optional per-operation document transformer */\n transformDocument?: OperationDocumentTransformer<unknown>;\n};\n\n/** @deprecated Use `FragmentTemplateMetadataOptions` or `OperationTemplateMetadataOptions` instead. */\nexport type TemplateResultMetadataOptions = FragmentTemplateMetadataOptions;\n\n/** Callable result from tagged template - resolves to Operation or Fragment. */\nexport type TemplateResult<\n TElement extends AnyOperationOf<OperationType> | AnyFragment,\n TOptions = TElement extends AnyOperationOf<OperationType> ? OperationTemplateMetadataOptions : FragmentTemplateMetadataOptions,\n> = (options?: TOptions) => TElement;\n\n/** Tagged template function type for operations. */\nexport type OperationTaggedTemplateFunction<TOperationType extends OperationType = OperationType> = (\n strings: TemplateStringsArray,\n ...values: (AnyFragment | ((ctx: { $: Readonly<Record<string, AnyVarRef>> }) => AnyFieldsExtended))[]\n) => TemplateResult<AnyOperationOf<TOperationType>>;\n\n/** Options object for callback builder path */\nexport type OperationOptionsObject = {\n variables?: string;\n fields: FieldsBuilder;\n};\n\n/** Dispatch: tagged template OR options object */\nexport type OperationBuilderDispatch<TOperationType extends OperationType = OperationType> =\n OperationTaggedTemplateFunction<TOperationType> &\n ((options: OperationOptionsObject) => TemplateResult<AnyOperationOf<TOperationType>>);\n\n/** Curried operation function type: query(\"name\")`($var: Type!) { fields }` or query(\"name\")({ variables, fields }) */\nexport type CurriedOperationFunction<TOperationType extends OperationType = OperationType> = (\n operationName: string,\n) => OperationBuilderDispatch<TOperationType>;\n\n/**\n * Construct a synthetic GraphQL operation source from JS arguments and template body.\n * Handles optional variable declarations: `($var: Type!) { fields }` or `{ fields }`.\n */\nfunction buildSyntheticOperationSource(operationType: OperationType, operationName: string, body: string): string {\n const trimmed = body.trim();\n // Body starts with \"(\" -> variable declarations present, directly prepend operation header\n // Body starts with \"{\" -> just selection set, prepend header with space\n // Either way: `<operationType> <name><body>` produces valid GraphQL\n return `${operationType} ${operationName} ${trimmed}`;\n}\n\n/**\n * Resolves a metadata option from OperationTemplateMetadataOptions into a MetadataBuilder\n * compatible with buildOperationArtifact.\n *\n * - `undefined` -> `undefined` (no metadata)\n * - Raw value -> `() => value` (static metadata)\n * - Callback -> forwarded directly (receives full pipeline context)\n */\n// biome-ignore lint/suspicious/noExplicitAny: Private helper bridging untyped template options to typed MetadataBuilder\nconst resolveMetadataOption = (metadataOption: OperationTemplateMetadataOptions[\"metadata\"]): any => {\n if (metadataOption === undefined) return undefined;\n if (typeof metadataOption === \"function\") return metadataOption;\n return () => metadataOption;\n};\n\n/**\n * Creates a curried function for a specific operation type.\n * Supports both tagged template and options object dispatch.\n *\n * Tagged template: `query(\"name\")\\`($var: Type!) { fields }\\`` returns TemplateResult<Operation>.\n * Options object: `query(\"name\")({ variables, fields })` returns TemplateResult<Operation>.\n *\n * @param schema - The GraphQL schema definition\n * @param operationType - The operation type (query, mutation, subscription)\n * @param metadataAdapter - Optional metadata adapter for metadata aggregation\n * @param adapterTransformDocument - Optional document transformer from adapter\n */\nexport const createOperationTaggedTemplate = <TSchema extends AnyGraphqlSchema, TOperationType extends OperationType>(\n schema: TSchema,\n operationType: TOperationType,\n metadataAdapter?: AnyMetadataAdapter,\n // biome-ignore lint/suspicious/noExplicitAny: DocumentTransformer generic params not needed here\n adapterTransformDocument?: DocumentTransformer<any, any>,\n): CurriedOperationFunction<TOperationType> => {\n const schemaIndex = createSchemaIndexFromSchema(schema);\n\n return (operationName: string): OperationBuilderDispatch<TOperationType> => {\n // Dispatcher function that checks the first argument to determine path\n const dispatch = (\n firstArg: TemplateStringsArray | OperationOptionsObject,\n ...rest: (AnyFragment | ((ctx: { $: Readonly<Record<string, AnyVarRef>> }) => AnyFieldsExtended))[]\n ): TemplateResult<AnyOperationOf<TOperationType>> => {\n // Check if it's a tagged template (TemplateStringsArray has .raw)\n if (\"raw\" in firstArg) {\n return handleTaggedTemplate(\n schema,\n schemaIndex,\n operationType,\n operationName,\n metadataAdapter,\n adapterTransformDocument,\n firstArg as TemplateStringsArray,\n rest,\n );\n }\n\n // Options object path\n return handleOptionsObject(\n schema,\n schemaIndex,\n operationType,\n operationName,\n metadataAdapter,\n adapterTransformDocument,\n firstArg as OperationOptionsObject,\n );\n };\n\n return dispatch as OperationBuilderDispatch<TOperationType>;\n };\n};\n\n/**\n * Handles the tagged template path.\n */\nfunction handleTaggedTemplate<TSchema extends AnyGraphqlSchema, TOperationType extends OperationType>(\n schema: TSchema,\n schemaIndex: import(\"../graphql/schema-index\").SchemaIndex,\n operationType: TOperationType,\n operationName: string,\n metadataAdapter: AnyMetadataAdapter | undefined,\n // biome-ignore lint/suspicious/noExplicitAny: DocumentTransformer generic params not needed here\n adapterTransformDocument: DocumentTransformer<any, any> | undefined,\n strings: TemplateStringsArray,\n values: (AnyFragment | ((ctx: { $: Readonly<Record<string, AnyVarRef>> }) => AnyFieldsExtended))[],\n): TemplateResult<AnyOperationOf<TOperationType>> {\n // Validate interpolated values are fragments or callbacks\n for (let i = 0; i < values.length; i++) {\n const value = values[i];\n if (!(value instanceof Fragment) && typeof value !== \"function\") {\n throw new Error(\n `Tagged templates only accept Fragment instances or callback functions as interpolated values. ` +\n `Received ${typeof value} at position ${i}.`,\n );\n }\n }\n\n // Build template body with placeholders for interpolations\n let body = strings[0] ?? \"\";\n const interpolationMap = new Map<\n string,\n AnyFragment | ((ctx: { $: Readonly<Record<string, AnyVarRef>> }) => AnyFieldsExtended)\n >();\n\n for (let i = 0; i < values.length; i++) {\n const placeholderName = `__INTERPOLATION_${i}__`;\n interpolationMap.set(\n placeholderName,\n values[i] as AnyFragment | ((ctx: { $: Readonly<Record<string, AnyVarRef>> }) => AnyFieldsExtended),\n );\n body += placeholderName + (strings[i + 1] ?? \"\");\n }\n\n // Construct synthetic GraphQL source from JS args and template body\n const source = buildSyntheticOperationSource(operationType, operationName, body);\n\n // Parse the GraphQL source with placeholders\n let document: import(\"graphql\").DocumentNode;\n try {\n document = parseGraphql(source);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`GraphQL parse error in tagged template: ${message}`);\n }\n\n const opDefs = document.definitions.filter((def) => def.kind === Kind.OPERATION_DEFINITION);\n if (opDefs.length !== 1) {\n throw new Error(`Internal error: expected exactly one operation definition in synthesized source`);\n }\n\n // biome-ignore lint/style/noNonNullAssertion: Length checked above\n const opNode = opDefs[0]!;\n if (opNode.kind !== Kind.OPERATION_DEFINITION) {\n throw new Error(\"Unexpected definition kind\");\n }\n\n const varDefNodes = opNode.variableDefinitions ?? [];\n let varSpecifiers = buildVarSpecifiers(varDefNodes, schemaIndex) as VariableDefinitions;\n\n // Merge variable definitions from interpolated fragments\n varSpecifiers = mergeVariableDefinitions(varSpecifiers, interpolationMap);\n\n // Check if any interpolated fragments contributed new variables.\n // If so, varDefNodes (from the parsed template) is incomplete — omit it so that\n // buildDocument derives VariableDefinitionNodes from the merged varSpecifiers instead.\n const hasInterpolatedFragmentVars = [...interpolationMap.values()].some(\n (v) => v instanceof Fragment && Object.keys(v.variableDefinitions).length > 0,\n );\n\n // Determine root type name based on operation type\n const operationTypeName = schema.operations[operationType];\n if (operationTypeName === null) {\n throw new Error(`Operation type ${operationType} is not defined in schema roots`);\n }\n\n const resolvedAdapter = metadataAdapter ?? defaultMetadataAdapter;\n\n return (options?: OperationTemplateMetadataOptions): AnyOperationOf<TOperationType> => {\n const resolvedMetadata = resolveMetadataOption(options?.metadata);\n\n return wrapArtifactAsOperation(() =>\n buildOperationArtifact({\n schema,\n operationType,\n operationTypeName,\n operationName,\n variables: varSpecifiers,\n variableDefinitionNodes: hasInterpolatedFragmentVars ? undefined : varDefNodes,\n fieldsFactory: ({ $ }) => {\n return buildFieldsFromSelectionSet(\n filterUnresolvedFragmentSpreads(opNode.selectionSet, interpolationMap),\n schema,\n operationTypeName,\n $ as Readonly<Record<string, AnyVarRef>>,\n interpolationMap,\n );\n },\n adapter: resolvedAdapter,\n metadata: resolvedMetadata,\n transformDocument: options?.transformDocument,\n adapterTransformDocument,\n }),\n );\n };\n}\n\n/**\n * Handles the options object path.\n */\nfunction handleOptionsObject<TSchema extends AnyGraphqlSchema, TOperationType extends OperationType>(\n schema: TSchema,\n schemaIndex: import(\"../graphql/schema-index\").SchemaIndex,\n operationType: TOperationType,\n operationName: string,\n metadataAdapter: AnyMetadataAdapter | undefined,\n // biome-ignore lint/suspicious/noExplicitAny: DocumentTransformer generic params not needed here\n adapterTransformDocument: DocumentTransformer<any, any> | undefined,\n options: OperationOptionsObject,\n): TemplateResult<AnyOperationOf<TOperationType>> {\n // Parse variables from string if provided\n let varSpecifiers: VariableDefinitions = {};\n let varDefNodes: readonly import(\"graphql\").VariableDefinitionNode[] = [];\n\n if (options.variables) {\n // options.variables is a string like \"($id: ID!)\" or \"($id: ID!, $limit: Int)\"\n // Parse it as GraphQL: wrap in a dummy operation to get variable definition nodes\n const varSource = `query __var_parse__ ${String(options.variables).trim()} { __typename }`;\n const parsed = parseGraphql(varSource);\n const opDef = parsed.definitions[0];\n if (opDef?.kind === Kind.OPERATION_DEFINITION) {\n varDefNodes = opDef.variableDefinitions ?? [];\n varSpecifiers = buildVarSpecifiers(varDefNodes, schemaIndex) as VariableDefinitions;\n }\n }\n\n const operationTypeName = schema.operations[operationType];\n if (operationTypeName === null) {\n throw new Error(`Operation type ${operationType} is not defined in schema roots`);\n }\n\n const resolvedAdapter = metadataAdapter ?? defaultMetadataAdapter;\n\n // Return TemplateResult (step 2 callable)\n return (step2Options?: OperationTemplateMetadataOptions): AnyOperationOf<TOperationType> => {\n const resolvedMetadata = resolveMetadataOption(step2Options?.metadata);\n\n return wrapArtifactAsOperation(() =>\n buildOperationArtifact({\n schema,\n operationType,\n operationTypeName,\n operationName,\n variables: varSpecifiers,\n variableDefinitionNodes: varDefNodes,\n fieldsFactory: options.fields,\n adapter: resolvedAdapter,\n metadata: resolvedMetadata,\n transformDocument: step2Options?.transformDocument,\n adapterTransformDocument,\n }),\n );\n };\n}\n","/**\n * Main entry point for composing GraphQL elements.\n * @module\n */\n\nimport type { AnyFragment, AnyGqlDefine, AnyOperation } from \"../types/element\";\nimport { GqlDefine } from \"../types/element\";\nimport type { Adapter, AnyAdapter, AnyMetadataAdapter, DefaultAdapter, DefaultMetadataAdapter } from \"../types/metadata\";\nimport type { AnyGraphqlSchema } from \"../types/schema\";\nimport { createColocateHelper } from \"./colocate\";\nimport { createCompatTaggedTemplate } from \"./compat-tagged-template\";\nimport { applyContextTransformer } from \"./context-transformer\";\nimport { createStandardDirectives, type StandardDirectives } from \"./directive-builder\";\nimport { createExtendComposer } from \"./extend\";\nimport { createFragmentTaggedTemplate } from \"./fragment-tagged-template\";\nimport { createOperationTaggedTemplate } from \"./operation-tagged-template\";\n\n/**\n * Function signature for composing GraphQL elements (fragments or operations).\n *\n * The composer provides a context with builders for fragments, operations,\n * variables, and colocation helpers.\n */\nexport type GqlElementComposer<TContext> = <TResult extends AnyFragment | AnyOperation | AnyGqlDefine>(\n composeElement: (context: TContext) => TResult,\n) => TResult;\n\n/**\n * GQL element composer with schema access.\n *\n * Extends the base composer function with a `$schema` property that provides\n * runtime access to the schema definition. This is useful for:\n * - Type generation tools (typegen)\n * - Runtime schema introspection\n * - Debugging and tooling\n */\nexport type GqlElementComposerWithSchema<TContext, TSchema extends AnyGraphqlSchema> = GqlElementComposer<TContext> & {\n /**\n * The GraphQL schema definition used by this composer.\n * Provides runtime access to schema types, operations, and metadata.\n */\n readonly $schema: TSchema;\n};\n\n/**\n * Extracts the helpers type from an adapter.\n * Uses `any` for non-target type parameters to avoid contravariance issues\n * with the `aggregateFragmentMetadata` function parameter type.\n */\n// biome-ignore lint/suspicious/noExplicitAny: Required to avoid contravariance issues in conditional type matching\ntype ExtractHelpers<TAdapter extends AnyAdapter> = TAdapter extends Adapter<infer THelpers, any, any, any> ? THelpers : object;\n\n/**\n * Extracts the metadata adapter type from an adapter.\n * Handles optional metadata property correctly.\n */\nexport type ExtractMetadataAdapter<TAdapter extends AnyAdapter> = TAdapter extends { metadata?: infer M }\n ? NonNullable<M> extends AnyMetadataAdapter\n ? NonNullable<M>\n : DefaultMetadataAdapter\n : DefaultMetadataAdapter;\n\n/**\n * Configuration options for `createGqlElementComposer`.\n */\nexport type GqlElementComposerOptions<\n _TSchema extends AnyGraphqlSchema,\n TDirectiveMethods extends StandardDirectives,\n TAdapter extends AnyAdapter = DefaultAdapter,\n> = {\n /** Optional adapter for custom helpers and metadata handling. */\n adapter?: TAdapter;\n /** Optional custom directive methods (including schema-defined directives). */\n directiveMethods?: TDirectiveMethods;\n};\n\n/**\n * Creates a GQL element composer for a given schema.\n *\n * This is the main entry point for defining GraphQL operations and fragments.\n * The returned function provides a context with:\n * - `fragment`: Tagged template function for fragment definitions\n * - `query/mutation/subscription`: Operation builders (tagged template + options object + .compat)\n * - `$dir`: Field directive helpers (@skip, @include)\n * - `$colocate`: Fragment colocation utilities\n *\n * @param schema - The GraphQL schema definition\n * @param options - Configuration including optional adapter\n * @returns Element composer function\n *\n * @example\n * ```typescript\n * const gql = createGqlElementComposer(schema, {});\n *\n * const GetUser = gql(({ query, $dir }) =>\n * query(\"GetUser\")`($id: ID!) {\n * user(id: $id) { name email }\n * }`()\n * );\n * ```\n */\nexport const createGqlElementComposer = <\n TSchema extends AnyGraphqlSchema,\n TDirectiveMethods extends StandardDirectives,\n TAdapter extends AnyAdapter = DefaultAdapter,\n>(\n schema: NoInfer<TSchema>,\n options: GqlElementComposerOptions<NoInfer<TSchema>, NoInfer<TDirectiveMethods>, NoInfer<TAdapter>>,\n) => {\n type THelpers = ExtractHelpers<TAdapter>;\n type TMetadataAdapter = ExtractMetadataAdapter<TAdapter>;\n const { adapter, directiveMethods } = options;\n const helpers = adapter?.helpers as THelpers | undefined;\n const metadataAdapter = adapter?.metadata as TMetadataAdapter | undefined;\n const transformDocument = adapter?.transformDocument;\n // Fragment: curried tagged template function — fragment(\"name\", \"type\")`{ fields }`\n const fragment = createFragmentTaggedTemplate(schema);\n\n // Hybrid context: curried tagged template / options object functions with .compat property\n const context = {\n fragment,\n query: Object.assign(createOperationTaggedTemplate(schema, \"query\", metadataAdapter, transformDocument), {\n compat: createCompatTaggedTemplate(schema, \"query\"),\n }),\n mutation: Object.assign(createOperationTaggedTemplate(schema, \"mutation\", metadataAdapter, transformDocument), {\n compat: createCompatTaggedTemplate(schema, \"mutation\"),\n }),\n subscription: Object.assign(createOperationTaggedTemplate(schema, \"subscription\", metadataAdapter, transformDocument), {\n compat: createCompatTaggedTemplate(schema, \"subscription\"),\n }),\n define: <TValue>(factory: () => TValue | Promise<TValue>) => GqlDefine.create(factory),\n extend: createExtendComposer<TSchema, TMetadataAdapter>(schema, metadataAdapter, transformDocument),\n $dir: directiveMethods ?? (createStandardDirectives() as TDirectiveMethods),\n $colocate: createColocateHelper(),\n ...(helpers ?? ({} as THelpers)),\n };\n\n // Apply context transformer if set (for programmatic API like @soda-gql/sdk)\n const transformedContext = applyContextTransformer(context);\n\n const elementComposer: GqlElementComposer<typeof context> = (composeElement) => composeElement(transformedContext);\n\n // Attach schema as readonly property for runtime access\n const composerWithSchema = elementComposer as GqlElementComposerWithSchema<typeof context, TSchema>;\n Object.defineProperty(composerWithSchema, \"$schema\", {\n value: schema,\n writable: false,\n enumerable: true,\n configurable: false,\n });\n\n return composerWithSchema;\n};\n\n/**\n * Abstract Context type for prebuilt composers.\n *\n * Provides minimal structure while allowing PrebuiltTypeRegistry to resolve\n * actual types. Used by prebuilt module to avoid heavy schema type inference.\n *\n * Type safety in prebuilt comes from `ResolvePrebuiltElement`, not from\n * the Context type.\n */\nexport type AnyGqlContext = {\n readonly fragment: (...args: unknown[]) => unknown;\n readonly query: ((...args: unknown[]) => unknown) & {\n compat: (...args: unknown[]) => AnyGqlDefine;\n };\n readonly mutation: ((...args: unknown[]) => unknown) & {\n compat: (...args: unknown[]) => AnyGqlDefine;\n };\n readonly subscription: ((...args: unknown[]) => unknown) & {\n compat: (...args: unknown[]) => AnyGqlDefine;\n };\n readonly define: <TValue>(factory: () => TValue | Promise<TValue>) => GqlDefine<TValue>;\n readonly extend: (...args: unknown[]) => AnyOperation;\n readonly $dir: StandardDirectives;\n readonly $colocate: unknown;\n readonly [key: string]: unknown;\n};\n","/**\n * Type calculator for generating TypeScript type strings from field selections.\n *\n * This is a runtime reimplementation of the InferFields type-level computation,\n * used for generating prebuilt types that can be bundled without losing type information.\n *\n * @module\n */\n\nimport { Kind, type TypeNode, type VariableDefinitionNode } from \"graphql\";\nimport type { AnyFieldSelection, AnyFieldsExtended, AnyFieldValue, AnyUnionSelection } from \"../types/fragment\";\nimport type { AnyGraphqlSchema } from \"../types/schema\";\nimport type {\n DeferredOutputField,\n InputDepthOverrides,\n InputTypeSpecifiers,\n TypeModifier,\n VariableDefinitions,\n} from \"../types/type-foundation\";\nimport { parseInputSpecifier, parseOutputField } from \"../utils/deferred-specifier-parser\";\n\n/**\n * Formatters for customizing type name output.\n *\n * Used by type generation functions to format scalar and input object type names\n * with custom prefixes or patterns (e.g., schema-specific prefixes).\n */\nexport type TypeFormatters = {\n /**\n * Format a scalar input type name.\n * Default: `ScalarInput<\"Name\">`\n */\n readonly scalarInput?: (name: string) => string;\n /**\n * Format a scalar output type name.\n * Default: `ScalarOutput<\"Name\">`\n */\n readonly scalarOutput?: (name: string) => string;\n /**\n * Format an input object type name.\n * Default: returns the name unchanged\n */\n readonly inputObject?: (name: string) => string;\n};\n\n/**\n * Apply a type modifier to a base type string.\n *\n * Modifier format:\n * - \"!\" = required (T)\n * - \"?\" = optional (T | null | undefined)\n * - \"![]!\" = required array of required items (T[])\n * - \"![]?\" = optional array of required items (T[] | null | undefined)\n * - \"?[]!\" = required array of optional items ((T | null | undefined)[])\n * - \"?[]?\" = optional array of optional items ((T | null | undefined)[] | null | undefined)\n * - Deeper nesting follows the same pattern\n */\nexport const applyTypeModifier = (baseType: string, modifier: TypeModifier): string => {\n // Parse modifier from inside out\n // Modifier format: innerNullability[]outerNullability[]...\n // e.g., \"?[]!\" means: inner is nullable, wrapped in non-null array\n\n if (modifier === \"!\") {\n return baseType;\n }\n if (modifier === \"?\") {\n return `(${baseType} | null | undefined)`;\n }\n\n // For array types, parse the modifier pattern\n // Pattern: (innerNullability)([]outerNullability)*\n const parts = modifier.split(\"[]\");\n if (parts.length < 2) {\n // Fallback for unexpected modifier format\n return baseType;\n }\n\n // Build type from inside out\n let result = baseType;\n\n // First part is the innermost nullability\n const innerNullability = parts[0];\n if (innerNullability === \"?\") {\n result = `(${result} | null | undefined)`;\n }\n\n // Remaining parts are array wrappings with their nullability\n for (let i = 1; i < parts.length; i++) {\n const arrayNullability = parts[i];\n result = `(${result})[]`;\n if (arrayNullability === \"?\") {\n result = `(${result} | null | undefined)`;\n }\n }\n\n return result;\n};\n\n/**\n * Get the TypeScript type string for a scalar output type from the schema.\n *\n * Returns a `ScalarOutput<\"Name\">` reference for all scalars in the schema.\n * The actual type is resolved at compile time from the inject file's scalar definitions.\n * This allows users to customize even built-in scalars (ID, String, etc.).\n */\nexport const getScalarOutputType = (schema: AnyGraphqlSchema, scalarName: string): string => {\n // ALL scalars use ScalarOutput reference - inject file is the source of truth\n if (schema.scalar[scalarName]) {\n return `ScalarOutput<\"${scalarName}\">`;\n }\n // Unknown scalar not in schema\n return \"unknown\";\n};\n\n/**\n * Get the TypeScript type string for a scalar input type from the schema.\n *\n * Returns a `ScalarInput<\"Name\">` reference for all scalars in the schema.\n * Used for input/variable types in operations.\n */\nexport const getScalarInputType = (schema: AnyGraphqlSchema, scalarName: string): string => {\n if (schema.scalar[scalarName]) {\n return `ScalarInput<\"${scalarName}\">`;\n }\n return \"unknown\";\n};\n\n/**\n * Get the TypeScript type string for an enum type from the schema.\n */\nexport const getEnumType = (schema: AnyGraphqlSchema, enumName: string): string => {\n const enumDef = schema.enum[enumName];\n if (!enumDef) {\n return \"string\";\n }\n\n // Get enum values and create a union type\n const values = Object.keys(enumDef.values);\n if (values.length === 0) {\n return \"never\";\n }\n\n return values.map((v) => `\"${v}\"`).join(\" | \");\n};\n\n/**\n * Default depth limit for input object type generation.\n */\nconst DEFAULT_INPUT_DEPTH = 3;\n\n/**\n * Options for generating input object types.\n */\nexport type GenerateInputObjectTypeOptions = {\n /**\n * Default depth limit for recursive types.\n * @default 3\n */\n readonly defaultDepth?: number;\n /**\n * Per-type depth overrides.\n */\n readonly depthOverrides?: InputDepthOverrides;\n /**\n * Custom formatters for type names.\n */\n readonly formatters?: TypeFormatters;\n};\n\n/**\n * Generate a TypeScript type string for an input object type.\n *\n * Recursively expands fields using ScalarInput for scalars.\n * Returns `unknown` if depth is exhausted or circular reference is detected.\n *\n * @param schema - The GraphQL schema\n * @param inputName - The input object type name\n * @param options - Generation options including depth limits\n * @param seen - Set of already visited input names (for circular reference detection)\n * @param currentDepth - Current recursion depth\n */\nexport const generateInputObjectType = (\n schema: AnyGraphqlSchema,\n inputName: string,\n options: GenerateInputObjectTypeOptions = {},\n seen: Set<string> = new Set(),\n currentDepth?: number,\n): string => {\n const inputDef = schema.input[inputName];\n if (!inputDef) {\n return \"unknown\";\n }\n\n // Get depth limit for this type\n const depthOverrides = options.depthOverrides ?? {};\n const defaultDepth = options.defaultDepth ?? DEFAULT_INPUT_DEPTH;\n const maxDepth = depthOverrides[inputName] ?? defaultDepth;\n\n // Initialize or use current depth\n const depth = currentDepth ?? maxDepth;\n\n // Check depth exhaustion\n if (depth <= 0) {\n return \"unknown\";\n }\n\n // Check circular reference\n if (seen.has(inputName)) {\n return \"unknown\";\n }\n\n // Add to seen set for this branch\n const newSeen = new Set(seen);\n newSeen.add(inputName);\n\n const fields = inputDef.fields;\n const fieldEntries = Object.entries(fields);\n\n if (fieldEntries.length === 0) {\n return \"{}\";\n }\n\n const fieldTypes = fieldEntries.map(([fieldName, specifierStr]) => {\n const specifier = parseInputSpecifier(specifierStr as string);\n const fieldType = generateInputFieldType(schema, specifier, options, newSeen, depth - 1);\n const isOptional = specifier.modifier === \"?\" || specifier.modifier.endsWith(\"?\");\n const hasDefault = specifier.hasDefault;\n\n // Fields with defaults or nullable fields are optional\n if (hasDefault || isOptional) {\n return `readonly ${fieldName}?: ${fieldType}`;\n }\n return `readonly ${fieldName}: ${fieldType}`;\n });\n\n return `{ ${fieldTypes.join(\"; \")} }`;\n};\n\n/**\n * Generate a TypeScript type string for an input field based on its parsed specifier.\n */\nconst generateInputFieldType = (\n schema: AnyGraphqlSchema,\n specifier: { readonly kind: string; readonly name: string; readonly modifier: string },\n options: GenerateInputObjectTypeOptions,\n seen: Set<string>,\n depth: number,\n): string => {\n let baseType: string;\n const { formatters } = options;\n\n switch (specifier.kind) {\n case \"scalar\":\n baseType = formatters?.scalarInput?.(specifier.name) ?? getScalarInputType(schema, specifier.name);\n break;\n case \"enum\":\n baseType = getEnumType(schema, specifier.name);\n break;\n case \"input\":\n baseType =\n formatters?.inputObject?.(specifier.name) ?? generateInputObjectType(schema, specifier.name, options, seen, depth);\n break;\n default:\n baseType = \"unknown\";\n }\n\n return applyTypeModifier(baseType, specifier.modifier as TypeModifier);\n};\n\n/**\n * Calculate the TypeScript type string for a single field selection.\n *\n * @param schema - The GraphQL schema\n * @param selection - The field selection to calculate type for\n * @param formatters - Optional formatters for customizing type names\n */\nexport const calculateFieldType = (\n schema: AnyGraphqlSchema,\n selection: AnyFieldSelection,\n formatters?: TypeFormatters,\n): string => {\n // Parse the deferred output specifier (handles both string and object formats)\n const parsedType = parseOutputField(selection.type as DeferredOutputField);\n\n // Handle __typename field specially - return literal type name\n if (selection.field === \"__typename\") {\n // For __typename, the name in the specifier is the parent type name\n return applyTypeModifier(`\"${parsedType.name}\"`, parsedType.modifier as TypeModifier);\n }\n\n // Handle object types (nested selection)\n if (parsedType.kind === \"object\" && selection.object) {\n const nestedType = calculateFieldsType(schema, selection.object, formatters, parsedType.name);\n return applyTypeModifier(nestedType, parsedType.modifier as TypeModifier);\n }\n\n // Handle union types\n if (parsedType.kind === \"union\" && selection.union) {\n const unionType = calculateUnionType(schema, selection.union, formatters, parsedType.name);\n return applyTypeModifier(unionType, parsedType.modifier as TypeModifier);\n }\n\n // Handle scalar types (including __typename which is represented as scalar)\n if (parsedType.kind === \"scalar\") {\n const scalarType = formatters?.scalarOutput?.(parsedType.name) ?? getScalarOutputType(schema, parsedType.name);\n return applyTypeModifier(scalarType, parsedType.modifier as TypeModifier);\n }\n\n // Handle enum types\n if (parsedType.kind === \"enum\") {\n const enumType = getEnumType(schema, parsedType.name);\n return applyTypeModifier(enumType, parsedType.modifier as TypeModifier);\n }\n\n // Fallback\n return \"unknown\";\n};\n\n/**\n * Calculate the TypeScript type string for a union type selection.\n *\n * When `__typename: true` is set, generates types for ALL union members with __typename,\n * even those not explicitly selected (they get only __typename).\n */\nconst calculateUnionType = (\n schema: AnyGraphqlSchema,\n union: AnyUnionSelection,\n formatters?: TypeFormatters,\n unionTypeName?: string,\n): string => {\n const { selections, __typename: hasTypenameFlag } = union;\n const memberTypes: string[] = [];\n\n if (hasTypenameFlag && unionTypeName) {\n // Get all union member names from schema\n const unionDef = schema.union[unionTypeName];\n if (unionDef) {\n const allMemberNames = Object.keys(unionDef.types);\n\n for (const typeName of allMemberNames) {\n const member = selections[typeName];\n if (member && typeof member === \"object\") {\n // Selected member: include fields + __typename\n const fieldsType = calculateFieldsType(schema, member.fields, formatters, typeName);\n memberTypes.push(`${fieldsType} & { readonly __typename: \"${typeName}\" }`);\n } else {\n // Unselected member: only __typename\n memberTypes.push(`{ readonly __typename: \"${typeName}\" }`);\n }\n }\n }\n } else {\n // Original behavior without __typename flag\n for (const [typeName, member] of Object.entries(selections)) {\n if (member && typeof member === \"object\") {\n const memberType = calculateFieldsType(schema, member.fields, formatters, typeName);\n memberTypes.push(memberType);\n }\n }\n }\n\n if (memberTypes.length === 0) {\n return \"never\";\n }\n\n return memberTypes.join(\" | \");\n};\n\n/**\n * Check if a field value is shorthand (true) vs factory return (AnyFieldSelection).\n */\nconst isShorthandValue = (value: AnyFieldValue): value is true => value === true;\n\n/**\n * Expand shorthand to AnyFieldSelection using schema type info.\n * Used at prebuilt type generation time to convert `true` to full field selection.\n *\n * @param schema - The GraphQL schema\n * @param typeName - The parent object type name\n * @param fieldName - The field name to select\n */\nconst expandShorthandForType = (schema: AnyGraphqlSchema, typeName: string, fieldName: string): AnyFieldSelection => {\n const typeDef = schema.object[typeName];\n if (!typeDef) {\n throw new Error(`Type \"${typeName}\" not found in schema`);\n }\n\n const fieldSpec = typeDef.fields[fieldName];\n if (!fieldSpec) {\n throw new Error(`Field \"${fieldName}\" not found on type \"${typeName}\"`);\n }\n\n return {\n parent: typeName,\n field: fieldName,\n type: fieldSpec,\n args: {},\n directives: [],\n object: null,\n union: null,\n };\n};\n\n/**\n * Calculate the TypeScript type string for a set of field selections.\n * This is the main entry point for type calculation.\n *\n * @param schema - The GraphQL schema\n * @param fields - The field selections to calculate types for\n * @param formatters - Optional formatters for customizing type names\n * @param typeName - Parent type name for shorthand expansion\n */\nexport const calculateFieldsType = (\n schema: AnyGraphqlSchema,\n fields: AnyFieldsExtended,\n formatters?: TypeFormatters,\n typeName?: string,\n): string => {\n const entries = Object.entries(fields);\n\n if (entries.length === 0) {\n return \"{}\";\n }\n\n const fieldTypes = entries.map(([alias, value]) => {\n let selection: AnyFieldSelection;\n if (isShorthandValue(value)) {\n if (!typeName) {\n throw new Error(\n `Shorthand syntax (${alias}: true) requires type context. ` +\n `This is an internal error - type name should be provided.`,\n );\n }\n selection = expandShorthandForType(schema, typeName, alias);\n } else {\n selection = value;\n }\n const fieldType = calculateFieldType(schema, selection, formatters);\n // Use readonly for all fields to match InferFields behavior\n return `readonly ${alias}: ${fieldType}`;\n });\n\n return `{ ${fieldTypes.join(\"; \")} }`;\n};\n\n/**\n * Convert a GraphQL TypeNode to a TypeScript type string for input types.\n *\n * Handles NonNullType, ListType, and NamedType recursively.\n * Uses ScalarInput for scalar types since this is used for input/variable types.\n *\n * @param schema - The GraphQL schema\n * @param typeNode - The GraphQL type node to convert\n * @param formatters - Optional formatters for customizing type names\n */\nexport const graphqlTypeToTypeScript = (schema: AnyGraphqlSchema, typeNode: TypeNode, formatters?: TypeFormatters): string => {\n switch (typeNode.kind) {\n case Kind.NON_NULL_TYPE:\n return graphqlTypeToTypeScript(schema, typeNode.type, formatters);\n case Kind.LIST_TYPE: {\n const inner = graphqlTypeToTypeScript(schema, typeNode.type, formatters);\n return `(${inner})[]`;\n }\n case Kind.NAMED_TYPE: {\n const name = typeNode.name.value;\n // Check if scalar - use ScalarInput for input types\n if (schema.scalar[name]) {\n return formatters?.scalarInput?.(name) ?? getScalarInputType(schema, name);\n }\n // Check if enum\n if (schema.enum[name]) {\n return getEnumType(schema, name);\n }\n // Input object - use formatter or return name directly\n return formatters?.inputObject?.(name) ?? name;\n }\n }\n};\n\n/**\n * Generate a TypeScript type string for operation input variables.\n *\n * Extracts variable types from GraphQL VariableDefinitionNode AST.\n *\n * @param schema - The GraphQL schema\n * @param variableDefinitions - Variable definition nodes from the operation\n * @param formatters - Optional formatters for customizing type names\n */\nexport const generateInputType = (\n schema: AnyGraphqlSchema,\n variableDefinitions: readonly VariableDefinitionNode[],\n formatters?: TypeFormatters,\n): string => {\n if (variableDefinitions.length === 0) {\n return \"{}\";\n }\n\n const fields = variableDefinitions.map((varDef) => {\n const name = varDef.variable.name.value;\n const isRequired = varDef.type.kind === Kind.NON_NULL_TYPE;\n const tsType = graphqlTypeToTypeScript(schema, varDef.type, formatters);\n\n // Apply nullability wrapper for optional fields\n const finalType = isRequired ? tsType : `(${tsType} | null | undefined)`;\n return `readonly ${name}${isRequired ? \"\" : \"?\"}: ${finalType}`;\n });\n\n return `{ ${fields.join(\"; \")} }`;\n};\n\n/**\n * Generate TypeScript type for a single input field from its parsed specifier.\n * Used by generateInputTypeFromSpecifiers.\n */\nconst generateInputFieldTypeFromSpecifier = (\n schema: AnyGraphqlSchema,\n specifier: { kind: string; name: string; modifier: string },\n options: GenerateInputObjectTypeOptions,\n): string => {\n let baseType: string;\n const { formatters } = options;\n\n switch (specifier.kind) {\n case \"scalar\":\n baseType = formatters?.scalarInput?.(specifier.name) ?? getScalarInputType(schema, specifier.name);\n break;\n case \"enum\":\n baseType = getEnumType(schema, specifier.name);\n break;\n case \"input\":\n baseType = formatters?.inputObject?.(specifier.name) ?? generateInputObjectType(schema, specifier.name, options);\n break;\n default:\n baseType = \"unknown\";\n }\n\n return applyTypeModifier(baseType, specifier.modifier as TypeModifier);\n};\n\n/**\n * Generate a TypeScript type string for input variables from InputTypeSpecifiers.\n *\n * Unlike generateInputType which works with GraphQL AST VariableDefinitionNode[],\n * this function works with soda-gql's internal InputTypeSpecifiers format.\n * Used for generating Fragment input types in prebuilt mode.\n *\n * @param schema - The GraphQL schema\n * @param specifiers - Input type specifiers (variable definitions)\n * @param options - Generation options including depth limits\n */\nexport const generateInputTypeFromSpecifiers = (\n schema: AnyGraphqlSchema,\n specifiers: InputTypeSpecifiers,\n options: GenerateInputObjectTypeOptions = {},\n): string => {\n const entries = Object.entries(specifiers);\n\n if (entries.length === 0) {\n return \"void\";\n }\n\n const fields = entries.map(([name, specifierStr]) => {\n const specifier = parseInputSpecifier(specifierStr as string);\n // Check if the outermost type is required\n // \"!\" = required, \"?\" = optional\n // \"![]!\" = required (outer), \"![]?\" = optional (outer)\n // For arrays, check if the last character is \"!\" (required outer) or \"?\" (optional outer)\n const isOuterRequired = specifier.modifier.endsWith(\"!\");\n const hasDefault = specifier.hasDefault;\n const baseType = generateInputFieldTypeFromSpecifier(schema, specifier, options);\n\n // Field is optional if outer type is nullable or has default value\n const isOptional = !isOuterRequired || hasDefault;\n\n return `readonly ${name}${isOptional ? \"?\" : \"\"}: ${baseType}`;\n });\n\n return `{ ${fields.join(\"; \")} }`;\n};\n\n/**\n * Generate a TypeScript type string for input variables from VariableDefinitions.\n *\n * Unlike generateInputTypeFromSpecifiers which works with deferred specifier strings,\n * this function works with VarSpecifier objects from variable definitions.\n * Used for generating Fragment input types in prebuilt mode.\n *\n * @param schema - The GraphQL schema\n * @param varDefs - Variable definitions (VarSpecifier objects)\n * @param options - Generation options including depth limits\n */\nexport const generateInputTypeFromVarDefs = (\n schema: AnyGraphqlSchema,\n varDefs: VariableDefinitions,\n options: GenerateInputObjectTypeOptions = {},\n): string => {\n const entries = Object.entries(varDefs);\n\n if (entries.length === 0) {\n return \"void\";\n }\n\n const fields = entries.map(([name, varSpec]) => {\n // VarSpecifier already has kind, name, modifier as properties\n const isOuterRequired = varSpec.modifier.endsWith(\"!\");\n const hasDefault = varSpec.defaultValue !== null;\n const baseType = generateInputFieldTypeFromSpecifier(schema, varSpec, options);\n\n // Field is optional if outer type is nullable or has default value\n const isOptional = !isOuterRequired || hasDefault;\n\n return `readonly ${name}${isOptional ? \"?\" : \"\"}: ${baseType}`;\n });\n\n return `{ ${fields.join(\"; \")} }`;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["inner: VarRefInner","inner: DirectiveRefInner","INPUT_KIND_MAP: Record<string, InputTypeKind>","OUTPUT_KIND_MAP: Record<string, OutputTypeKind>","fieldTypeSpecifier: ParsedInputSpecifier | null","inlineFragments: InlineFragmentNode[]","curr: Readonly<{ modifier: string; type: TypeNode }>","defaultValue: ConstValueNode | undefined","enumLookup: EnumLookup","cache: { value: T } | null","promise: Promise<void> | null","cache: object | null","lazyCreateEvaluationGenerator","lazyEvaluateSync","document: import(\"graphql\").DocumentNode","parseGraphql","inString: false | '\"' | \"'\"","match: RegExpExecArray | null","levels: TypeLevel[]","operations: ParsedOperation[]","fragments: ParsedFragment[]","variables: ParsedVariable[]","scalars: SchemaIndex[\"scalars\"]","enums: SchemaIndex[\"enums\"]","inputs: SchemaIndex[\"inputs\"]","operationTypes: OperationTypeNames","builtinScalarTypes","lists: (\"[]!\" | \"[]?\")[]","match: RegExpExecArray | null","mergedInner: \"!\" | \"?\"","mergedLists: (\"[]!\" | \"[]?\")[]","usages: VariableUsage[]","error","variables: InferredVariable[]","sorted: ParsedFragment[]","fragments: EnrichedFragment[]","operations: EnrichedOperation[]","variables: EnrichedVariable[]","resolveTypeKind","spreadVariables: InferredVariable[]","obj: Record<string, unknown>","result: Record<string, BuiltVarSpecifier>","defaultMetadataAdapter: DefaultMetadataAdapter","fieldPathContext: { current: FieldPath | null }","newSegment: FieldPathSegment","cacheMap: CacheMap","wrap","result: Record<string, unknown>","fragmentUsageContext: { current: FragmentUsageRecord[] | null }","usages: FragmentUsageRecord[]","merged: Record<string, VariableDefinitions[string]>","proxy: T","varRefTools: VarRefTools","syntheticDoc: import(\"graphql\").DocumentNode","parseGraphql","result: Record<string, unknown>","unionInput: Record<string, unknown>","unsupportedSelections: string[]","spreadFields: AnyFieldsExtended","document: import(\"graphql\").DocumentNode","metadataBuilder: (() => unknown | Promise<unknown>) | null","fragmentUsages: FragmentUsage","fragmentMetaInfos: FragmentMetaInfo<TFragmentMetadata>[]","fragmentMetadataResults: (TFragmentMetadata | undefined | Promise<TFragmentMetadata>)[]","aggregated","parseGraphql","document: import(\"graphql\").DocumentNode","parseGraphql","varSpecifiers: VariableDefinitions","varDefNodes: readonly import(\"graphql\").VariableDefinitionNode[]","elementComposer: GqlElementComposer<typeof context>","baseType: string","memberTypes: string[]","selection: AnyFieldSelection"],"sources":["../src/types/type-foundation/var-ref.ts","../src/types/type-foundation/directive-ref.ts","../src/utils/deferred-specifier-parser.ts","../src/composer/build-document.ts","../src/composer/colocate.ts","../src/utils/promise.ts","../src/types/element/lazy-evaluator.ts","../src/types/element/gql-element.ts","../src/types/element/define.ts","../src/types/element/fragment.ts","../src/types/element/operation.ts","../src/composer/compat-tagged-template.ts","../src/composer/directive-builder.ts","../src/graphql/fragment-args-preprocessor.ts","../src/graphql/result.ts","../src/graphql/parser.ts","../src/graphql/schema-adapter.ts","../src/graphql/schema-index.ts","../src/graphql/transformer.ts","../src/graphql/var-specifier-builder.ts","../src/types/metadata/adapter.ts","../src/composer/field-path-context.ts","../src/composer/fields-builder.ts","../src/composer/fragment-usage-context.ts","../src/utils/map-values.ts","../src/composer/input.ts","../src/composer/merge-variable-definitions.ts","../src/composer/var-ref-tools.ts","../src/composer/fragment-tagged-template.ts","../src/composer/operation-core.ts","../src/composer/extend.ts","../src/composer/operation-tagged-template.ts","../src/composer/gql-composer.ts","../src/prebuilt/type-calculator.ts"],"sourcesContent":["import type { CreatableInputTypeKind } from \"./type-specifier\";\n\n/**\n * VarRef meta interface using typeName + kind instead of full profile.\n * This simplifies type comparison and improves error messages.\n * Uses CreatableInputTypeKind since VarRefs should never reference excluded types.\n */\nexport interface AnyVarRefBrand {\n readonly typeName: string;\n readonly kind: CreatableInputTypeKind;\n readonly signature: unknown;\n}\n\n/**\n * A nested value that can contain:\n * - Primitive ConstValue (string, number, boolean, null, undefined)\n * - VarRef at any nesting level\n * - Objects with NestedValue fields\n * - Arrays of NestedValue\n */\nexport type NestedValue =\n | string\n | number\n | boolean\n | null\n | undefined\n | { readonly [key: string]: NestedValueElement }\n | readonly NestedValueElement[];\n\nexport type NestedValueElement =\n | string\n | number\n | boolean\n | null\n | undefined\n | AnyVarRef\n | { readonly [key: string]: NestedValueElement }\n | readonly NestedValueElement[];\n\nexport type VarRefInner =\n | {\n type: \"variable\";\n name: string;\n }\n | {\n type: \"nested-value\";\n value: NestedValue;\n };\n\nexport type AnyVarRef = VarRef<any>;\n\ndeclare const __VAR_REF_BRAND__: unique symbol;\nexport class VarRef<TBrand extends AnyVarRefBrand> {\n declare readonly [__VAR_REF_BRAND__]: TBrand;\n\n constructor(private readonly inner: VarRefInner) {}\n\n static getInner(varRef: AnyVarRef): VarRefInner {\n return varRef.inner;\n }\n}\n\n/**\n * Creates a VarRef from a variable name.\n * Returns AnyVarRef - type safety is enforced at assignment sites.\n */\nexport function createVarRefFromVariable(name: string): AnyVarRef {\n return new VarRef({ type: \"variable\", name });\n}\n\n/**\n * Creates a VarRef from a nested value.\n * Returns AnyVarRef - type safety is enforced at assignment sites.\n */\nexport function createVarRefFromNestedValue(value: NestedValue): AnyVarRef {\n return new VarRef({ type: \"nested-value\", value });\n}\n","/**\n * DirectiveRef type for representing field-level directives.\n *\n * Similar to VarRef, DirectiveRef uses a branded type pattern to carry\n * type information about the directive (name, locations, arguments) while\n * allowing relaxed type checking at the field builder level.\n *\n * @module\n */\n\nimport type { DeferredInputSpecifier } from \"./type-specifier\";\n\n/**\n * Executable directive locations (used in operations/fragments).\n */\nexport type ExecutableDirectiveLocation =\n | \"QUERY\"\n | \"MUTATION\"\n | \"SUBSCRIPTION\"\n | \"FIELD\"\n | \"FRAGMENT_DEFINITION\"\n | \"FRAGMENT_SPREAD\"\n | \"INLINE_FRAGMENT\"\n | \"VARIABLE_DEFINITION\";\n\n/**\n * Type system directive locations (used in schema definitions).\n */\nexport type TypeSystemDirectiveLocation =\n | \"SCHEMA\"\n | \"SCALAR\"\n | \"OBJECT\"\n | \"FIELD_DEFINITION\"\n | \"ARGUMENT_DEFINITION\"\n | \"INTERFACE\"\n | \"UNION\"\n | \"ENUM\"\n | \"ENUM_VALUE\"\n | \"INPUT_OBJECT\"\n | \"INPUT_FIELD_DEFINITION\";\n\n/**\n * All valid locations where a directive can be applied.\n * Matches GraphQL specification DirectiveLocation enum.\n */\nexport type DirectiveLocation = ExecutableDirectiveLocation | TypeSystemDirectiveLocation;\n\n/**\n * Brand interface for DirectiveRef type information.\n * Contains the directive name and valid locations.\n */\nexport interface AnyDirectiveRefBrand {\n readonly directiveName: string;\n readonly locations: readonly DirectiveLocation[];\n}\n\n/**\n * Type specifier for a directive argument.\n * Uses deferred string format for consistency with other type specifiers.\n * @see DeferredInputSpecifier\n */\nexport type DirectiveArgumentSpecifier = DeferredInputSpecifier;\n\n/**\n * Internal structure of a DirectiveRef.\n * Contains the directive name, arguments, valid locations, and optional argument specifiers.\n */\nexport type DirectiveRefInner = {\n readonly name: string;\n readonly arguments: Readonly<Record<string, unknown>>;\n readonly locations: readonly DirectiveLocation[];\n /**\n * Type specifiers for arguments, enabling enum detection.\n * Generated by codegen for typed directives.\n */\n readonly argumentSpecs?: Readonly<Record<string, DirectiveArgumentSpecifier>>;\n};\n\ndeclare const __DIRECTIVE_REF_BRAND__: unique symbol;\n\n/**\n * A reference to a directive that can be applied to fields.\n *\n * DirectiveRef carries type information about the directive via the TBrand\n * type parameter, but this information is only used for type inference,\n * not for runtime validation.\n *\n * @example\n * ```typescript\n * const skipDirective = new DirectiveRef({\n * name: \"skip\",\n * arguments: { if: true },\n * locations: [\"FIELD\", \"FRAGMENT_SPREAD\", \"INLINE_FRAGMENT\"],\n * });\n * ```\n */\nexport class DirectiveRef<TBrand extends AnyDirectiveRefBrand> {\n declare readonly [__DIRECTIVE_REF_BRAND__]: TBrand;\n\n constructor(private readonly inner: DirectiveRefInner) {}\n\n /**\n * Extracts the inner structure from a DirectiveRef.\n * Used by build-document.ts to generate DirectiveNode.\n */\n static getInner(ref: AnyDirectiveRef): DirectiveRefInner {\n return ref.inner;\n }\n}\n\n/**\n * Type-erased DirectiveRef for use in contexts where\n * the specific directive type is not needed.\n */\nexport type AnyDirectiveRef = DirectiveRef<AnyDirectiveRefBrand>;\n","/**\n * Runtime parser for deferred specifier strings.\n *\n * Parses string literal specifiers like \"s|uuid|!\" into structured objects\n * for runtime operations that need to access specifier properties.\n */\n\nimport type {\n DeferredOutputField,\n DeferredOutputFieldWithArgs,\n InputTypeKind,\n OutputTypeKind,\n} from \"../types/type-foundation/type-specifier\";\n\nexport type ParsedInputSpecifier = {\n kind: InputTypeKind;\n name: string;\n modifier: string;\n hasDefault: boolean;\n};\n\nexport type ParsedOutputSpecifier = {\n kind: OutputTypeKind;\n name: string;\n modifier: string;\n /** Deferred input specifier strings for arguments */\n arguments: Record<string, string>;\n};\n\nconst INPUT_KIND_MAP: Record<string, InputTypeKind> = {\n s: \"scalar\",\n e: \"enum\",\n i: \"input\",\n x: \"excluded\",\n};\n\nconst OUTPUT_KIND_MAP: Record<string, OutputTypeKind> = {\n s: \"scalar\",\n e: \"enum\",\n o: \"object\",\n u: \"union\",\n x: \"excluded\",\n};\n\n/**\n * Parse a deferred input specifier string into a structured object.\n *\n * @example\n * parseInputSpecifier(\"s|uuid|!\")\n * // { kind: \"scalar\", name: \"uuid\", modifier: \"!\", hasDefault: false }\n *\n * parseInputSpecifier(\"e|order_by|?|D\")\n * // { kind: \"enum\", name: \"order_by\", modifier: \"?\", hasDefault: true }\n */\nexport function parseInputSpecifier(spec: string): ParsedInputSpecifier {\n const hasDefault = spec.endsWith(\"|D\");\n const parts = spec.split(\"|\");\n\n const kindChar = parts[0];\n const name = parts[1];\n if (!kindChar || !name) {\n throw new Error(`Invalid input specifier format: ${spec}`);\n }\n // Modifier is everything after kind|name| but before any |D suffix\n const modifier = hasDefault ? (parts[2] ?? \"\") : parts.slice(2).join(\"|\");\n\n const kind = INPUT_KIND_MAP[kindChar];\n if (!kind) {\n throw new Error(`Invalid input specifier kind: ${kindChar}`);\n }\n\n return { kind, name, modifier, hasDefault };\n}\n\n/**\n * Parse a deferred output specifier string into a structured object.\n * Note: Output specifiers no longer contain inline arguments.\n * Use parseOutputField() for field specifiers that may have arguments.\n *\n * @example\n * parseOutputSpecifier(\"o|users|![]!\")\n * // { kind: \"object\", name: \"users\", modifier: \"![]!\", arguments: {} }\n */\nexport function parseOutputSpecifier(spec: string): ParsedOutputSpecifier {\n const parts = spec.split(\"|\");\n\n const kindChar = parts[0];\n const name = parts[1];\n const modifier = parts[2];\n if (!kindChar || !name || modifier === undefined) {\n throw new Error(`Invalid output specifier format: ${spec}`);\n }\n\n const kind = OUTPUT_KIND_MAP[kindChar];\n if (!kind) {\n throw new Error(`Invalid output specifier kind: ${kindChar}`);\n }\n\n return { kind, name, modifier, arguments: {} };\n}\n\n// ============================================================\n// Field Specifier Parsing (handles both string and object formats)\n// ============================================================\n\n/**\n * Type guard to check if a field specifier has extracted arguments.\n *\n * @example\n * isFieldWithArgs(\"o|User|!\") // false\n * isFieldWithArgs({ spec: \"o|User|!\", arguments: { id: \"s|ID|!\" } }) // true\n */\nexport function isFieldWithArgs(field: DeferredOutputField): field is DeferredOutputFieldWithArgs {\n return typeof field === \"object\" && field !== null && \"spec\" in field;\n}\n\n/**\n * Parse a field specifier into a structured object.\n * Handles both string format (no arguments) and object format (with arguments).\n *\n * @example\n * // Object format (with arguments)\n * parseOutputField({ spec: \"o|User|!\", arguments: { id: \"s|ID|!\" } })\n * // { kind: \"object\", name: \"User\", modifier: \"!\", arguments: { id: \"s|ID|!\" } }\n *\n * // String format (no arguments)\n * parseOutputField(\"s|String|!\")\n * // { kind: \"scalar\", name: \"String\", modifier: \"!\", arguments: {} }\n */\nexport function parseOutputField(field: DeferredOutputField): ParsedOutputSpecifier {\n if (isFieldWithArgs(field)) {\n // Object format - arguments in separate property\n const spec = parseOutputSpecifier(field.spec);\n return { ...spec, arguments: field.arguments };\n }\n // String format - no arguments\n return parseOutputSpecifier(field);\n}\n","/**\n * Builds GraphQL AST nodes from field selections.\n *\n * Converts the type-safe field selection DSL into GraphQL AST,\n * producing a TypedDocumentNode for use with GraphQL clients.\n *\n * @module\n */\n\nimport type { TypedDocumentNode } from \"@graphql-typed-document-node/core\";\nimport {\n type ArgumentNode,\n type ConstObjectFieldNode,\n type ConstValueNode,\n type DirectiveNode,\n type DocumentNode,\n type FieldNode,\n type InlineFragmentNode,\n Kind,\n type NamedTypeNode,\n type ObjectFieldNode,\n OperationTypeNode,\n type SelectionNode,\n type TypeNode,\n type ValueNode,\n type VariableDefinitionNode,\n} from \"graphql\";\nimport {\n type AnyAssignableInput,\n type AnyAssignableInputValue,\n type AnyDirectiveAttachments,\n type AnyFieldSelection,\n type AnyFieldsExtended,\n type AnyFieldValue,\n type AnyUnionSelection,\n type ScalarShorthand,\n VarRef,\n} from \"../types/fragment\";\nimport type { AnyGraphqlSchema, OperationType } from \"../types/schema\";\nimport type {\n ConstValue,\n DeferredInputSpecifier,\n InputTypeSpecifiers,\n TypeModifier,\n VariableDefinitions,\n VarSpecifier,\n} from \"../types/type-foundation\";\nimport { type AnyDirectiveRef, type DirectiveLocation, DirectiveRef } from \"../types/type-foundation/directive-ref\";\nimport { type ParsedInputSpecifier, parseInputSpecifier, parseOutputField } from \"../utils/deferred-specifier-parser\";\n\n/**\n * Context for determining if a value should be output as an enum.\n * Contains the schema for looking up nested input types and the current type specifier.\n */\nexport type EnumLookup = {\n schema: AnyGraphqlSchema;\n /** Parsed type specifier for the current value. null means enum detection is skipped. */\n typeSpecifier: ParsedInputSpecifier | null;\n};\n\n/**\n * Converts an assignable input value to a GraphQL AST ValueNode.\n *\n * Handles primitives, arrays, objects, and variable references.\n * Returns null for undefined values (field is omitted).\n *\n * @param value - The value to convert\n * @param enumLookup - Context for enum detection. String values will be output\n * as Kind.ENUM if typeSpecifier indicates an enum type.\n */\nexport const buildArgumentValue = (value: AnyAssignableInputValue, enumLookup: EnumLookup): ValueNode | null => {\n if (value === undefined) {\n return null;\n }\n\n if (value === null) {\n return {\n kind: Kind.NULL,\n };\n }\n\n if (value instanceof VarRef) {\n const inner = VarRef.getInner(value);\n if (inner.type === \"variable\") {\n return {\n kind: Kind.VARIABLE,\n name: { kind: Kind.NAME, value: inner.name },\n };\n }\n\n if (inner.type === \"nested-value\") {\n // Recursively process the nested value\n // This handles VarRefs inside the nested structure\n return buildArgumentValue(inner.value as AnyAssignableInputValue, enumLookup);\n }\n\n throw new Error(`Unknown var ref type: ${inner satisfies never}`);\n }\n\n if (Array.isArray(value)) {\n // For list types, the inner type specifier remains the same (e.g., [Status!]! uses Status for each item)\n return {\n kind: Kind.LIST,\n values: value.map((item) => buildArgumentValue(item, enumLookup)).filter((item) => item !== null),\n };\n }\n\n if (typeof value === \"object\") {\n return {\n kind: Kind.OBJECT,\n fields: Object.entries(value)\n .map(([key, fieldValue]): ObjectFieldNode | null => {\n // Look up field type in nested InputObject for enum detection\n let fieldTypeSpecifier: ParsedInputSpecifier | null = null;\n if (enumLookup.typeSpecifier?.kind === \"input\") {\n const inputDefs = enumLookup.schema.input;\n const inputDef = inputDefs?.[enumLookup.typeSpecifier.name];\n const fieldSpec = inputDef?.fields[key];\n fieldTypeSpecifier = fieldSpec ? parseInputSpecifier(fieldSpec) : null;\n }\n\n const valueNode = buildArgumentValue(fieldValue, {\n schema: enumLookup.schema,\n typeSpecifier: fieldTypeSpecifier,\n });\n return valueNode\n ? {\n kind: Kind.OBJECT_FIELD,\n name: { kind: Kind.NAME, value: key },\n value: valueNode,\n }\n : null;\n })\n .filter((item) => item !== null),\n };\n }\n\n if (typeof value === \"string\") {\n // Output as Kind.ENUM if the type specifier indicates this is an enum type\n if (enumLookup.typeSpecifier?.kind === \"enum\") {\n return {\n kind: Kind.ENUM,\n value,\n };\n }\n return {\n kind: Kind.STRING,\n value,\n };\n }\n\n if (typeof value === \"number\") {\n // Distinguish between INT and FLOAT\n const isFloat = !Number.isInteger(value) || value.toString().includes(\".\");\n return {\n kind: isFloat ? Kind.FLOAT : Kind.INT,\n value: value.toString(),\n };\n }\n\n if (typeof value === \"boolean\") {\n return {\n kind: Kind.BOOLEAN,\n value,\n };\n }\n\n throw new Error(`Unknown value type: ${typeof (value satisfies never)}`);\n};\n\nconst buildArguments = (\n args: AnyAssignableInput,\n argumentSpecifiers: InputTypeSpecifiers,\n schema: AnyGraphqlSchema,\n): ArgumentNode[] =>\n Object.entries(args ?? {})\n .map(([name, value]): ArgumentNode | null => {\n const specifierStr = argumentSpecifiers[name];\n const typeSpecifier = specifierStr ? parseInputSpecifier(specifierStr) : null;\n const valueNode = buildArgumentValue(value, { schema, typeSpecifier });\n return valueNode\n ? {\n kind: Kind.ARGUMENT,\n name: { kind: Kind.NAME, value: name },\n value: valueNode,\n }\n : null;\n })\n .filter((item) => item !== null);\n\n/**\n * Build arguments from directive argument specifiers (deferred string format).\n * Uses parseInputSpecifier to convert deferred strings to structured format.\n */\nconst buildDirectiveArguments = (\n args: AnyAssignableInput,\n argumentSpecifiers: Readonly<Record<string, DeferredInputSpecifier>> | undefined,\n schema: AnyGraphqlSchema,\n): ArgumentNode[] =>\n Object.entries(args ?? {})\n .map(([name, value]): ArgumentNode | null => {\n const spec = argumentSpecifiers?.[name];\n const typeSpecifier = spec ? parseInputSpecifier(spec) : null;\n const valueNode = buildArgumentValue(value, { schema, typeSpecifier });\n return valueNode\n ? {\n kind: Kind.ARGUMENT,\n name: { kind: Kind.NAME, value: name },\n value: valueNode,\n }\n : null;\n })\n .filter((item) => item !== null);\n\n/**\n * Validates that a directive can be used at the specified location.\n *\n * @param directive - The directive reference to validate\n * @param expectedLocation - The location where the directive is being used\n * @throws Error if the directive is not valid at the specified location\n */\nconst validateDirectiveLocation = (directive: AnyDirectiveRef, expectedLocation: DirectiveLocation): void => {\n const inner = DirectiveRef.getInner(directive);\n if (!inner.locations.includes(expectedLocation)) {\n throw new Error(\n `Directive @${inner.name} cannot be used on ${expectedLocation}. ` + `Valid locations: ${inner.locations.join(\", \")}`,\n );\n }\n};\n\n/**\n * Builds DirectiveNode array from field directives.\n *\n * Filters for DirectiveRef instances, validates their locations,\n * and converts them to GraphQL AST DirectiveNode objects.\n *\n * @param directives - Array of directive references (or unknown values)\n * @param location - The location context for validation\n * @param schema - The schema for type lookups\n * @returns Array of DirectiveNode for the GraphQL AST\n *\n * Uses argument specifiers from DirectiveRef (when available via createTypedDirectiveMethod)\n * to properly output enum arguments as Kind.ENUM instead of Kind.STRING.\n */\nconst buildDirectives = (\n directives: AnyDirectiveAttachments,\n location: DirectiveLocation,\n schema: AnyGraphqlSchema,\n): DirectiveNode[] => {\n return directives\n .filter((d): d is AnyDirectiveRef => d instanceof DirectiveRef)\n .map((directive) => {\n validateDirectiveLocation(directive, location);\n const inner = DirectiveRef.getInner(directive);\n\n return {\n kind: Kind.DIRECTIVE as const,\n name: { kind: Kind.NAME as const, value: inner.name },\n arguments: buildDirectiveArguments(inner.arguments as AnyAssignableInput, inner.argumentSpecs, schema),\n };\n });\n};\n\n/**\n * Check if value is shorthand (true) vs factory return (AnyFieldSelection).\n * Used for field selection shorthand syntax support.\n */\nconst isShorthand = (value: AnyFieldValue): value is ScalarShorthand => {\n return value === true;\n};\n\n/**\n * Expand shorthand to AnyFieldSelection using schema type info.\n * Used at document build time to convert `true` to full field selection.\n *\n * @param schema - The GraphQL schema\n * @param typeName - The parent object type name\n * @param fieldName - The field name to select\n */\nconst expandShorthand = (schema: AnyGraphqlSchema, typeName: string, fieldName: string): AnyFieldSelection => {\n const typeDef = schema.object[typeName];\n if (!typeDef) {\n throw new Error(`Type \"${typeName}\" not found in schema`);\n }\n\n // Runtime duck-typing: codegen may emit string or { spec, arguments }\n const fieldDef = typeDef.fields[fieldName];\n if (!fieldDef) {\n throw new Error(`Field \"${fieldName}\" not found on type \"${typeName}\"`);\n }\n\n const fieldSpec = typeof fieldDef === \"string\" ? fieldDef : (fieldDef as { spec: string }).spec;\n\n return {\n parent: typeName,\n field: fieldName,\n type: fieldSpec as unknown as import(\"../types/type-foundation\").DeferredOutputFieldWithArgs,\n args: {},\n directives: [],\n object: null,\n union: null,\n };\n};\n\nconst buildUnionSelection = (union: AnyUnionSelection, schema: AnyGraphqlSchema): SelectionNode[] => {\n const { selections, __typename: hasTypenameFlag } = union;\n\n const inlineFragments: InlineFragmentNode[] = Object.entries(selections)\n .map(([typeName, member]): InlineFragmentNode | null => {\n // Skip undefined values and non-object values (shouldn't happen but guard against it)\n if (!member || typeof member !== \"object\") {\n return null;\n }\n const { fields, directives: memberDirectives } = member as import(\"../types/fragment\").UnionMemberSelection;\n const builtDirectives = buildDirectives(memberDirectives, \"INLINE_FRAGMENT\", schema);\n return {\n kind: Kind.INLINE_FRAGMENT,\n typeCondition: {\n kind: Kind.NAMED_TYPE,\n name: { kind: Kind.NAME, value: typeName },\n },\n ...(builtDirectives.length > 0 ? { directives: builtDirectives } : {}),\n selectionSet: {\n kind: Kind.SELECTION_SET,\n selections: buildField(fields, schema, typeName),\n },\n };\n })\n .filter((item) => item !== null);\n\n if (hasTypenameFlag) {\n const typenameField: FieldNode = {\n kind: Kind.FIELD,\n name: { kind: Kind.NAME, value: \"__typename\" },\n };\n return [typenameField, ...inlineFragments];\n }\n\n return inlineFragments;\n};\n\n/**\n * Builds field nodes from extended fields map.\n * Supports both shorthand (true) and factory (AnyFieldSelection) syntax.\n *\n * @param fields - Field selections (shorthand or factory)\n * @param schema - The GraphQL schema\n * @param typeName - Parent type name (required for shorthand expansion)\n */\nconst buildField = (fields: AnyFieldsExtended, schema: AnyGraphqlSchema, typeName?: string): FieldNode[] =>\n Object.entries(fields).map(([alias, value]): FieldNode => {\n // __typename is an implicit introspection field on all object types\n if (alias === \"__typename\" && isShorthand(value)) {\n return {\n kind: Kind.FIELD,\n name: { kind: Kind.NAME, value: \"__typename\" },\n };\n }\n // Expand shorthand to AnyFieldSelection if needed\n if (isShorthand(value) && !typeName) {\n throw new Error(`typeName is required for shorthand expansion of field \"${alias}\"`);\n }\n // typeName is guaranteed to be defined here when isShorthand(value) is true\n const selection = isShorthand(value) ? expandShorthand(schema, typeName as string, alias) : value;\n\n const { args, field, object, union, directives, type } = selection;\n const parsedType = parseOutputField(type);\n const builtDirectives = buildDirectives(directives, \"FIELD\", schema);\n return {\n kind: Kind.FIELD,\n name: { kind: Kind.NAME, value: field },\n alias: alias !== field ? { kind: Kind.NAME, value: alias } : undefined,\n arguments: buildArguments(args, parsedType.arguments as InputTypeSpecifiers, schema),\n directives: builtDirectives.length > 0 ? builtDirectives : undefined,\n selectionSet: object\n ? {\n kind: Kind.SELECTION_SET,\n selections: buildField(object, schema, parsedType.name),\n }\n : union\n ? {\n kind: Kind.SELECTION_SET,\n selections: buildUnionSelection(union, schema),\n }\n : undefined,\n };\n });\n\n/**\n * Converts a constant value to a GraphQL AST ConstValueNode.\n *\n * Unlike `buildArgumentValue`, this only handles literal values\n * (no variable references). Used for default values.\n *\n * @param value - The constant value to convert\n * @param enumLookup - Context for enum detection. String values will be output\n * as Kind.ENUM if typeSpecifier indicates an enum type.\n */\nexport const buildConstValueNode = (value: ConstValue, enumLookup: EnumLookup): ConstValueNode | null => {\n if (value === undefined) {\n return null;\n }\n\n if (value === null) {\n return { kind: Kind.NULL };\n }\n\n if (Array.isArray(value)) {\n // For list types, the inner type specifier remains the same\n return {\n kind: Kind.LIST,\n values: value.map((item) => buildConstValueNode(item, enumLookup)).filter((item) => item !== null),\n };\n }\n\n if (typeof value === \"object\") {\n return {\n kind: Kind.OBJECT,\n fields: Object.entries(value)\n .map(([key, fieldValue]): ConstObjectFieldNode | null => {\n // Look up field type in nested InputObject for enum detection\n let fieldTypeSpecifier: ParsedInputSpecifier | null = null;\n if (enumLookup.typeSpecifier?.kind === \"input\") {\n const inputDefs = enumLookup.schema.input;\n const inputDef = inputDefs?.[enumLookup.typeSpecifier.name];\n const fieldSpec = inputDef?.fields[key];\n fieldTypeSpecifier = fieldSpec ? parseInputSpecifier(fieldSpec) : null;\n }\n\n const valueNode = buildConstValueNode(fieldValue, {\n schema: enumLookup.schema,\n typeSpecifier: fieldTypeSpecifier,\n });\n return valueNode\n ? {\n kind: Kind.OBJECT_FIELD,\n name: { kind: Kind.NAME, value: key },\n value: valueNode,\n }\n : null;\n })\n .filter((item) => item !== null),\n };\n }\n\n if (typeof value === \"string\") {\n // Output as Kind.ENUM if the type specifier indicates this is an enum type\n if (enumLookup.typeSpecifier?.kind === \"enum\") {\n return { kind: Kind.ENUM, value };\n }\n return { kind: Kind.STRING, value };\n }\n\n if (typeof value === \"boolean\") {\n return { kind: Kind.BOOLEAN, value };\n }\n\n if (typeof value === \"number\") {\n // Distinguish between INT and FLOAT\n const isFloat = !Number.isInteger(value) || value.toString().includes(\".\");\n return { kind: isFloat ? Kind.FLOAT : Kind.INT, value: value.toString() };\n }\n\n throw new Error(`Unknown value type: ${typeof (value satisfies never)}`);\n};\n\n/**\n * Wraps a named type with modifiers (non-null, list).\n *\n * Modifier format: starts with `?` (nullable) or `!` (non-null),\n * followed by `[]?` or `[]!` pairs for lists.\n *\n * @example\n * - `\"!\"` -> `String!`\n * - `\"?\"` -> `String`\n * - `\"![]!\"` -> `[String!]!`\n * - `\"?[]?\"` -> `[String]`\n */\nexport const buildWithTypeModifier = (modifier: TypeModifier, buildType: () => NamedTypeNode): TypeNode => {\n const baseType = buildType();\n\n if (modifier === \"?\") {\n return baseType;\n }\n\n if (modifier === \"!\") {\n return { kind: Kind.NON_NULL_TYPE, type: baseType };\n }\n\n // Validate modifier format: must start with ? or !, followed by []? or []! pairs\n // Valid patterns: \"?\", \"!\", \"?[]?\", \"?[]!\", \"![]?\", \"![]!\", \"?[]?[]?\", etc.\n const validModifierPattern = /^[?!](\\[\\][?!])*$/;\n if (!validModifierPattern.test(modifier)) {\n throw new Error(`Unknown modifier: ${modifier}`);\n }\n\n // New format: starts with inner type modifier (? or !), then []? or []! pairs\n // e.g., \"?[]?\" = nullable list of nullable, \"![]!\" = non-null list of non-null\n let curr: Readonly<{ modifier: string; type: TypeNode }> = {\n modifier,\n type: baseType,\n };\n\n while (curr.modifier.length > 0) {\n // Handle inner type modifier (? or !)\n if (curr.modifier.startsWith(\"?\")) {\n // Nullable inner type - type stays as-is\n curr = {\n modifier: curr.modifier.slice(1),\n type: curr.type,\n };\n continue;\n }\n\n if (curr.modifier.startsWith(\"!\")) {\n // Non-null inner type\n curr = {\n modifier: curr.modifier.slice(1),\n type: curr.type.kind === Kind.NON_NULL_TYPE ? curr.type : { kind: Kind.NON_NULL_TYPE, type: curr.type },\n };\n continue;\n }\n\n // Handle list modifiers ([]? or []!)\n if (curr.modifier.startsWith(\"[]?\")) {\n // Nullable list\n curr = {\n modifier: curr.modifier.slice(3),\n type: { kind: Kind.LIST_TYPE, type: curr.type },\n };\n continue;\n }\n\n if (curr.modifier.startsWith(\"[]!\")) {\n // Non-null list\n curr = {\n modifier: curr.modifier.slice(3),\n type: {\n kind: Kind.NON_NULL_TYPE,\n type: { kind: Kind.LIST_TYPE, type: curr.type },\n },\n };\n continue;\n }\n\n throw new Error(`Unknown modifier: ${curr.modifier}`);\n }\n\n return curr.type;\n};\n\n/**\n * Builds VariableDefinitionNode[] from VarSpecifier records.\n * Kept as private fallback for callers that don't provide pre-parsed nodes.\n */\nconst buildVariables = (variables: Record<string, VarSpecifier>, schema: AnyGraphqlSchema): VariableDefinitionNode[] => {\n return Object.entries(variables).map(([name, varSpec]): VariableDefinitionNode => {\n // Build default value if present\n let defaultValue: ConstValueNode | undefined;\n if (varSpec.defaultValue) {\n // Convert VarSpecifier to ParsedInputSpecifier format for enum lookup\n const parsedSpec: ParsedInputSpecifier = {\n kind: varSpec.kind,\n name: varSpec.name,\n modifier: varSpec.modifier,\n hasDefault: true,\n };\n const enumLookup: EnumLookup = { schema, typeSpecifier: parsedSpec };\n const constValue = buildConstValueNode(varSpec.defaultValue.default, enumLookup);\n defaultValue = constValue ?? undefined;\n }\n\n return {\n kind: Kind.VARIABLE_DEFINITION,\n variable: { kind: Kind.VARIABLE, name: { kind: Kind.NAME, value: name } },\n defaultValue,\n type: buildWithTypeModifier(varSpec.modifier, () => ({\n kind: Kind.NAMED_TYPE,\n name: { kind: Kind.NAME, value: varSpec.name },\n })),\n };\n });\n};\n\n/**\n * Converts an operation type string to a GraphQL AST OperationTypeNode.\n */\nexport const buildOperationTypeNode = (operation: OperationType): OperationTypeNode => {\n switch (operation) {\n case \"query\":\n return OperationTypeNode.QUERY;\n case \"mutation\":\n return OperationTypeNode.MUTATION;\n case \"subscription\":\n return OperationTypeNode.SUBSCRIPTION;\n default:\n throw new Error(`Unknown operation type: ${operation}`);\n }\n};\n\n/**\n * Builds a TypedDocumentNode from operation options.\n *\n * This is the main entry point for converting field selections into\n * a GraphQL document AST. The result can be used with any GraphQL\n * client that supports TypedDocumentNode.\n *\n * @param options - Operation configuration (name, type, variables, fields, schema)\n * @returns TypedDocumentNode with inferred input/output types\n */\nexport const buildDocument = <\n TSchema extends AnyGraphqlSchema,\n TTypeName extends keyof TSchema[\"object\"] & string,\n TFields extends AnyFieldsExtended,\n TVarDefinitions extends VariableDefinitions,\n>(options: {\n operationName: string;\n operationType: OperationType;\n operationTypeName: TTypeName;\n variableDefinitionNodes?: readonly VariableDefinitionNode[];\n variables: TVarDefinitions;\n fields: TFields;\n schema: TSchema;\n // biome-ignore lint/suspicious/noExplicitAny: Type inference deferred to prebuilt types\n}): TypedDocumentNode<any, any> => {\n const { operationName, operationType, operationTypeName, variableDefinitionNodes, variables, fields, schema } = options;\n\n // Use pre-parsed variable definition nodes if provided, otherwise fall back to building from VarSpecifier records\n const varDefs = variableDefinitionNodes ?? buildVariables(variables, schema);\n\n return {\n kind: Kind.DOCUMENT,\n definitions: [\n {\n kind: Kind.OPERATION_DEFINITION,\n operation: buildOperationTypeNode(operationType),\n name: { kind: Kind.NAME, value: operationName },\n variableDefinitions: varDefs as VariableDefinitionNode[],\n // directives: directives || [],\n selectionSet: {\n kind: Kind.SELECTION_SET,\n selections: buildField(fields, schema, operationTypeName),\n },\n },\n ],\n // biome-ignore lint/suspicious/noExplicitAny: Type inference deferred to prebuilt types\n } satisfies DocumentNode as TypedDocumentNode<any, any>;\n};\n","import type { AnyFieldsExtended } from \"../types/fragment\";\nimport type { UnionToIntersection } from \"../utils/type-utils\";\n\n/**\n * Type for colocated field entries.\n * Maps labels to their corresponding field selections.\n */\nexport type ColocatedEntries = Record<string, AnyFieldsExtended>;\n\n/**\n * Result type for colocated fields.\n * Merges all prefixed entries into a single object.\n */\nexport type ColocatedFields<TEntries extends ColocatedEntries> = UnionToIntersection<\n {\n [KPrefix in keyof TEntries]: KPrefix extends string\n ? {\n [KField in keyof TEntries[KPrefix] as KField extends string\n ? `${KPrefix}_${KField}`\n : never]: TEntries[KPrefix][KField];\n }\n : never;\n }[keyof TEntries]\n>;\n\n/**\n * Creates a $colocate helper function for fragment colocation.\n *\n * $colocate takes an object of { label: fields } and applies prefix-based\n * aliasing to each entry. This mirrors the structure of createExecutionResultParser\n * from @soda-gql/colocation-tools.\n *\n * @example\n * ```typescript\n * // In operation definition\n * query(\"GetData\")({\n * variables: `($userId: ID!)`,\n * fields: ({ f, $ }) => $colocate({\n * userCard: { ...f(\"user\", { id: $.userId })(() => ({ ...userCardFragment.spread() })) },\n * posts: { ...f(\"posts\", { userId: $.userId })(() => ({ ...postsFragment.spread() })) },\n * }),\n * })({});\n *\n * // In parser definition (same labels)\n * createExecutionResultParser({\n * userCard: userCardProjection,\n * posts: postsProjection,\n * });\n * ```\n */\nexport const createColocateHelper = () => {\n /**\n * Colocate multiple field selections with labeled prefixes.\n *\n * @param entries - Object mapping labels to field selections\n * @returns Merged object of all prefixed field entries\n */\n const $colocate = <TEntries extends ColocatedEntries>(entries: TEntries): ColocatedFields<TEntries> =>\n Object.fromEntries(\n Object.entries(entries).flatMap(([label, fields]) =>\n Object.entries(fields).map(([key, value]) => [`${label}_${key}`, value] as const),\n ),\n ) as ColocatedFields<TEntries>;\n\n return $colocate;\n};\n\nexport type ColocateHelper = ReturnType<typeof createColocateHelper>;\n","/**\n * Promise detection utilities for cross-realm compatibility.\n * @module\n */\n\n/**\n * Check if a value is Promise-like (has .then method).\n *\n * This function uses duck typing instead of `instanceof Promise` to work across\n * VM sandbox boundaries where Promises created in a different realm have a\n * different constructor.\n *\n * @example\n * ```typescript\n * // Works with native Promises\n * isPromiseLike(Promise.resolve(42)); // true\n *\n * // Works with VM sandbox Promises (instanceof would fail)\n * const vmPromise = vm.runInContext(\"Promise.resolve(42)\", context);\n * isPromiseLike(vmPromise); // true (instanceof Promise would be false)\n *\n * // Rejects non-Promises\n * isPromiseLike({ then: \"not a function\" }); // false\n * isPromiseLike(null); // false\n * isPromiseLike(42); // false\n * ```\n */\nexport const isPromiseLike = <T>(value: unknown): value is PromiseLike<T> => {\n return value !== null && typeof value === \"object\" && \"then\" in value && typeof value.then === \"function\";\n};\n","import { isPromiseLike } from \"../../utils/promise\";\n\n/**\n * Context passed to the definition factory during evaluation.\n */\nexport type LazyEvaluatorContext = {\n canonicalId: string;\n};\n\n/**\n * Factory function that produces the definition value.\n * Can be sync or async.\n */\nexport type LazyDefinitionFactory<T> = (context: LazyEvaluatorContext | null) => T | Promise<T>;\n\n/**\n * Function that provides dependencies to evaluate before the main definition.\n */\nexport type LazyDependencyProvider<TDep> = () => TDep[];\n\n/**\n * Internal generator that handles the evaluation protocol.\n */\nexport type LazyEvaluatorExecutor<T> = (context: LazyEvaluatorContext | null) => Generator<Promise<void>, T, void>;\n\n/**\n * Creates a lazy evaluator with caching, async support, and dependency ordering.\n *\n * @param define - Factory function that produces the value\n * @param getDeps - Optional function returning dependencies to evaluate first\n * @param createDepGenerator - Function to create evaluation generator for a dependency\n * @returns An executor generator function\n */\nexport const createLazyEvaluator = <T, TDep>(\n define: LazyDefinitionFactory<T>,\n getDeps: LazyDependencyProvider<TDep> | undefined,\n createDepGenerator: (dep: TDep) => Generator<Promise<void>, void, void>,\n): LazyEvaluatorExecutor<T> => {\n let cache: { value: T } | null = null;\n let promise: Promise<void> | null = null;\n\n return function* execute(context: LazyEvaluatorContext | null): Generator<Promise<void>, T, void> {\n if (cache) {\n return cache.value;\n }\n\n if (promise) {\n yield promise;\n // biome-ignore lint/style/noNonNullAssertion: cache is guaranteed to be set after promise resolves\n return cache!.value;\n }\n\n if (getDeps) {\n // Need to evaluate the dependencies before the current element is evaluated.\n //\n // When dependencies is evaluated while the current element is being evaluated,\n // the evaluation method will be synchronous regardless of how the current builder\n // performs. If the dependencies need to be evaluated asynchronously, they throw an error.\n for (const dep of getDeps()) {\n yield* createDepGenerator(dep);\n }\n }\n\n const defined = define(context);\n // Use duck typing for VM sandbox compatibility (instanceof Promise fails for cross-realm Promises)\n if (!isPromiseLike(defined)) {\n return (cache = { value: defined }).value;\n }\n\n // Create a promise to resolve the value of the element asynchronously.\n // Yield the promise to make the builder process handle the asynchronous operation if it supports it.\n promise = defined.then((value) => {\n cache = { value };\n promise = null;\n });\n\n yield promise;\n // biome-ignore lint/style/noNonNullAssertion: cache is guaranteed to be set after promise resolves\n return cache!.value;\n };\n};\n\n/**\n * Creates an evaluation generator from an executor.\n * Wraps the executor's generator and discards its return value.\n */\nexport function* createEvaluationGenerator<T>(\n executor: LazyEvaluatorExecutor<T>,\n context: LazyEvaluatorContext | null,\n): Generator<Promise<void>, void, void> {\n yield* executor(context);\n}\n\n/**\n * Executes the evaluator synchronously.\n * Throws if async operation is encountered.\n */\nexport const evaluateSync = <T>(executor: LazyEvaluatorExecutor<T>, context: LazyEvaluatorContext | null): T => {\n const result = executor(context).next();\n\n if (!result.done) {\n throw new Error(\"Async operation is not supported in sync evaluation.\");\n }\n\n return result.value;\n};\n","import type { AttachmentShape, AttachmentsTupleToIntersection } from \"./attachment-types\";\nimport {\n createLazyEvaluator,\n type LazyEvaluatorContext,\n type LazyEvaluatorExecutor,\n createEvaluationGenerator as lazyCreateEvaluationGenerator,\n evaluateSync as lazyEvaluateSync,\n} from \"./lazy-evaluator\";\n\nconst GQL_ELEMENT_FACTORY = Symbol(\"GQL_ELEMENT_FACTORY\");\nconst GQL_ELEMENT_CONTEXT = Symbol(\"GQL_ELEMENT_CONTEXT\");\n\n/**\n * Context passed to element definition factories, containing the canonical ID.\n */\nexport type GqlElementContext = LazyEvaluatorContext;\n\n/**\n * Factory function that produces the element definition.\n * May be sync or async (async requires async build mode).\n */\nexport type GqlElementDefinitionFactory<T> = (context: GqlElementContext | null) => T | Promise<T>;\n\n/**\n * Configuration for attaching a computed property to an element.\n */\nexport type GqlElementAttachment<TElement extends object, TName extends string, TValue extends object> = {\n name: TName;\n createValue: (element: TElement) => TValue;\n};\n\n/**\n * Abstract base class for all GraphQL elements (Fragment, Operation).\n *\n * Uses lazy evaluation with caching - definition is computed on first access.\n * Subclasses should not be instantiated directly; use static `create` methods.\n *\n * @template TDefinition - The shape of the evaluated definition\n * @template TInfer - Type inference metadata (access via `$infer`)\n */\nexport abstract class GqlElement<TDefinition extends object, TInfer extends object> {\n /**\n * Type-only property for inference. Throws at runtime.\n * Use with `typeof element.$infer` to extract input/output types.\n */\n declare readonly $infer: TInfer;\n\n private [GQL_ELEMENT_FACTORY]: LazyEvaluatorExecutor<TDefinition>;\n private [GQL_ELEMENT_CONTEXT]: GqlElementContext | null = null;\n\n protected constructor(define: GqlElementDefinitionFactory<TDefinition>, getDeps?: () => GqlElement<any, any>[]) {\n this[GQL_ELEMENT_FACTORY] = createLazyEvaluator(define, getDeps, GqlElement.createEvaluationGenerator);\n\n Object.defineProperty(this, \"$infer\", {\n get() {\n throw new Error(\"This property is only for type meta. Do not access this property directly.\");\n },\n });\n }\n\n /**\n * Attaches lazily-computed properties to this element.\n * Properties are computed once on first access after evaluation.\n *\n * @example Single attachment\n * ```typescript\n * const fragment = gql.default(...)\n * .attach({ name: \"utils\", createValue: (el) => ({ ... }) });\n * ```\n *\n * @example Multiple attachments (use `as const` for full type inference)\n * ```typescript\n * const fragment = gql.default(...)\n * .attach([\n * { name: \"a\", createValue: () => ({ x: 1 }) },\n * { name: \"b\", createValue: () => ({ y: 2 }) },\n * ] as const);\n * ```\n */\n public attach<TName extends string, TValue extends object>(\n attachment: GqlElementAttachment<this, TName, TValue>,\n ): this & { [K in TName]: TValue };\n public attach<const TAttachments extends readonly AttachmentShape[]>(\n attachments: TAttachments,\n ): this & AttachmentsTupleToIntersection<TAttachments>;\n public attach<TName extends string, TValue extends object>(\n attachmentOrAttachments: GqlElementAttachment<this, TName, TValue> | readonly AttachmentShape[],\n ): this & { [K in TName]: TValue } {\n const attachments = Array.isArray(attachmentOrAttachments) ? attachmentOrAttachments : [attachmentOrAttachments];\n\n for (const attachment of attachments) {\n let cache: object | null = null;\n const self = this;\n\n Object.defineProperty(this, attachment.name, {\n get() {\n if (cache) {\n return cache;\n }\n\n GqlElement.evaluateInstantly(self);\n\n return (cache = attachment.createValue(self));\n },\n });\n }\n\n return this as this & { [K in TName]: TValue };\n }\n\n /**\n * Sets the canonical context for an element. Used by the builder.\n * @internal\n */\n static setContext<TElement extends GqlElement<any, any>>(element: TElement, context: GqlElementContext): void {\n element[GQL_ELEMENT_CONTEXT] = context;\n }\n\n /**\n * Gets the canonical context of an element, if set.\n * @internal\n */\n static getContext(element: GqlElement<any, any>): GqlElementContext | null {\n return element[GQL_ELEMENT_CONTEXT];\n }\n\n /**\n * Creates a generator for async evaluation. Used by the builder.\n * @internal\n */\n static createEvaluationGenerator(element: GqlElement<any, any>): Generator<Promise<void>, void, void> {\n return lazyCreateEvaluationGenerator(element[GQL_ELEMENT_FACTORY], element[GQL_ELEMENT_CONTEXT]);\n }\n\n private static evaluateInstantly<TValue extends object>(element: GqlElement<TValue, any>): TValue {\n return lazyEvaluateSync(element[GQL_ELEMENT_FACTORY], element[GQL_ELEMENT_CONTEXT]);\n }\n\n /**\n * Forces synchronous evaluation. Throws if async operation is needed.\n * @internal\n */\n static evaluateSync(element: GqlElement<any, any>): void {\n void GqlElement.evaluateInstantly(element);\n }\n\n /**\n * Evaluates and returns the element's definition.\n * Throws if async operation is needed.\n * @internal\n */\n static get<TValue extends object>(element: GqlElement<TValue, any>): TValue {\n return GqlElement.evaluateInstantly(element);\n }\n}\n","/**\n * Define element for storing arbitrary value factories.\n * @module\n */\n\nimport { isPromiseLike } from \"../../utils/promise\";\nimport { GqlElement, type GqlElementContext } from \"./gql-element\";\n\n/**\n * Type alias for any GqlDefine instance.\n */\nexport type AnyGqlDefine = GqlDefine<unknown>;\n\n/**\n * Type inference metadata for define elements.\n * Access via `typeof defineElement.$infer`.\n */\ntype DefineInferMeta<TValue> = {\n readonly value: TValue;\n};\n\ndeclare const __DEFINE_BRAND__: unique symbol;\n\n/**\n * Internal artifact shape produced by define evaluation.\n * @internal\n */\ntype DefineArtifact<TValue> = {\n readonly factoryResult: TValue;\n};\n\n/**\n * Represents a factory-based value definition.\n *\n * Define elements are created via `gql(({ define }) => define(() => value))`.\n * The factory is evaluated lazily and the result is cached.\n *\n * @template TValue - The type of value produced by the factory\n *\n * @example\n * ```typescript\n * // Store a primitive value\n * const myNumber = gql.default(({ define }) => define(() => 42));\n * console.log(myNumber.value); // 42\n *\n * // Store a plain object\n * const myConfig = gql.default(({ define }) => define(() => ({\n * apiUrl: \"https://api.example.com\",\n * timeout: 5000,\n * })));\n * console.log(myConfig.value.apiUrl); // \"https://api.example.com\"\n * ```\n */\nexport class GqlDefine<TValue> extends GqlElement<DefineArtifact<TValue>, DefineInferMeta<TValue>> {\n private declare readonly [__DEFINE_BRAND__]: void;\n\n private constructor(define: (context: GqlElementContext | null) => DefineArtifact<TValue> | Promise<DefineArtifact<TValue>>) {\n super(define);\n }\n\n /**\n * The evaluated value from the factory.\n * Triggers lazy evaluation on first access.\n */\n public get value(): TValue {\n return GqlElement.get(this).factoryResult;\n }\n\n /**\n * Creates a new GqlDefine instance.\n *\n * Prefer using the `gql(({ define }) => define(() => value))` API instead.\n *\n * @param factory - Function that produces the value. Can be sync or async.\n * @returns A new GqlDefine instance wrapping the factory result.\n *\n * @example\n * ```typescript\n * // Sync factory\n * const syncDefine = GqlDefine.create(() => 42);\n *\n * // Async factory\n * const asyncDefine = GqlDefine.create(async () => {\n * const data = await fetch('/api/config');\n * return data.json();\n * });\n * ```\n */\n static create<TValue>(factory: () => TValue | Promise<TValue>): GqlDefine<TValue> {\n return new GqlDefine((_context) => {\n const result = factory();\n // Handle async factories\n if (isPromiseLike<TValue>(result)) {\n return result.then((value) => ({ factoryResult: value }));\n }\n return { factoryResult: result as TValue };\n });\n }\n}\n","/**\n * Fragment types for reusable field selections.\n * @module\n */\n\nimport type { OptionalArg } from \"../../utils/empty-object\";\nimport type { AnyAssignableInput, AnyFieldsExtended, AssignableInputFromVarDefs, InferFieldsExtended } from \"../fragment\";\nimport type { AnyGraphqlSchema } from \"../schema\";\nimport type { VariableDefinitions } from \"../type-foundation\";\nimport { GqlElement } from \"./gql-element\";\n\n/**\n * Type alias for any Fragment instance.\n */\nexport type AnyFragment = Fragment<string, any, any, any>;\n\n/**\n * Type inference metadata for fragments.\n * Access via `typeof fragment.$infer`.\n */\nexport type FragmentInferMeta<TVariables, TOutput extends object> = {\n readonly input: TVariables;\n readonly output: TOutput;\n};\n\n/**\n * Internal artifact shape produced by fragment evaluation.\n * @internal\n */\ninterface FragmentArtifact<\n TTypeName extends string,\n TVariables extends Partial<AnyAssignableInput> | void,\n TFields extends Partial<AnyFieldsExtended>,\n> {\n readonly typename: TTypeName;\n readonly key: string | undefined;\n readonly schemaLabel: string;\n readonly variableDefinitions: VariableDefinitions;\n readonly spread: (...args: TVariables extends void ? [] : [variables: TVariables]) => TFields;\n}\n\ndeclare const __FRAGMENT_BRAND__: unique symbol;\n\n/**\n * Represents a reusable GraphQL field selection on a specific type.\n *\n * Fragments are created via `gql(({ fragment }) => fragment(\"Name\", \"TypeName\")\\`{ ... }\\`())`.\n * Use `spread()` to include the fragment's fields in an operation.\n *\n * @template TTypeName - The GraphQL type this fragment selects from\n * @template TVariables - Variables required when spreading\n * @template TFields - The selected fields structure\n * @template TOutput - Inferred output type from selected fields\n */\nexport class Fragment<\n TTypeName extends string,\n TVariables extends Partial<AnyAssignableInput> | void,\n TFields extends Partial<AnyFieldsExtended>,\n TOutput extends object,\n >\n extends GqlElement<FragmentArtifact<TTypeName, TVariables, TFields>, FragmentInferMeta<TVariables, TOutput>>\n implements FragmentArtifact<TTypeName, TVariables, TFields>\n{\n private declare readonly [__FRAGMENT_BRAND__]: void;\n\n private constructor(define: () => FragmentArtifact<TTypeName, TVariables, TFields>) {\n super(define);\n }\n\n /** The GraphQL type name this fragment selects from. */\n public get typename() {\n return GqlElement.get(this).typename;\n }\n\n /** Optional unique key for prebuilt type lookup. */\n public get key() {\n return GqlElement.get(this).key;\n }\n\n /** The schema label this fragment belongs to. */\n public get schemaLabel() {\n return GqlElement.get(this).schemaLabel;\n }\n\n /** Variable definitions for this fragment. */\n public get variableDefinitions() {\n return GqlElement.get(this).variableDefinitions;\n }\n\n /**\n * Spreads this fragment's fields into a parent selection.\n * Pass variables if the fragment defines any.\n */\n public get spread() {\n return GqlElement.get(this).spread;\n }\n\n /**\n * Creates a new Fragment instance.\n * Prefer using the `gql(({ fragment }) => ...)` API instead.\n * @internal\n */\n static create<\n TSchema extends AnyGraphqlSchema,\n TTypeName extends keyof TSchema[\"object\"] & string,\n TVariableDefinitions extends VariableDefinitions,\n TFields extends AnyFieldsExtended,\n >(\n define: () => {\n typename: TTypeName;\n key: string | undefined;\n schemaLabel: TSchema[\"label\"];\n variableDefinitions: TVariableDefinitions;\n spread: (\n ...args: OptionalArg<AssignableInputFromVarDefs<TSchema, TVariableDefinitions>> extends void\n ? []\n : [variables: OptionalArg<AssignableInputFromVarDefs<TSchema, TVariableDefinitions>>]\n ) => TFields;\n },\n ) {\n type Fields = TFields & { [key: symbol]: never };\n type Output = InferFieldsExtended<TSchema, TTypeName, TFields> & { [key: symbol]: never };\n type Variables = OptionalArg<AssignableInputFromVarDefs<TSchema, TVariableDefinitions>>;\n\n return new Fragment<TTypeName, Variables, Fields, Output>(define as () => FragmentArtifact<TTypeName, Variables, Fields>);\n }\n}\n","/**\n * Operation types for GraphQL queries, mutations, and subscriptions.\n * @module\n */\n\nimport type { TypedDocumentNode } from \"@graphql-typed-document-node/core\";\nimport type { AnyFieldsExtended, InferFieldsExtended } from \"../fragment\";\nimport type { AnyGraphqlSchema, ConstAssignableInputFromVarDefs, OperationType } from \"../schema\";\nimport type { VariableDefinitions } from \"../type-foundation\";\nimport { GqlElement, type GqlElementContext } from \"./gql-element\";\n\n/**\n * Type alias for any Operation instance.\n */\nexport type AnyOperation = AnyOperationOf<\"query\"> | AnyOperationOf<\"mutation\"> | AnyOperationOf<\"subscription\">;\n\n/**\n * Type alias for an Operation of a specific type.\n */\nexport type AnyOperationOf<TOperationType extends OperationType> = Operation<TOperationType, string, string[], any, any, any>;\n\n/**\n * Type inference metadata for operations.\n * Access via `typeof operation.$infer`.\n */\nexport type OperationInferMeta<TVariables, TData extends object> = {\n readonly input: TVariables;\n readonly output: TData;\n};\n\ndeclare const __OPERATION_BRAND__: unique symbol;\n\n/**\n * Internal artifact shape produced by operation evaluation.\n * @internal\n */\ntype OperationArtifact<\n TOperationType extends OperationType,\n TOperationName extends string,\n TVariableNames extends string[],\n TVariables extends Record<string, unknown>,\n TFields extends Partial<AnyFieldsExtended>,\n TData extends object,\n> = {\n readonly operationType: TOperationType;\n readonly operationName: TOperationName;\n readonly schemaLabel: string;\n readonly variableNames: TVariableNames;\n readonly documentSource: () => TFields;\n readonly document: TypedDocumentNode<TData, TVariables>;\n readonly metadata?: unknown;\n};\n\n/**\n * Represents a GraphQL operation (query, mutation, or subscription).\n *\n * Operations are created via `gql(({ query }) => query(\"Name\")\\`{ ... }\\`())`.\n * Produces a TypedDocumentNode for type-safe execution with GraphQL clients.\n *\n * @template TOperationType - 'query' | 'mutation' | 'subscription'\n * @template TOperationName - The unique operation name\n * @template TVariableNames - Tuple of variable names\n * @template TVariables - Variable types for the operation\n * @template TFields - Selected fields structure\n * @template TData - Inferred response data type\n */\nexport class Operation<\n TOperationType extends OperationType,\n TOperationName extends string,\n TVariableNames extends string[],\n TVariables extends Record<string, unknown>,\n TFields extends Partial<AnyFieldsExtended>,\n TData extends object,\n >\n extends GqlElement<\n OperationArtifact<TOperationType, TOperationName, TVariableNames, TVariables, TFields, TData>,\n OperationInferMeta<TVariables, TData>\n >\n implements OperationArtifact<TOperationType, TOperationName, TVariableNames, TVariables, TFields, TData>\n{\n private declare readonly [__OPERATION_BRAND__]: void;\n\n private constructor(\n define: (\n context: GqlElementContext | null,\n ) =>\n | OperationArtifact<TOperationType, TOperationName, TVariableNames, TVariables, TFields, TData>\n | Promise<OperationArtifact<TOperationType, TOperationName, TVariableNames, TVariables, TFields, TData>>,\n ) {\n super(define);\n }\n\n /** The operation type: 'query', 'mutation', or 'subscription'. */\n public get operationType() {\n return GqlElement.get(this).operationType;\n }\n\n /** The unique name of this operation. */\n public get operationName() {\n return GqlElement.get(this).operationName;\n }\n\n /** The schema label this operation belongs to. */\n public get schemaLabel() {\n return GqlElement.get(this).schemaLabel;\n }\n\n /** List of variable names defined for this operation. */\n public get variableNames() {\n return GqlElement.get(this).variableNames;\n }\n\n /**\n * Returns the field selections. Used for document reconstruction.\n * @internal\n */\n public get documentSource() {\n return GqlElement.get(this).documentSource;\n }\n\n /** The TypedDocumentNode for use with GraphQL clients. */\n public get document() {\n return GqlElement.get(this).document;\n }\n\n /** Custom metadata attached to this operation, if any. */\n public get metadata() {\n return GqlElement.get(this).metadata;\n }\n\n /**\n * Creates a new Operation instance.\n * Prefer using the `gql(({ query }) => ...)` API instead.\n * @internal\n */\n static create<\n TSchema extends AnyGraphqlSchema,\n TOperationType extends OperationType,\n TOperationName extends string,\n TVariableDefinitions extends VariableDefinitions,\n TFields extends AnyFieldsExtended,\n >(\n define: (context: GqlElementContext | null) =>\n | {\n operationType: TOperationType;\n operationName: TOperationName;\n schemaLabel: TSchema[\"label\"];\n variableNames: (keyof TVariableDefinitions & string)[];\n documentSource: () => TFields;\n document: TypedDocumentNode<\n InferFieldsExtended<TSchema, TSchema[\"operations\"][TOperationType] & keyof TSchema[\"object\"] & string, TFields>,\n ConstAssignableInputFromVarDefs<TSchema, TVariableDefinitions>\n >;\n metadata?: unknown;\n }\n | Promise<{\n operationType: TOperationType;\n operationName: TOperationName;\n schemaLabel: TSchema[\"label\"];\n variableNames: (keyof TVariableDefinitions & string)[];\n documentSource: () => TFields;\n document: TypedDocumentNode<\n InferFieldsExtended<TSchema, TSchema[\"operations\"][TOperationType] & keyof TSchema[\"object\"] & string, TFields>,\n ConstAssignableInputFromVarDefs<TSchema, TVariableDefinitions>\n >;\n metadata?: unknown;\n }>,\n ) {\n return new Operation(define);\n }\n}\n","/**\n * Compat tagged template function for creating deferred GraphQL operation specs.\n * @module\n */\n\nimport { Kind, parse as parseGraphql } from \"graphql\";\nimport { GqlDefine } from \"../types/element\";\nimport type { TemplateCompatSpec } from \"../types/element/compat-spec\";\nimport type { AnyGraphqlSchema, OperationType } from \"../types/schema\";\n\n/** Tagged template function type for compat operations. */\nexport type CompatTaggedTemplate = (strings: TemplateStringsArray, ...values: never[]) => GqlDefine<TemplateCompatSpec>;\n\n/** Curried compat function type: query.compat(\"name\")`{ fields }` */\nexport type CurriedCompatFunction = (operationName: string) => CompatTaggedTemplate;\n\n/**\n * Creates a curried tagged template function for compat mode operations.\n * New API: `query.compat(\"name\")\\`($vars) { fields }\\`` returns GqlDefine<TemplateCompatSpec>.\n *\n * @param schema - The GraphQL schema definition\n * @param operationType - The operation type (query, mutation, subscription)\n */\nexport const createCompatTaggedTemplate = <TSchema extends AnyGraphqlSchema>(\n schema: TSchema,\n operationType: OperationType,\n): CurriedCompatFunction => {\n const operationTypeName = schema.operations[operationType];\n if (operationTypeName === null) {\n throw new Error(`Operation type ${operationType} is not defined in schema roots`);\n }\n\n return (operationName: string): CompatTaggedTemplate => {\n return (strings: TemplateStringsArray, ...values: never[]): GqlDefine<TemplateCompatSpec> => {\n if (values.length > 0) {\n throw new Error(\"Tagged templates must not contain interpolated expressions\");\n }\n\n const body = strings[0] ?? \"\";\n\n // Construct synthetic GraphQL source from JS args and template body\n const source = `${operationType} ${operationName} ${body.trim()}`;\n\n let document: import(\"graphql\").DocumentNode;\n try {\n document = parseGraphql(source);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`GraphQL parse error in tagged template: ${message}`);\n }\n\n const opDefs = document.definitions.filter((def) => def.kind === Kind.OPERATION_DEFINITION);\n if (opDefs.length !== 1) {\n throw new Error(`Internal error: expected exactly one operation definition in synthesized source`);\n }\n\n // biome-ignore lint/style/noNonNullAssertion: Length checked above\n const opNode = opDefs[0]!;\n if (opNode.kind !== Kind.OPERATION_DEFINITION) {\n throw new Error(\"Unexpected definition kind\");\n }\n\n return GqlDefine.create(() => ({\n schema,\n operationType,\n operationName,\n graphqlSource: source,\n }));\n };\n };\n};\n","/**\n * Directive builder utilities for creating field-level directives.\n *\n * Provides type-safe methods for creating directive references that can be\n * applied to field selections. The builder follows a similar pattern to\n * the variable builder ($var).\n *\n * @module\n */\n\nimport {\n type AnyDirectiveRef,\n type DirectiveArgumentSpecifier,\n type DirectiveLocation,\n DirectiveRef,\n} from \"../types/type-foundation/directive-ref\";\nimport type { AnyVarRef } from \"../types/type-foundation/var-ref\";\n\n/**\n * A method that creates a DirectiveRef with specific type information.\n * The TArgs type defines the expected argument shape for the directive.\n */\nexport type DirectiveMethod<TDirectiveName extends string, TLocations extends readonly DirectiveLocation[], TArgs> = (\n args: TArgs,\n) => DirectiveRef<{\n directiveName: TDirectiveName;\n locations: TLocations;\n}>;\n\n/**\n * Type for directive arguments that can include VarRef values.\n * This allows using variables in directive arguments like `{ if: $.shouldSkip }`.\n */\nexport type DirectiveArgValue = boolean | string | number | null | AnyVarRef;\n\n/**\n * Standard GraphQL directives that are always available.\n */\nexport type StandardDirectives = {\n /**\n * @skip directive - conditionally skip a field.\n * @example\n * ```typescript\n * f.email({}, { directives: [$dir.skip({ if: $.hideEmail })] })\n * ```\n */\n skip: DirectiveMethod<\"skip\", readonly [\"FIELD\", \"FRAGMENT_SPREAD\", \"INLINE_FRAGMENT\"], { if: DirectiveArgValue }>;\n\n /**\n * @include directive - conditionally include a field.\n * @example\n * ```typescript\n * f.email({}, { directives: [$dir.include({ if: $.showEmail })] })\n * ```\n */\n include: DirectiveMethod<\"include\", readonly [\"FIELD\", \"FRAGMENT_SPREAD\", \"INLINE_FRAGMENT\"], { if: DirectiveArgValue }>;\n};\n\n/**\n * Creates a directive method factory for a specific directive.\n *\n * @param name - The directive name (without @)\n * @param locations - Valid locations where the directive can be applied\n * @returns A function that creates DirectiveRef instances\n *\n * @example\n * ```typescript\n * const skipMethod = createDirectiveMethod(\"skip\", [\"FIELD\", \"FRAGMENT_SPREAD\", \"INLINE_FRAGMENT\"] as const);\n * const skipDirective = skipMethod({ if: true });\n * ```\n */\nexport const createDirectiveMethod = <TDirectiveName extends string, const TLocations extends readonly DirectiveLocation[]>(\n name: TDirectiveName,\n locations: TLocations,\n): (<TArgs extends Record<string, unknown>>(\n args: TArgs,\n) => DirectiveRef<{\n directiveName: TDirectiveName;\n locations: TLocations;\n}>) => {\n return (args) =>\n new DirectiveRef({\n name,\n arguments: args,\n locations,\n }) as DirectiveRef<{\n directiveName: TDirectiveName;\n locations: TLocations;\n }>;\n};\n\n/**\n * Type for directive argument specifiers.\n * Maps argument names to their type information.\n */\nexport type DirectiveArgumentSpecifiers = {\n readonly [argName: string]: DirectiveArgumentSpecifier;\n};\n\n/**\n * Creates a typed directive method with argument type specifiers.\n * Enables enum value output in directive arguments.\n *\n * @param name - The directive name (without @)\n * @param locations - Valid locations where the directive can be applied\n * @param argSpecs - Type specifiers for directive arguments (deferred string format)\n * @returns A function that creates DirectiveRef instances with argument type info\n *\n * @example\n * ```typescript\n * const authMethod = createTypedDirectiveMethod(\n * \"auth\",\n * [\"FIELD\"] as const,\n * { role: \"e|Role|!\" }\n * );\n * const authDirective = authMethod({ role: \"ADMIN\" });\n * ```\n */\nexport const createTypedDirectiveMethod = <\n TDirectiveName extends string,\n const TLocations extends readonly DirectiveLocation[],\n const TArgSpecs extends DirectiveArgumentSpecifiers,\n>(\n name: TDirectiveName,\n locations: TLocations,\n argSpecs: TArgSpecs,\n): (<TArgs extends Record<string, unknown>>(\n args: TArgs,\n) => DirectiveRef<{\n directiveName: TDirectiveName;\n locations: TLocations;\n}>) => {\n return (args) =>\n new DirectiveRef({\n name,\n arguments: args,\n locations,\n argumentSpecs: argSpecs,\n }) as DirectiveRef<{\n directiveName: TDirectiveName;\n locations: TLocations;\n }>;\n};\n\n/**\n * Standard directive locations for @skip and @include.\n */\nconst CONDITIONAL_DIRECTIVE_LOCATIONS = [\"FIELD\", \"FRAGMENT_SPREAD\", \"INLINE_FRAGMENT\"] as const;\n\n/**\n * Creates the standard GraphQL directives (@skip, @include).\n * These are always available regardless of schema definition.\n *\n * @returns Object containing skip and include directive methods\n *\n * @example\n * ```typescript\n * const $dir = createStandardDirectives();\n * const skipDirective = $dir.skip({ if: true });\n * ```\n */\nexport const createStandardDirectives = (): StandardDirectives => ({\n skip: createDirectiveMethod(\"skip\", CONDITIONAL_DIRECTIVE_LOCATIONS),\n include: createDirectiveMethod(\"include\", CONDITIONAL_DIRECTIVE_LOCATIONS),\n});\n\n/**\n * Type for any directive method (type-erased).\n */\n// biome-ignore lint/suspicious/noExplicitAny: intentionally erased for flexibility\nexport type AnyDirectiveMethod = (args: any) => AnyDirectiveRef;\n\n/**\n * Type for the directive builder that includes standard directives\n * and can be extended with schema-specific directives.\n */\nexport type DirectiveBuilder<TCustomDirectives extends Record<string, AnyDirectiveMethod> = {}> = StandardDirectives &\n TCustomDirectives;\n\n/**\n * Creates a directive builder with standard directives and optional custom directives.\n *\n * @param customDirectives - Additional directive methods from schema (generated by codegen)\n * @returns Combined directive builder with all available directives\n *\n * @internal Used by codegen to create schema-specific directive builders\n */\nexport const createDirectiveBuilder = <TCustomDirectives extends Record<string, AnyDirectiveMethod> = {}>(\n customDirectives?: TCustomDirectives,\n): DirectiveBuilder<TCustomDirectives> => {\n return {\n ...createStandardDirectives(),\n ...(customDirectives ?? ({} as TCustomDirectives)),\n };\n};\n\n/**\n * Type guard to check if a value is a DirectiveRef.\n *\n * @param value - Value to check\n * @returns True if value is a DirectiveRef instance\n */\nexport const isDirectiveRef = (value: unknown): value is AnyDirectiveRef => {\n return value instanceof DirectiveRef;\n};\n","/**\n * Preprocessor for Fragment Arguments RFC syntax.\n *\n * Strips fragment argument declarations and spread arguments by replacing\n * them with equal-length whitespace to preserve line/column alignment.\n *\n * @module\n */\n\n/** Result of fragment arguments preprocessing. */\nexport type PreprocessResult = {\n /** Content with Fragment Arguments syntax replaced by whitespace. */\n readonly preprocessed: string;\n /** Whether any preprocessing was applied. */\n readonly modified: boolean;\n};\n\n/**\n * Find the matching closing parenthesis for a balanced group.\n * Handles nested parentheses, string literals, and comments.\n * Returns the index of the closing ')' or -1 if not found.\n */\nexport const findMatchingParen = (content: string, openIndex: number): number => {\n let depth = 1;\n let inString: false | '\"' | \"'\" = false;\n\n for (let i = openIndex + 1; i < content.length; i++) {\n // biome-ignore lint/style/noNonNullAssertion: Loop index is within bounds\n const ch = content[i]!;\n\n if (inString) {\n if (ch === inString) {\n let backslashes = 0;\n for (let j = i - 1; j >= 0 && content[j] === \"\\\\\"; j--) {\n backslashes++;\n }\n if (backslashes % 2 === 0) {\n inString = false;\n }\n }\n continue;\n }\n\n if (ch === '\"' || ch === \"'\") {\n inString = ch;\n continue;\n }\n\n if (ch === \"(\") {\n depth++;\n } else if (ch === \")\") {\n depth--;\n if (depth === 0) {\n return i;\n }\n }\n }\n\n return -1;\n};\n\n/**\n * Replace a range [start, end] (inclusive) with spaces, preserving newlines.\n */\nconst replaceWithSpaces = (content: string, start: number, end: number): string => {\n let result = content.slice(0, start);\n for (let i = start; i <= end; i++) {\n result += content[i] === \"\\n\" ? \"\\n\" : \" \";\n }\n result += content.slice(end + 1);\n return result;\n};\n\n// Pattern: fragment Name( at word boundary, not followed by \"on\"\nconst FRAGMENT_DEF_PATTERN = /\\bfragment\\s+(\\w+)\\s*\\(/g;\n\n// Pattern: ...FragmentName(\nconst FRAGMENT_SPREAD_PATTERN = /\\.\\.\\.(\\w+)\\s*\\(/g;\n\n/**\n * Preprocess Fragment Arguments RFC syntax by replacing argument lists with spaces.\n *\n * Transforms:\n * - `fragment UserProfile($showEmail: Boolean = false) on User` -> `fragment UserProfile on User`\n * - `...UserProfile(showEmail: true)` -> `...UserProfile `\n */\nexport const preprocessFragmentArgs = (content: string): PreprocessResult => {\n let result = content;\n let modified = false;\n\n // Pass 1: Fragment definition arguments\n // Match \"fragment Name(\" and find the matching \")\" to strip\n let match: RegExpExecArray | null;\n FRAGMENT_DEF_PATTERN.lastIndex = 0;\n while ((match = FRAGMENT_DEF_PATTERN.exec(result)) !== null) {\n const openParenIndex = match.index + match[0].length - 1;\n\n // Check that the next non-whitespace after \")\" is \"on\" (to distinguish from non-fragment-args parens)\n const closeParenIndex = findMatchingParen(result, openParenIndex);\n if (closeParenIndex === -1) {\n continue;\n }\n\n // Verify this is a fragment definition (followed by \"on\")\n const afterParen = result.slice(closeParenIndex + 1).trimStart();\n if (!afterParen.startsWith(\"on\")) {\n continue;\n }\n\n result = replaceWithSpaces(result, openParenIndex, closeParenIndex);\n modified = true;\n // Reset regex since we modified the string (positions may shift)\n FRAGMENT_DEF_PATTERN.lastIndex = 0;\n }\n\n // Pass 2: Fragment spread arguments\n FRAGMENT_SPREAD_PATTERN.lastIndex = 0;\n while ((match = FRAGMENT_SPREAD_PATTERN.exec(result)) !== null) {\n const openParenIndex = match.index + match[0].length - 1;\n const closeParenIndex = findMatchingParen(result, openParenIndex);\n if (closeParenIndex === -1) {\n continue;\n }\n\n result = replaceWithSpaces(result, openParenIndex, closeParenIndex);\n modified = true;\n FRAGMENT_SPREAD_PATTERN.lastIndex = 0;\n }\n\n return { preprocessed: result, modified };\n};\n","/**\n * Self-contained Result type for GraphQL parser utilities.\n * Avoids neverthrow dependency in @soda-gql/core.\n * @module\n */\n\n/** Discriminated union: ok=true carries value, ok=false carries error */\nexport type Result<T, E> = OkResult<T> | ErrResult<E>;\n\nexport type OkResult<T> = {\n readonly ok: true;\n readonly value: T;\n};\n\nexport type ErrResult<E> = {\n readonly ok: false;\n readonly error: E;\n};\n\n/** Create a successful Result */\nexport const ok = <T>(value: T): OkResult<T> => ({\n ok: true,\n value,\n});\n\n/** Create a failed Result */\nexport const err = <E>(error: E): ErrResult<E> => ({\n ok: false,\n error,\n});\n","/**\n * GraphQL parser utilities.\n * Extracts operations and fragments from GraphQL source strings.\n * @module\n */\n\nimport {\n type ArgumentNode,\n type DocumentNode,\n type FieldNode,\n type FragmentDefinitionNode,\n type FragmentSpreadNode,\n type InlineFragmentNode,\n Kind,\n type OperationDefinitionNode,\n parse,\n type SelectionNode,\n type TypeNode,\n type ValueNode,\n type VariableDefinitionNode,\n} from \"graphql\";\nimport { err, ok, type Result } from \"./result\";\n\nimport type {\n GraphqlAnalysisError,\n ParsedArgument,\n ParsedFieldSelection,\n ParsedFragment,\n ParsedFragmentSpread,\n ParsedInlineFragment,\n ParsedOperation,\n ParsedSelection,\n ParsedValue,\n ParsedVariable,\n ParseResult,\n TypeInfo,\n} from \"./types\";\n\n/** Parse GraphQL source string directly. No file I/O. */\nexport const parseGraphqlSource = (source: string, sourceFile: string): Result<ParseResult, GraphqlAnalysisError> => {\n try {\n const document = parse(source);\n return ok({ document, ...extractFromDocument(document, sourceFile) });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return err({\n code: \"GRAPHQL_PARSE_ERROR\",\n message: `GraphQL parse error: ${message}`,\n filePath: sourceFile,\n });\n }\n};\n\n/**\n * Parse a GraphQL TypeNode into type name and modifier.\n *\n * Format: inner nullability + list modifiers\n * - Inner: `!` (non-null) or `?` (nullable)\n * - List: `[]!` (non-null list) or `[]?` (nullable list)\n */\nexport const parseTypeNode = (node: TypeNode): TypeInfo => {\n type TypeLevel = { kind: \"list\" | \"named\"; nonNull: boolean };\n const levels: TypeLevel[] = [];\n\n const collect = (n: TypeNode, nonNull: boolean): string => {\n if (n.kind === Kind.NON_NULL_TYPE) {\n return collect(n.type, true);\n }\n if (n.kind === Kind.LIST_TYPE) {\n levels.push({ kind: \"list\", nonNull });\n return collect(n.type, false);\n }\n levels.push({ kind: \"named\", nonNull });\n return n.name.value;\n };\n\n const typeName = collect(node, false);\n\n // Build modifier from levels (reverse order)\n let modifier = \"?\";\n for (const level of levels.slice().reverse()) {\n if (level.kind === \"named\") {\n modifier = level.nonNull ? \"!\" : \"?\";\n continue;\n }\n const listSuffix = level.nonNull ? \"[]!\" : \"[]?\";\n modifier = `${modifier}${listSuffix}`;\n }\n\n return { typeName, modifier };\n};\n\n/** Extract operations and fragments from a parsed GraphQL document. */\nconst extractFromDocument = (\n document: DocumentNode,\n sourceFile: string,\n): { operations: ParsedOperation[]; fragments: ParsedFragment[] } => {\n const operations: ParsedOperation[] = [];\n const fragments: ParsedFragment[] = [];\n\n for (const definition of document.definitions) {\n if (definition.kind === Kind.OPERATION_DEFINITION) {\n const operation = extractOperation(definition, sourceFile);\n if (operation) {\n operations.push(operation);\n }\n } else if (definition.kind === Kind.FRAGMENT_DEFINITION) {\n fragments.push(extractFragment(definition, sourceFile));\n }\n }\n\n return { operations, fragments };\n};\n\n/** Extract a single operation from an OperationDefinitionNode. */\nconst extractOperation = (node: OperationDefinitionNode, sourceFile: string): ParsedOperation | null => {\n if (!node.name) {\n return null;\n }\n\n const variables: ParsedVariable[] = (node.variableDefinitions ?? []).map(extractVariable);\n const selections = extractSelections(node.selectionSet.selections);\n\n return {\n kind: node.operation,\n name: node.name.value,\n variables,\n selections,\n sourceFile,\n };\n};\n\n/** Extract a fragment from a FragmentDefinitionNode. */\nconst extractFragment = (node: FragmentDefinitionNode, sourceFile: string): ParsedFragment => {\n const selections = extractSelections(node.selectionSet.selections);\n\n return {\n name: node.name.value,\n onType: node.typeCondition.name.value,\n selections,\n sourceFile,\n };\n};\n\n/** Extract a variable definition. */\nconst extractVariable = (node: VariableDefinitionNode): ParsedVariable => {\n const { typeName, modifier } = parseTypeNode(node.type);\n const defaultValue = node.defaultValue ? extractValue(node.defaultValue) : undefined;\n\n return {\n name: node.variable.name.value,\n typeName,\n modifier,\n typeKind: \"scalar\",\n defaultValue,\n };\n};\n\n/** Extract selections from a SelectionSet. */\nconst extractSelections = (selections: readonly SelectionNode[]): ParsedSelection[] => {\n return selections.map(extractSelection);\n};\n\n/** Extract a single selection. */\nconst extractSelection = (node: SelectionNode): ParsedSelection => {\n switch (node.kind) {\n case Kind.FIELD:\n return extractFieldSelection(node);\n case Kind.FRAGMENT_SPREAD:\n return extractFragmentSpread(node);\n case Kind.INLINE_FRAGMENT:\n return extractInlineFragment(node);\n }\n};\n\n/** Extract a field selection. */\nconst extractFieldSelection = (node: FieldNode): ParsedFieldSelection => {\n const args = node.arguments?.length ? node.arguments.map(extractArgument) : undefined;\n const selections = node.selectionSet ? extractSelections(node.selectionSet.selections) : undefined;\n\n return {\n kind: \"field\",\n name: node.name.value,\n alias: node.alias?.value,\n arguments: args,\n selections,\n };\n};\n\n/** Extract a fragment spread. */\nconst extractFragmentSpread = (node: FragmentSpreadNode): ParsedFragmentSpread => {\n return {\n kind: \"fragmentSpread\",\n name: node.name.value,\n };\n};\n\n/** Extract an inline fragment. */\nconst extractInlineFragment = (node: InlineFragmentNode): ParsedInlineFragment => {\n return {\n kind: \"inlineFragment\",\n onType: node.typeCondition?.name.value ?? \"\",\n selections: extractSelections(node.selectionSet.selections),\n };\n};\n\n/** Extract an argument. */\nconst extractArgument = (node: ArgumentNode): ParsedArgument => {\n return {\n name: node.name.value,\n value: extractValue(node.value),\n };\n};\n\n/** Assert unreachable code path (for exhaustiveness checks). */\nconst assertUnreachable = (value: never): never => {\n throw new Error(`Unexpected value: ${JSON.stringify(value)}`);\n};\n\n/** Extract a value (literal or variable reference). */\nconst extractValue = (node: ValueNode): ParsedValue => {\n switch (node.kind) {\n case Kind.VARIABLE:\n return { kind: \"variable\", name: node.name.value };\n case Kind.INT:\n return { kind: \"int\", value: node.value };\n case Kind.FLOAT:\n return { kind: \"float\", value: node.value };\n case Kind.STRING:\n return { kind: \"string\", value: node.value };\n case Kind.BOOLEAN:\n return { kind: \"boolean\", value: node.value };\n case Kind.NULL:\n return { kind: \"null\" };\n case Kind.ENUM:\n return { kind: \"enum\", value: node.value };\n case Kind.LIST:\n return { kind: \"list\", values: node.values.map(extractValue) };\n case Kind.OBJECT:\n return {\n kind: \"object\",\n fields: node.fields.map((field) => ({\n name: field.name.value,\n value: extractValue(field.value),\n })),\n };\n default:\n return assertUnreachable(node);\n }\n};\n","/**\n * Adapter to create a minimal SchemaIndex from AnyGraphqlSchema.\n * Only name-level Maps are populated (.has() lookups work).\n * Field-level data is NOT populated.\n * @module\n */\n\nimport type { AnyGraphqlSchema } from \"../types/schema/schema\";\nimport type { SchemaIndex } from \"./schema-index\";\n\n/**\n * Create a minimal SchemaIndex from AnyGraphqlSchema.\n *\n * IMPORTANT: This adapter produces a \"name-resolution only\" SchemaIndex.\n * Only the name-level Maps are populated (.has() lookups work).\n * Field-level data (FieldDefinitionNode, InputValueDefinitionNode, etc.)\n * is NOT populated -- those Maps are empty.\n *\n * Use this when you need SchemaIndex for type kind resolution only\n * (e.g., buildVarSpecifier). For full SchemaIndex with field-level data,\n * use createSchemaIndex(DocumentNode) from schema-index.ts.\n */\nexport const createSchemaIndexFromSchema = (schema: AnyGraphqlSchema): SchemaIndex => {\n const scalars: SchemaIndex[\"scalars\"] = new Map(Object.keys(schema.scalar).map((n) => [n, { name: n, directives: [] }]));\n const enums: SchemaIndex[\"enums\"] = new Map(\n Object.keys(schema.enum).map((n) => [n, { name: n, values: new Map(), directives: [] }]),\n );\n const inputs: SchemaIndex[\"inputs\"] = new Map(\n Object.keys(schema.input).map((n) => [n, { name: n, fields: new Map(), directives: [] }]),\n );\n const objects: SchemaIndex[\"objects\"] = new Map(\n Object.keys(schema.object).map((n) => [n, { name: n, fields: new Map(), directives: [] }]),\n );\n const unions: SchemaIndex[\"unions\"] = new Map(\n Object.keys(schema.union).map((n) => [n, { name: n, members: new Map(), directives: [] }]),\n );\n\n return {\n objects,\n inputs,\n enums,\n unions,\n scalars,\n directives: new Map(),\n operationTypes: {\n query: schema.operations.query ?? undefined,\n mutation: schema.operations.mutation ?? undefined,\n subscription: schema.operations.subscription ?? undefined,\n },\n };\n};\n","/**\n * SchemaIndex type and factory for building a schema index from a GraphQL DocumentNode.\n * Extracted from packages/codegen/src/generator.ts for shared use.\n * @module\n */\n\nimport type {\n ConstDirectiveNode,\n DocumentNode,\n EnumValueDefinitionNode,\n FieldDefinitionNode,\n InputValueDefinitionNode,\n NamedTypeNode,\n SchemaDefinitionNode,\n SchemaExtensionNode,\n} from \"graphql\";\nimport { Kind } from \"graphql\";\n\nexport type OperationTypeNames = {\n query?: string;\n mutation?: string;\n subscription?: string;\n};\n\nexport type ObjectRecord = {\n readonly name: string;\n readonly fields: Map<string, FieldDefinitionNode>;\n directives: ConstDirectiveNode[];\n};\n\nexport type InputRecord = {\n readonly name: string;\n readonly fields: Map<string, InputValueDefinitionNode>;\n directives: ConstDirectiveNode[];\n};\n\nexport type EnumRecord = {\n readonly name: string;\n readonly values: Map<string, EnumValueDefinitionNode>;\n directives: ConstDirectiveNode[];\n};\n\nexport type UnionRecord = {\n readonly name: string;\n readonly members: Map<string, NamedTypeNode>;\n directives: ConstDirectiveNode[];\n};\n\nexport type ScalarRecord = {\n readonly name: string;\n directives: ConstDirectiveNode[];\n};\n\nexport type DirectiveRecord = {\n readonly name: string;\n readonly locations: readonly string[];\n readonly args: Map<string, InputValueDefinitionNode>;\n readonly isRepeatable: boolean;\n};\n\nexport type SchemaIndex = {\n readonly objects: Map<string, ObjectRecord>;\n readonly inputs: Map<string, InputRecord>;\n readonly enums: Map<string, EnumRecord>;\n readonly unions: Map<string, UnionRecord>;\n readonly scalars: Map<string, ScalarRecord>;\n readonly directives: Map<string, DirectiveRecord>;\n readonly operationTypes: OperationTypeNames;\n};\n\nconst ensureRecord = <T>(collection: Map<string, T>, key: string, factory: (name: string) => T): T => {\n const existing = collection.get(key);\n if (existing) {\n return existing;\n }\n const created = factory(key);\n collection.set(key, created);\n return created;\n};\n\nconst addObjectFields = (target: Map<string, FieldDefinitionNode>, fields: readonly FieldDefinitionNode[] | undefined): void => {\n if (!fields) return;\n for (const field of fields) {\n target.set(field.name.value, field);\n }\n};\n\nconst addInputFields = (\n target: Map<string, InputValueDefinitionNode>,\n fields: readonly InputValueDefinitionNode[] | undefined,\n): void => {\n if (!fields) return;\n for (const field of fields) {\n target.set(field.name.value, field);\n }\n};\n\nconst addEnumValues = (\n target: Map<string, EnumValueDefinitionNode>,\n values: readonly EnumValueDefinitionNode[] | undefined,\n): void => {\n if (!values) return;\n for (const value of values) {\n target.set(value.name.value, value);\n }\n};\n\nconst addUnionMembers = (target: Map<string, NamedTypeNode>, members: readonly NamedTypeNode[] | undefined): void => {\n if (!members) return;\n for (const member of members) {\n target.set(member.name.value, member);\n }\n};\n\nconst mergeDirectives = (\n existing: ConstDirectiveNode[] | undefined,\n incoming: readonly ConstDirectiveNode[] | undefined,\n precedence: \"definition\" | \"extension\",\n): ConstDirectiveNode[] => {\n const current = existing ?? [];\n const next = incoming ? Array.from(incoming) : [];\n return precedence === \"definition\" ? [...next, ...current] : [...current, ...next];\n};\n\nconst updateOperationTypes = (\n operationTypes: OperationTypeNames,\n definition: SchemaDefinitionNode | SchemaExtensionNode,\n): void => {\n for (const operation of definition.operationTypes ?? []) {\n const typeName = operation.type.name.value;\n switch (operation.operation) {\n case \"query\":\n operationTypes.query = typeName;\n break;\n case \"mutation\":\n operationTypes.mutation = typeName;\n break;\n case \"subscription\":\n operationTypes.subscription = typeName;\n break;\n default:\n break;\n }\n }\n};\n\nconst addDirectiveArgs = (\n target: Map<string, InputValueDefinitionNode>,\n args: readonly InputValueDefinitionNode[] | undefined,\n): void => {\n if (!args) return;\n for (const arg of args) {\n target.set(arg.name.value, arg);\n }\n};\n\n/** Build a schema index from a parsed GraphQL schema document. */\nexport const createSchemaIndex = (document: DocumentNode): SchemaIndex => {\n const objects = new Map<string, ObjectRecord>();\n const inputs = new Map<string, InputRecord>();\n const enums = new Map<string, EnumRecord>();\n const unions = new Map<string, UnionRecord>();\n const scalars = new Map<string, ScalarRecord>();\n const directives = new Map<string, DirectiveRecord>();\n const operationTypes: OperationTypeNames = {};\n\n for (const definition of document.definitions) {\n switch (definition.kind) {\n case Kind.OBJECT_TYPE_DEFINITION:\n case Kind.OBJECT_TYPE_EXTENSION: {\n const precedence = definition.kind === Kind.OBJECT_TYPE_DEFINITION ? \"definition\" : \"extension\";\n const record = ensureRecord(objects, definition.name.value, (name) => ({\n name,\n fields: new Map<string, FieldDefinitionNode>(),\n directives: [],\n }));\n addObjectFields(record.fields, definition.fields);\n record.directives = mergeDirectives(record.directives, definition.directives, precedence);\n break;\n }\n case Kind.INPUT_OBJECT_TYPE_DEFINITION:\n case Kind.INPUT_OBJECT_TYPE_EXTENSION: {\n const precedence = definition.kind === Kind.INPUT_OBJECT_TYPE_DEFINITION ? \"definition\" : \"extension\";\n const record = ensureRecord(inputs, definition.name.value, (name) => ({\n name,\n fields: new Map<string, InputValueDefinitionNode>(),\n directives: [],\n }));\n addInputFields(record.fields, definition.fields);\n record.directives = mergeDirectives(record.directives, definition.directives, precedence);\n break;\n }\n case Kind.ENUM_TYPE_DEFINITION:\n case Kind.ENUM_TYPE_EXTENSION: {\n const precedence = definition.kind === Kind.ENUM_TYPE_DEFINITION ? \"definition\" : \"extension\";\n const record = ensureRecord(enums, definition.name.value, (name) => ({\n name,\n values: new Map<string, EnumValueDefinitionNode>(),\n directives: [],\n }));\n addEnumValues(record.values, definition.values);\n record.directives = mergeDirectives(record.directives, definition.directives, precedence);\n break;\n }\n case Kind.UNION_TYPE_DEFINITION:\n case Kind.UNION_TYPE_EXTENSION: {\n const precedence = definition.kind === Kind.UNION_TYPE_DEFINITION ? \"definition\" : \"extension\";\n const record = ensureRecord(unions, definition.name.value, (name) => ({\n name,\n members: new Map<string, NamedTypeNode>(),\n directives: [],\n }));\n addUnionMembers(record.members, definition.types);\n record.directives = mergeDirectives(record.directives, definition.directives, precedence);\n break;\n }\n case Kind.SCALAR_TYPE_DEFINITION:\n case Kind.SCALAR_TYPE_EXTENSION: {\n const precedence = definition.kind === Kind.SCALAR_TYPE_DEFINITION ? \"definition\" : \"extension\";\n const record = ensureRecord(scalars, definition.name.value, (name) => ({\n name,\n directives: [],\n }));\n record.directives = mergeDirectives(record.directives, definition.directives, precedence);\n break;\n }\n case Kind.DIRECTIVE_DEFINITION: {\n const name = definition.name.value;\n if (name === \"skip\" || name === \"include\" || name === \"deprecated\" || name === \"specifiedBy\") {\n break;\n }\n const args = new Map<string, InputValueDefinitionNode>();\n addDirectiveArgs(args, definition.arguments);\n directives.set(name, {\n name,\n locations: definition.locations.map((loc) => loc.value),\n args,\n isRepeatable: definition.repeatable,\n });\n break;\n }\n case Kind.SCHEMA_DEFINITION:\n case Kind.SCHEMA_EXTENSION:\n updateOperationTypes(operationTypes, definition);\n break;\n default:\n break;\n }\n }\n\n if (!operationTypes.query && objects.has(\"Query\")) {\n operationTypes.query = \"Query\";\n }\n if (!operationTypes.mutation && objects.has(\"Mutation\")) {\n operationTypes.mutation = \"Mutation\";\n }\n if (!operationTypes.subscription && objects.has(\"Subscription\")) {\n operationTypes.subscription = \"Subscription\";\n }\n\n return {\n objects,\n inputs,\n enums,\n unions,\n scalars,\n directives,\n operationTypes,\n };\n};\n","/**\n * Transformer for enriching parsed GraphQL operations with schema information.\n * @module\n */\n\nimport type { DocumentNode } from \"graphql\";\nimport { parseTypeNode } from \"./parser\";\nimport { err, ok, type Result } from \"./result\";\nimport { createSchemaIndex, type SchemaIndex } from \"./schema-index\";\nimport type {\n GraphqlAnalysisError,\n InferredVariable,\n ParsedArgument,\n ParsedFragment,\n ParsedOperation,\n ParsedSelection,\n ParsedValue,\n ParsedVariable,\n ParseResult,\n TypeInfo,\n} from \"./types\";\n\nconst builtinScalarTypes = new Set([\"ID\", \"String\", \"Int\", \"Float\", \"Boolean\"]);\n\n// ============================================================================\n// Modifier Merging Utilities\n// ============================================================================\n\ntype ModifierStructure = {\n readonly inner: \"!\" | \"?\";\n readonly lists: readonly (\"[]!\" | \"[]?\")[];\n};\n\nconst parseModifierStructure = (modifier: string): ModifierStructure => {\n const inner = modifier[0] === \"!\" ? \"!\" : \"?\";\n const lists: (\"[]!\" | \"[]?\")[] = [];\n const listPattern = /\\[\\]([!?])/g;\n let match: RegExpExecArray | null;\n while ((match = listPattern.exec(modifier)) !== null) {\n lists.push(`[]${match[1]}` as \"[]!\" | \"[]?\");\n }\n return { inner, lists };\n};\n\nconst buildModifier = (structure: ModifierStructure): string => {\n return structure.inner + structure.lists.join(\"\");\n};\n\nexport const isModifierAssignable = (source: string, target: string): boolean => {\n const srcStruct = parseModifierStructure(source);\n const tgtStruct = parseModifierStructure(target);\n\n const depthDiff = tgtStruct.lists.length - srcStruct.lists.length;\n if (depthDiff < 0 || depthDiff > 1) return false;\n\n const tgtListsToCompare = depthDiff === 1 ? tgtStruct.lists.slice(1) : tgtStruct.lists;\n\n if (depthDiff === 1 && srcStruct.lists.length === 0 && srcStruct.inner === \"?\" && tgtStruct.lists[0] === \"[]!\") {\n return false;\n }\n\n if (srcStruct.inner === \"?\" && tgtStruct.inner === \"!\") return false;\n\n for (let i = 0; i < srcStruct.lists.length; i++) {\n // biome-ignore lint/style/noNonNullAssertion: Loop index is within bounds\n const srcList = srcStruct.lists[i]!;\n // biome-ignore lint/style/noNonNullAssertion: Loop index is within bounds\n const tgtList = tgtListsToCompare[i]!;\n if (srcList === \"[]?\" && tgtList === \"[]!\") return false;\n }\n\n return true;\n};\n\nconst deriveMinimumModifier = (expectedModifier: string): string => {\n const struct = parseModifierStructure(expectedModifier);\n if (struct.lists.length > 0) {\n return buildModifier({ inner: struct.inner, lists: struct.lists.slice(1) });\n }\n return expectedModifier;\n};\n\nexport const mergeModifiers = (a: string, b: string): { ok: true; value: string } | { ok: false; reason: string } => {\n const structA = parseModifierStructure(a);\n const structB = parseModifierStructure(b);\n\n if (structA.lists.length !== structB.lists.length) {\n return {\n ok: false,\n reason: `Incompatible list depths: \"${a}\" has ${structA.lists.length} list level(s), \"${b}\" has ${structB.lists.length}`,\n };\n }\n\n const mergedInner: \"!\" | \"?\" = structA.inner === \"!\" || structB.inner === \"!\" ? \"!\" : \"?\";\n const mergedLists: (\"[]!\" | \"[]?\")[] = [];\n for (let i = 0; i < structA.lists.length; i++) {\n // biome-ignore lint/style/noNonNullAssertion: Loop index is within bounds\n const listA = structA.lists[i]!;\n // biome-ignore lint/style/noNonNullAssertion: Loop index is within bounds\n const listB = structB.lists[i]!;\n mergedLists.push(listA === \"[]!\" || listB === \"[]!\" ? \"[]!\" : \"[]?\");\n }\n\n return { ok: true, value: buildModifier({ inner: mergedInner, lists: mergedLists }) };\n};\n\n// ============================================================================\n// Variable Collection from Selections\n// ============================================================================\n\nexport type VariableUsage = {\n readonly name: string;\n readonly typeName: string;\n readonly expectedModifier: string;\n readonly minimumModifier: string;\n readonly typeKind: \"scalar\" | \"enum\" | \"input\";\n};\n\nexport const getArgumentType = (\n schema: SchemaIndex,\n parentTypeName: string,\n fieldName: string,\n argumentName: string,\n): TypeInfo | null => {\n const objectRecord = schema.objects.get(parentTypeName);\n if (!objectRecord) return null;\n\n const fieldDef = objectRecord.fields.get(fieldName);\n if (!fieldDef) return null;\n\n const argDef = fieldDef.arguments?.find((arg) => arg.name.value === argumentName);\n if (!argDef) return null;\n\n return parseTypeNode(argDef.type);\n};\n\nexport const getInputFieldType = (schema: SchemaIndex, inputTypeName: string, fieldName: string): TypeInfo | null => {\n const inputRecord = schema.inputs.get(inputTypeName);\n if (!inputRecord) return null;\n\n const fieldDef = inputRecord.fields.get(fieldName);\n if (!fieldDef) return null;\n\n return parseTypeNode(fieldDef.type);\n};\n\nconst resolveTypeKindFromName = (schema: SchemaIndex, typeName: string): \"scalar\" | \"enum\" | \"input\" | null => {\n if (isScalarName(schema, typeName)) return \"scalar\";\n if (isEnumName(schema, typeName)) return \"enum\";\n if (schema.inputs.has(typeName)) return \"input\";\n return null;\n};\n\nconst collectVariablesFromValue = (\n value: ParsedValue,\n expectedTypeName: string,\n expectedModifier: string,\n schema: SchemaIndex,\n usages: VariableUsage[],\n): GraphqlAnalysisError | null => {\n if (value.kind === \"variable\") {\n const typeKind = resolveTypeKindFromName(schema, expectedTypeName);\n if (!typeKind) {\n return {\n code: \"GRAPHQL_UNKNOWN_TYPE\",\n message: `Unknown type \"${expectedTypeName}\" for variable \"$${value.name}\"`,\n typeName: expectedTypeName,\n };\n }\n usages.push({\n name: value.name,\n typeName: expectedTypeName,\n expectedModifier,\n minimumModifier: deriveMinimumModifier(expectedModifier),\n typeKind,\n });\n return null;\n }\n\n if (value.kind === \"object\") {\n for (const field of value.fields) {\n const fieldType = getInputFieldType(schema, expectedTypeName, field.name);\n if (!fieldType) {\n return {\n code: \"GRAPHQL_UNKNOWN_FIELD\",\n message: `Unknown field \"${field.name}\" on input type \"${expectedTypeName}\"`,\n typeName: expectedTypeName,\n fieldName: field.name,\n };\n }\n const error = collectVariablesFromValue(field.value, fieldType.typeName, fieldType.modifier, schema, usages);\n if (error) return error;\n }\n return null;\n }\n\n if (value.kind === \"list\") {\n const struct = parseModifierStructure(expectedModifier);\n if (struct.lists.length > 0) {\n const innerModifier = buildModifier({\n inner: struct.inner,\n lists: struct.lists.slice(1),\n });\n for (const item of value.values) {\n const error = collectVariablesFromValue(item, expectedTypeName, innerModifier, schema, usages);\n if (error) return error;\n }\n }\n }\n\n return null;\n};\n\nconst collectVariablesFromArguments = (\n args: readonly ParsedArgument[],\n parentTypeName: string,\n fieldName: string,\n schema: SchemaIndex,\n usages: VariableUsage[],\n): GraphqlAnalysisError | null => {\n for (const arg of args) {\n const argType = getArgumentType(schema, parentTypeName, fieldName, arg.name);\n if (!argType) {\n return {\n code: \"GRAPHQL_UNKNOWN_ARGUMENT\",\n message: `Unknown argument \"${arg.name}\" on field \"${fieldName}\"`,\n fieldName,\n argumentName: arg.name,\n };\n }\n const error = collectVariablesFromValue(arg.value, argType.typeName, argType.modifier, schema, usages);\n if (error) return error;\n }\n return null;\n};\n\nexport const collectVariableUsages = (\n selections: readonly ParsedSelection[],\n parentTypeName: string,\n schema: SchemaIndex,\n): Result<VariableUsage[], GraphqlAnalysisError> => {\n const usages: VariableUsage[] = [];\n\n const collect = (sels: readonly ParsedSelection[], parentType: string): GraphqlAnalysisError | null => {\n for (const sel of sels) {\n switch (sel.kind) {\n case \"field\": {\n if (sel.arguments && sel.arguments.length > 0) {\n const error = collectVariablesFromArguments(sel.arguments, parentType, sel.name, schema, usages);\n if (error) return error;\n }\n if (sel.selections && sel.selections.length > 0) {\n const fieldReturnType = getFieldReturnType(schema, parentType, sel.name);\n if (!fieldReturnType) {\n return {\n code: \"GRAPHQL_UNKNOWN_FIELD\",\n message: `Unknown field \"${sel.name}\" on type \"${parentType}\"`,\n typeName: parentType,\n fieldName: sel.name,\n };\n }\n const error = collect(sel.selections, fieldReturnType);\n if (error) return error;\n }\n break;\n }\n case \"inlineFragment\": {\n const error = collect(sel.selections, sel.onType);\n if (error) return error;\n break;\n }\n case \"fragmentSpread\":\n break;\n }\n }\n return null;\n };\n\n const error = collect(selections, parentTypeName);\n if (error) return err(error);\n\n return ok(usages);\n};\n\nexport const getFieldReturnType = (schema: SchemaIndex, parentTypeName: string, fieldName: string): string | null => {\n const objectRecord = schema.objects.get(parentTypeName);\n if (!objectRecord) return null;\n\n const fieldDef = objectRecord.fields.get(fieldName);\n if (!fieldDef) return null;\n\n const { typeName } = parseTypeNode(fieldDef.type);\n return typeName;\n};\n\nexport const mergeVariableUsages = (\n variableName: string,\n usages: readonly VariableUsage[],\n): Result<InferredVariable, GraphqlAnalysisError> => {\n if (usages.length === 0) {\n return err({\n code: \"GRAPHQL_UNDECLARED_VARIABLE\",\n message: `No usages found for variable \"${variableName}\"`,\n variableName,\n });\n }\n\n // biome-ignore lint/style/noNonNullAssertion: Length checked above\n const first = usages[0]!;\n\n for (const usage of usages) {\n if (usage.typeName !== first.typeName) {\n return err({\n code: \"GRAPHQL_VARIABLE_TYPE_MISMATCH\",\n message: `Variable \"$${variableName}\" has conflicting types: \"${first.typeName}\" and \"${usage.typeName}\"`,\n variableName,\n });\n }\n }\n\n let candidateModifier = first.minimumModifier;\n for (let i = 1; i < usages.length; i++) {\n // biome-ignore lint/style/noNonNullAssertion: Loop index is within bounds\n const result = mergeModifiers(candidateModifier, usages[i]!.minimumModifier);\n if (!result.ok) {\n return err({\n code: \"GRAPHQL_VARIABLE_MODIFIER_INCOMPATIBLE\",\n message: `Variable \"$${variableName}\" has incompatible modifiers: ${result.reason}`,\n variableName,\n });\n }\n candidateModifier = result.value;\n }\n\n for (const usage of usages) {\n if (!isModifierAssignable(candidateModifier, usage.expectedModifier)) {\n return err({\n code: \"GRAPHQL_VARIABLE_MODIFIER_INCOMPATIBLE\",\n message: `Variable \"$${variableName}\" with modifier \"${candidateModifier}\" cannot satisfy expected \"${usage.expectedModifier}\"`,\n variableName,\n });\n }\n }\n\n return ok({\n name: variableName,\n typeName: first.typeName,\n modifier: candidateModifier,\n typeKind: first.typeKind,\n });\n};\n\nexport const inferVariablesFromUsages = (usages: readonly VariableUsage[]): Result<InferredVariable[], GraphqlAnalysisError> => {\n const byName = new Map<string, VariableUsage[]>();\n for (const usage of usages) {\n const existing = byName.get(usage.name);\n if (existing) {\n existing.push(usage);\n } else {\n byName.set(usage.name, [usage]);\n }\n }\n\n const variables: InferredVariable[] = [];\n for (const [name, group] of byName) {\n const result = mergeVariableUsages(name, group);\n if (!result.ok) return err(result.error);\n variables.push(result.value);\n }\n\n variables.sort((a, b) => a.name.localeCompare(b.name));\n return ok(variables);\n};\n\nconst isScalarName = (schema: SchemaIndex, name: string): boolean => builtinScalarTypes.has(name) || schema.scalars.has(name);\n\n// ============================================================================\n// Fragment Dependency Ordering\n// ============================================================================\n\nexport const sortFragmentsByDependency = (\n fragments: readonly ParsedFragment[],\n): Result<ParsedFragment[], GraphqlAnalysisError> => {\n const graph = new Map<string, Set<string>>();\n for (const fragment of fragments) {\n const deps = collectFragmentDependenciesSet(fragment.selections);\n graph.set(fragment.name, deps);\n }\n\n const fragmentByName = new Map<string, ParsedFragment>();\n for (const f of fragments) {\n fragmentByName.set(f.name, f);\n }\n\n const sorted: ParsedFragment[] = [];\n const visited = new Set<string>();\n const visiting = new Set<string>();\n\n const visit = (name: string, path: string[]): GraphqlAnalysisError | null => {\n if (visited.has(name)) return null;\n\n if (visiting.has(name)) {\n const cycleStart = path.indexOf(name);\n const cycle = path.slice(cycleStart).concat(name);\n return {\n code: \"GRAPHQL_FRAGMENT_CIRCULAR_DEPENDENCY\",\n message: `Circular dependency detected in fragments: ${cycle.join(\" -> \")}`,\n fragmentNames: cycle,\n };\n }\n\n const fragment = fragmentByName.get(name);\n if (!fragment) {\n visited.add(name);\n return null;\n }\n\n visiting.add(name);\n const deps = graph.get(name) ?? new Set();\n\n for (const dep of deps) {\n const error = visit(dep, [...path, name]);\n if (error) return error;\n }\n\n visiting.delete(name);\n visited.add(name);\n sorted.push(fragment);\n return null;\n };\n\n for (const fragment of fragments) {\n const error = visit(fragment.name, []);\n if (error) return err(error);\n }\n\n return ok(sorted);\n};\n\nconst collectFragmentDependenciesSet = (selections: readonly ParsedSelection[]): Set<string> => {\n const deps = new Set<string>();\n\n const collect = (sels: readonly ParsedSelection[]): void => {\n for (const sel of sels) {\n switch (sel.kind) {\n case \"fragmentSpread\":\n deps.add(sel.name);\n break;\n case \"field\":\n if (sel.selections) {\n collect(sel.selections);\n }\n break;\n case \"inlineFragment\":\n collect(sel.selections);\n break;\n }\n }\n };\n\n collect(selections);\n return deps;\n};\n\nconst isEnumName = (schema: SchemaIndex, name: string): boolean => schema.enums.has(name);\n\n// ============================================================================\n// Enriched Types\n// ============================================================================\n\nexport type EnrichedOperation = Omit<ParsedOperation, \"variables\"> & {\n readonly variables: readonly EnrichedVariable[];\n readonly fragmentDependencies: readonly string[];\n};\n\nexport type EnrichedFragment = ParsedFragment & {\n readonly fragmentDependencies: readonly string[];\n readonly variables: readonly InferredVariable[];\n};\n\nexport type EnrichedVariable = Omit<ParsedVariable, \"typeKind\"> & {\n readonly typeKind: \"scalar\" | \"enum\" | \"input\";\n};\n\nexport type TransformResult = {\n readonly operations: readonly EnrichedOperation[];\n readonly fragments: readonly EnrichedFragment[];\n};\n\nexport type TransformOptions = {\n readonly schemaDocument: DocumentNode;\n};\n\n// ============================================================================\n// Full Transformation Pipeline\n// ============================================================================\n\nexport const transformParsedGraphql = (\n parsed: ParseResult,\n options: TransformOptions,\n): Result<TransformResult, GraphqlAnalysisError> => {\n const schema = createSchemaIndex(options.schemaDocument);\n\n const sortResult = sortFragmentsByDependency(parsed.fragments);\n if (!sortResult.ok) {\n return err(sortResult.error);\n }\n const sortedFragments = sortResult.value;\n\n const resolvedFragmentVariables = new Map<string, readonly InferredVariable[]>();\n const fragments: EnrichedFragment[] = [];\n\n for (const frag of sortedFragments) {\n const result = transformFragment(frag, schema, resolvedFragmentVariables);\n if (!result.ok) {\n return err(result.error);\n }\n resolvedFragmentVariables.set(frag.name, result.value.variables);\n fragments.push(result.value);\n }\n\n const operations: EnrichedOperation[] = [];\n for (const op of parsed.operations) {\n const result = transformOperation(op, schema);\n if (!result.ok) {\n return err(result.error);\n }\n operations.push(result.value);\n }\n\n return ok({ operations, fragments });\n};\n\nconst transformOperation = (op: ParsedOperation, schema: SchemaIndex): Result<EnrichedOperation, GraphqlAnalysisError> => {\n const variables: EnrichedVariable[] = [];\n for (const v of op.variables) {\n const typeKind = resolveTypeKind(schema, v.typeName);\n if (typeKind === null) {\n return err({\n code: \"GRAPHQL_UNKNOWN_TYPE\",\n message: `Unknown type \"${v.typeName}\" in variable \"${v.name}\"`,\n typeName: v.typeName,\n });\n }\n variables.push({ ...v, typeKind });\n }\n\n const fragmentDependencies = collectFragmentDependencies(op.selections);\n\n return ok({\n ...op,\n variables,\n fragmentDependencies,\n });\n};\n\nconst transformFragment = (\n frag: ParsedFragment,\n schema: SchemaIndex,\n resolvedFragmentVariables: Map<string, readonly InferredVariable[]>,\n): Result<EnrichedFragment, GraphqlAnalysisError> => {\n const fragmentDependencies = collectFragmentDependencies(frag.selections);\n\n const directUsagesResult = collectVariableUsages(frag.selections, frag.onType, schema);\n if (!directUsagesResult.ok) {\n return err(directUsagesResult.error);\n }\n const directUsages = directUsagesResult.value;\n\n const spreadVariables: InferredVariable[] = [];\n for (const depName of fragmentDependencies) {\n const depVariables = resolvedFragmentVariables.get(depName);\n if (depVariables) {\n spreadVariables.push(...depVariables);\n }\n }\n\n const allUsages: VariableUsage[] = [\n ...directUsages,\n ...spreadVariables.map((v) => ({\n name: v.name,\n typeName: v.typeName,\n expectedModifier: v.modifier,\n minimumModifier: v.modifier,\n typeKind: v.typeKind,\n })),\n ];\n\n const variablesResult = inferVariablesFromUsages(allUsages);\n if (!variablesResult.ok) {\n return err(variablesResult.error);\n }\n\n return ok({\n ...frag,\n fragmentDependencies,\n variables: variablesResult.value,\n });\n};\n\nconst resolveTypeKind = (schema: SchemaIndex, typeName: string): \"scalar\" | \"enum\" | \"input\" | null => {\n if (isScalarName(schema, typeName)) return \"scalar\";\n if (isEnumName(schema, typeName)) return \"enum\";\n if (schema.inputs.has(typeName)) return \"input\";\n return null;\n};\n\nconst collectFragmentDependencies = (selections: readonly ParsedSelection[]): readonly string[] => {\n const fragments = new Set<string>();\n\n const collect = (sels: readonly ParsedSelection[]): void => {\n for (const sel of sels) {\n switch (sel.kind) {\n case \"fragmentSpread\":\n fragments.add(sel.name);\n break;\n case \"field\":\n if (sel.selections) {\n collect(sel.selections);\n }\n break;\n case \"inlineFragment\":\n collect(sel.selections);\n break;\n }\n }\n };\n\n collect(selections);\n return [...fragments];\n};\n","/**\n * Converts VariableDefinitionNode from graphql-js AST into VarSpecifier objects\n * compatible with the composer's GenericVarSpecifier type.\n *\n * Uses throw (not Result) because it will be called from the composer layer.\n * @module\n */\n\nimport { Kind, type ValueNode, type VariableDefinitionNode } from \"graphql\";\nimport { parseTypeNode } from \"./parser\";\nimport type { SchemaIndex } from \"./schema-index\";\n\n/**\n * Runtime VarSpecifier shape produced by this builder.\n * Compatible with GenericVarSpecifier from var-builder.ts.\n */\nexport type BuiltVarSpecifier = {\n readonly kind: \"scalar\" | \"enum\" | \"input\";\n readonly name: string;\n readonly modifier: string;\n readonly defaultValue: null | { readonly default: unknown };\n readonly directives: Record<string, never>;\n};\n\nconst builtinScalarTypes = new Set([\"ID\", \"String\", \"Int\", \"Float\", \"Boolean\"]);\n\nconst resolveTypeKind = (schema: SchemaIndex, typeName: string): \"scalar\" | \"enum\" | \"input\" => {\n if (builtinScalarTypes.has(typeName) || schema.scalars.has(typeName)) return \"scalar\";\n if (schema.enums.has(typeName)) return \"enum\";\n if (schema.inputs.has(typeName)) return \"input\";\n throw new Error(`Cannot resolve type kind for \"${typeName}\": not found in schema as scalar, enum, or input`);\n};\n\n/**\n * Extract a constant value from a ValueNode (for default values).\n * Similar to graphql-js valueFromAST but without type coercion.\n */\nconst extractConstValue = (node: ValueNode): unknown => {\n switch (node.kind) {\n case Kind.INT:\n return Number.parseInt(node.value, 10);\n case Kind.FLOAT:\n return Number.parseFloat(node.value);\n case Kind.STRING:\n return node.value;\n case Kind.BOOLEAN:\n return node.value;\n case Kind.NULL:\n return null;\n case Kind.ENUM:\n return node.value;\n case Kind.LIST:\n return node.values.map(extractConstValue);\n case Kind.OBJECT: {\n const obj: Record<string, unknown> = {};\n for (const field of node.fields) {\n obj[field.name.value] = extractConstValue(field.value);\n }\n return obj;\n }\n case Kind.VARIABLE:\n throw new Error(\"Variable references are not allowed in default values\");\n default:\n throw new Error(`Unexpected value kind: ${(node as { kind: string }).kind}`);\n }\n};\n\nconst extractDefaultValue = (node: VariableDefinitionNode): null | { readonly default: unknown } => {\n if (!node.defaultValue) return null;\n return { default: extractConstValue(node.defaultValue) };\n};\n\n/**\n * Convert a VariableDefinitionNode to a VarSpecifier.\n * Resolves `kind` (scalar/enum/input) from the schema index.\n *\n * @throws Error if type name cannot be resolved in schema\n */\nexport const buildVarSpecifier = (node: VariableDefinitionNode, schema: SchemaIndex): BuiltVarSpecifier => {\n const { typeName, modifier } = parseTypeNode(node.type);\n const kind = resolveTypeKind(schema, typeName);\n const defaultValue = extractDefaultValue(node);\n\n return { kind, name: typeName, modifier, defaultValue, directives: {} as Record<string, never> };\n};\n\n/**\n * Convert all variable definitions from a list of VariableDefinitionNodes\n * into a record keyed by variable name.\n *\n * @throws Error if any type name cannot be resolved in schema\n */\nexport const buildVarSpecifiers = (\n nodes: readonly VariableDefinitionNode[],\n schema: SchemaIndex,\n): Record<string, BuiltVarSpecifier> => {\n const result: Record<string, BuiltVarSpecifier> = {};\n for (const node of nodes) {\n result[node.variable.name.value] = buildVarSpecifier(node, schema);\n }\n return result;\n};\n","import type { DocumentNode } from \"graphql\";\nimport type { FieldPath } from \"../../composer/field-path-context\";\nimport type { OperationType } from \"../schema\";\nimport type { OperationMetadata } from \"./metadata\";\n\n/**\n * Information about a fragment's metadata when spread in an operation.\n */\nexport type FragmentMetaInfo<TFragmentMetadata> = {\n /** The evaluated metadata from the fragment, if defined */\n readonly metadata: TFragmentMetadata | undefined;\n /** Field path where the fragment was spread */\n readonly fieldPath: FieldPath | null;\n};\n\n/**\n * Metadata adapter that defines how fragment metadata is aggregated\n * and provides schema-level configuration.\n *\n * This adapter allows complete customization of:\n * - Fragment metadata type (TFragmentMetadata)\n * - How fragment metadata is aggregated (aggregateFragmentMetadata)\n * - Schema-level fixed values available to all operation metadata builders (schemaLevel)\n *\n * Note: Operation metadata type is inferred from the operation's metadata callback return type.\n *\n * @template TFragmentMetadata - The metadata type returned by fragment metadata builders\n * @template TAggregatedFragmentMetadata - The type returned by aggregateFragmentMetadata\n * @template TSchemaLevel - The type of schema-level configuration values\n */\nexport type MetadataAdapter<TFragmentMetadata = unknown, TAggregatedFragmentMetadata = unknown, TSchemaLevel = unknown> = {\n /**\n * Aggregates metadata from all spread fragments in an operation.\n * Called with the metadata from each spread fragment.\n * The return type becomes the `fragmentMetadata` parameter in operation metadata builders.\n */\n readonly aggregateFragmentMetadata: (fragments: readonly FragmentMetaInfo<TFragmentMetadata>[]) => TAggregatedFragmentMetadata;\n /**\n * Schema-level fixed values that are passed to all operation metadata builders.\n * Useful for configuration that should be consistent across all operations.\n */\n readonly schemaLevel?: TSchemaLevel;\n};\n\n/**\n * Extracts the type parameters from a MetadataAdapter.\n */\nexport type ExtractAdapterTypes<T> = T extends MetadataAdapter<infer TFragment, infer TAggregated, infer TSchemaLevel>\n ? {\n fragmentMetadata: TFragment;\n aggregatedFragmentMetadata: TAggregated;\n schemaLevel: TSchemaLevel;\n }\n : never;\n\n/**\n * Generic type for any metadata adapter.\n */\nexport type AnyMetadataAdapter = MetadataAdapter<any, any, any>;\n\n/**\n * Arguments passed to document transformer function.\n * Destructurable for convenient access.\n *\n * @template TSchemaLevel - Schema-level configuration type\n * @template TAggregatedFragmentMetadata - Aggregated fragment metadata type\n */\nexport type DocumentTransformArgs<TSchemaLevel = unknown, TAggregatedFragmentMetadata = unknown> = {\n /** The GraphQL document to transform */\n readonly document: DocumentNode;\n /** The operation name */\n readonly operationName: string;\n /** The operation type (query, mutation, subscription) */\n readonly operationType: OperationType;\n /** Variable names defined for this operation */\n readonly variableNames: readonly string[];\n /** Schema-level configuration from adapter */\n readonly schemaLevel: TSchemaLevel | undefined;\n /** Aggregated fragment metadata */\n readonly fragmentMetadata: TAggregatedFragmentMetadata | undefined;\n};\n\n/**\n * Document transformer function.\n * Receives the built DocumentNode and returns a transformed DocumentNode.\n *\n * @template TSchemaLevel - Schema-level configuration type\n * @template TAggregatedFragmentMetadata - Aggregated fragment metadata type\n */\nexport type DocumentTransformer<TSchemaLevel = unknown, TAggregatedFragmentMetadata = unknown> = (\n args: DocumentTransformArgs<TSchemaLevel, TAggregatedFragmentMetadata>,\n) => DocumentNode;\n\n/**\n * Arguments passed to operation-level document transformer.\n * Receives typed operation metadata.\n *\n * @template TOperationMetadata - The operation's metadata type\n */\nexport type OperationDocumentTransformArgs<TOperationMetadata = unknown> = {\n /** The GraphQL document to transform */\n readonly document: DocumentNode;\n /** The operation metadata (typed per-operation) */\n readonly metadata: TOperationMetadata | undefined;\n};\n\n/**\n * Operation-level document transformer function.\n * Applied before the adapter-level transform.\n *\n * **Best Practice:** Define transform logic in adapter helpers for reusability,\n * then reference the helper in the operation's `transformDocument` option.\n *\n * @example\n * ```typescript\n * // Define in adapter helpers\n * const adapter = defineAdapter({\n * helpers: {\n * transform: {\n * addCache: (ttl: number) => ({ document }) => visit(document, { ... }),\n * },\n * },\n * });\n *\n * // Use in operation\n * query(\"GetUser\")`{ ... }`({\n * transformDocument: transform.addCache(300),\n * });\n * ```\n *\n * @template TOperationMetadata - The operation's metadata type\n */\nexport type OperationDocumentTransformer<TOperationMetadata = unknown> = (\n args: OperationDocumentTransformArgs<TOperationMetadata>,\n) => DocumentNode;\n\n/**\n * Unified adapter that combines helpers and metadata configuration.\n *\n * @template THelpers - Custom helper functions accessible in gql composer callbacks\n * @template TFragmentMetadata - The metadata type returned by fragment metadata builders\n * @template TAggregatedFragmentMetadata - The type returned by aggregateFragmentMetadata\n * @template TSchemaLevel - The type of schema-level configuration values\n *\n * @example\n * ```typescript\n * const adapter = defineAdapter({\n * helpers: {\n * auth: {\n * requiresLogin: () => ({ requiresAuth: true }),\n * },\n * },\n * metadata: {\n * aggregateFragmentMetadata: (fragments) => fragments.map((m) => m.metadata),\n * schemaLevel: { apiVersion: \"v2\" },\n * },\n * });\n * ```\n */\nexport type Adapter<\n THelpers extends object = object,\n TFragmentMetadata = unknown,\n TAggregatedFragmentMetadata = unknown,\n TSchemaLevel = unknown,\n> = {\n /** Custom helper functions accessible in gql composer callbacks */\n readonly helpers?: THelpers;\n /** Metadata configuration for fragments and operations */\n readonly metadata?: MetadataAdapter<TFragmentMetadata, TAggregatedFragmentMetadata, TSchemaLevel>;\n /** Optional document transformer called after document building */\n readonly transformDocument?: DocumentTransformer<TSchemaLevel, TAggregatedFragmentMetadata>;\n};\n\n/**\n * Generic type for any unified adapter.\n */\nexport type AnyAdapter = Adapter<any, any, any, any>;\n\n/**\n * Extracts the type parameters from a unified Adapter.\n */\nexport type ExtractUnifiedAdapterTypes<T> = T extends Adapter<\n infer THelpers,\n infer TFragment,\n infer TAggregated,\n infer TSchemaLevel\n>\n ? {\n helpers: THelpers;\n fragmentMetadata: TFragment;\n aggregatedFragmentMetadata: TAggregated;\n schemaLevel: TSchemaLevel;\n }\n : never;\n\n/**\n * Default adapter that maintains backwards compatibility with the original behavior.\n * Uses OperationMetadata for fragment metadata and aggregates by collecting metadata into a readonly array.\n */\nexport type DefaultMetadataAdapter = MetadataAdapter<OperationMetadata, readonly (OperationMetadata | undefined)[]>;\n\n/**\n * Default unified adapter type.\n */\nexport type DefaultAdapter = Adapter<object, OperationMetadata, readonly (OperationMetadata | undefined)[]>;\n\n/**\n * Creates the default adapter instance.\n * @internal\n */\nexport const createDefaultAdapter = (): DefaultMetadataAdapter => ({\n aggregateFragmentMetadata: (fragments) => fragments.map((m) => m.metadata),\n});\n\n/**\n * The default adapter instance.\n */\nexport const defaultMetadataAdapter: DefaultMetadataAdapter = createDefaultAdapter();\n","/**\n * Field path context using shared value container pattern.\n *\n * This module tracks the current field path during field building,\n * similar to how React tracks the current fiber.\n * No changes to field builder arguments are needed - use getCurrentFieldPath() to access.\n */\n\n/**\n * A segment in the field path.\n */\nexport type FieldPathSegment = {\n /** The field name */\n readonly field: string;\n /** The parent type name */\n readonly parent: string;\n /** Whether this field returns a list */\n readonly isList: boolean;\n};\n\n/**\n * Complete field path from root to current position.\n */\nexport type FieldPath = {\n /** Full path string (e.g., \"$.user.posts[].author\") */\n readonly full: string;\n /** Individual path segments */\n readonly segments: readonly FieldPathSegment[];\n};\n\n/**\n * Shared mutable container for field path context.\n * Only synchronous access is supported.\n */\nconst fieldPathContext: { current: FieldPath | null } = {\n current: null,\n};\n\n/**\n * Get the current field path.\n * Returns null if not in a field building context.\n *\n * @example\n * ```typescript\n * import { getCurrentFieldPath } from '@soda-gql/core';\n *\n * // Inside a field builder or model spread:\n * const path = getCurrentFieldPath();\n * console.log(path?.full); // \"$.user.posts[].author\"\n * ```\n */\nexport const getCurrentFieldPath = (): FieldPath | null => fieldPathContext.current;\n\n/**\n * Run a function with a specific field path context.\n * Restores the previous path after the function completes.\n *\n * @internal\n */\nexport const withFieldPath = <T>(path: FieldPath, fn: () => T): T => {\n const previousPath = fieldPathContext.current;\n fieldPathContext.current = path;\n try {\n return fn();\n } finally {\n fieldPathContext.current = previousPath;\n }\n};\n\n/**\n * Append a new segment to the current path.\n *\n * @internal\n */\nexport const appendToPath = (\n parent: FieldPath | null,\n segment: { field: string; parentType: string; isList: boolean },\n): FieldPath => {\n const listSuffix = segment.isList ? \"[]\" : \"\";\n const newSegment: FieldPathSegment = {\n field: segment.field,\n parent: segment.parentType,\n isList: segment.isList,\n };\n\n if (!parent) {\n return {\n full: `$.${segment.field}${listSuffix}`,\n segments: [newSegment],\n };\n }\n\n return {\n full: `${parent.full}.${segment.field}${listSuffix}`,\n segments: [...parent.segments, newSegment],\n };\n};\n\n/**\n * Check if a type specifier represents a list type.\n * Matches patterns like \"Type:![]!\", \"Type:![]?\", \"Type:?[]!\", etc.\n *\n * @internal\n */\nexport const isListType = (typeString: string): boolean => {\n return typeString.includes(\"[]\");\n};\n","/**\n * Creates field selection factories for building GraphQL selections.\n * @module\n */\n\nimport type { AnyFieldSelection, AnyFieldsExtended, AnyNestedObject, AnyNestedUnion } from \"../types/fragment\";\nimport type { AnyGraphqlSchema } from \"../types/schema/schema\";\nimport type { DeferredOutputField, DeferredOutputFieldWithArgs } from \"../types/type-foundation\";\nimport type { AnyDirectiveRef } from \"../types/type-foundation/directive-ref\";\nimport type { AnyVarRef } from \"../types/type-foundation/var-ref\";\nimport { parseOutputField } from \"../utils/deferred-specifier-parser\";\nimport { wrapByKey } from \"../utils/wrap-by-key\";\nimport { appendToPath, getCurrentFieldPath, isListType, withFieldPath } from \"./field-path-context\";\n\n// ============================================================================\n// Relocated builder contract types (type-erased from types/element/fields-builder.ts)\n// ============================================================================\n\n/** Builder callback for top-level field selections (has $ variable access) */\nexport type FieldsBuilder<TFields extends AnyFieldsExtended = AnyFieldsExtended> = (tools: {\n f: FieldAccessorFunction;\n $: Readonly<Record<string, AnyVarRef>>;\n}) => TFields;\n\n/** Builder callback for nested object field selections (no $ access) */\nexport type NestedObjectFieldsBuilder<TFields extends AnyFieldsExtended = AnyFieldsExtended> = (tools: {\n f: FieldAccessorFunction;\n}) => TFields;\n\n/** Builder for union type selections with per-member field definitions */\nexport type NestedUnionFieldsBuilder = {\n [typeName: string]: NestedObjectFieldsBuilder | undefined;\n} & { __typename?: true };\n\n// ============================================================================\n// FieldAccessorFunction\n// ============================================================================\n\n/**\n * Type-erased return from field accessor.\n * The actual runtime shape is a function: for scalar/enum fields it takes no args,\n * for object fields it takes a NestedObjectFieldsBuilder, for union fields a NestedUnionFieldsBuilder.\n * This type preserves enough structure so that nested `({ f })` callbacks infer `f` properly.\n */\n/**\n * Type-erased return from field accessor.\n * For object fields: accepts NestedObjectFieldsBuilder (typed `{ f }` callback).\n * For union fields and scalar thunks: uses catch-all signature.\n */\n// biome-ignore lint/suspicious/noExplicitAny: Type-erased field accessor return — actual shapes vary by field kind\ntype AnyFieldAccessorReturn = ((nest: NestedObjectFieldsBuilder) => any) & ((...args: any[]) => any);\n\n/** Function-call field accessor: f(\"fieldName\", args, extras) */\nexport type FieldAccessorFunction = (\n fieldName: string,\n fieldArgs?: AnyFieldSelection[\"args\"] | null | void,\n extras?: { alias?: string; directives?: AnyDirectiveRef[] },\n) => AnyFieldAccessorReturn;\n\n// ============================================================================\n// Cache and factory\n// ============================================================================\n\n/**\n * Cache map type for field factories.\n * Schema-scoped to avoid cross-schema contamination.\n * @internal\n */\ntype CacheMap = Map<string, FieldAccessorFunction>;\n\nconst cacheMapBySchema = new WeakMap<AnyGraphqlSchema, CacheMap>();\nconst ensureCacheMapBySchema = (schema: AnyGraphqlSchema) => {\n const cachedCacheMap = cacheMapBySchema.get(schema);\n if (cachedCacheMap) {\n return cachedCacheMap;\n }\n\n const cacheMap: CacheMap = new Map();\n cacheMapBySchema.set(schema, cacheMap);\n return cacheMap;\n};\n\n/**\n * Creates a field accessor function for a given object type.\n *\n * Returns a function f(\"fieldName\", args, extras) for building field selections.\n * Factories are cached per schema+type to avoid recreation.\n *\n * @param schema - The GraphQL schema definition\n * @param typeName - The object type name to create factories for\n * @returns FieldAccessorFunction for building field selections\n *\n * @internal Used by operation and fragment composers\n */\nexport const createFieldFactories = <TSchema extends AnyGraphqlSchema>(\n schema: TSchema,\n typeName: string,\n): FieldAccessorFunction => {\n const cacheMap = ensureCacheMapBySchema(schema);\n const cached = cacheMap.get(typeName);\n if (cached) {\n return cached;\n }\n\n const factory = createFieldFactoriesInner(schema, typeName);\n cacheMap.set(typeName, factory);\n\n return factory;\n};\n\nconst createFieldFactoriesInner = (schema: AnyGraphqlSchema, typeName: string): FieldAccessorFunction => {\n const typeDef = schema.object[typeName];\n if (!typeDef) {\n throw new Error(`Type ${typeName} is not defined in schema objects`);\n }\n\n return (fieldName, fieldArgs, extras) => {\n // __typename is an implicit introspection field\n if (fieldName === \"__typename\") {\n const wrap = <T>(value: T) => wrapByKey(extras?.alias ?? fieldName, value);\n return (() =>\n wrap({\n parent: typeName,\n field: fieldName,\n type: \"s|String|!\",\n args: {},\n directives: extras?.directives ?? [],\n object: null,\n union: null,\n })) as unknown as AnyFieldAccessorReturn;\n }\n\n // Runtime duck-typing: codegen may emit string or { spec, arguments }\n const fieldDef = typeDef.fields[fieldName];\n if (!fieldDef) {\n throw new Error(`Field \"${fieldName}\" is not defined on type \"${typeName}\"`);\n }\n\n const parsedType = parseOutputField(fieldDef as DeferredOutputField);\n\n const wrap = <T>(value: T) => wrapByKey(extras?.alias ?? fieldName, value);\n const directives = extras?.directives ?? [];\n\n if (parsedType.kind === \"object\") {\n const factoryReturn = (<TNested extends AnyNestedObject>(nest: NestedObjectFieldsBuilder<TNested & AnyFieldsExtended>) => {\n // Build new path for this field\n const currentPath = getCurrentFieldPath();\n const newPath = appendToPath(currentPath, {\n field: fieldName,\n parentType: typeName,\n isList: isListType(parsedType.modifier),\n });\n\n // Run nested builder with updated path context\n const nestedFields = withFieldPath(newPath, () => nest({ f: createFieldFactories(schema, parsedType.name) }));\n\n return wrap({\n parent: typeName,\n field: fieldName,\n type: fieldDef as DeferredOutputFieldWithArgs,\n args: fieldArgs ?? {},\n directives,\n object: nestedFields,\n union: null,\n });\n }) as unknown as AnyFieldAccessorReturn;\n\n return factoryReturn;\n }\n\n if (parsedType.kind === \"union\") {\n const factoryReturn = (<TNested extends AnyNestedUnion>(nest: NestedUnionFieldsBuilder & TNested) => {\n // Build new path for this field\n const currentPath = getCurrentFieldPath();\n const newPath = appendToPath(currentPath, {\n field: fieldName,\n parentType: typeName,\n isList: isListType(parsedType.modifier),\n });\n\n // Extract __typename flag before processing\n const typenameFlag = (nest as { __typename?: true }).__typename;\n\n // Run nested builders with updated path context, filtering out __typename\n const selections = withFieldPath(newPath, () => {\n const result: Record<string, unknown> = {};\n for (const [memberName, builder] of Object.entries(nest)) {\n if (memberName === \"__typename\") {\n continue; // Skip the flag, stored separately\n }\n if (typeof builder === \"function\") {\n result[memberName] = {\n fields: (builder as NestedObjectFieldsBuilder)({\n f: createFieldFactories(schema, memberName),\n }),\n directives: [],\n };\n } else if (builder && typeof builder === \"object\" && \"fields\" in builder) {\n // Pre-wrapped UnionMemberSelection (tagged template path)\n result[memberName] = builder;\n } else {\n }\n }\n return result;\n });\n\n return wrap({\n parent: typeName,\n field: fieldName,\n type: fieldDef as DeferredOutputFieldWithArgs,\n args: fieldArgs ?? {},\n directives,\n object: null,\n union: {\n selections,\n __typename: typenameFlag === true,\n },\n });\n }) as unknown as AnyFieldAccessorReturn;\n\n return factoryReturn;\n }\n\n if (parsedType.kind === \"scalar\" || parsedType.kind === \"enum\") {\n const factoryReturn = (() =>\n wrap({\n parent: typeName,\n field: fieldName,\n type: fieldDef as DeferredOutputFieldWithArgs,\n args: fieldArgs ?? {},\n directives,\n object: null,\n union: null,\n })) as unknown as AnyFieldAccessorReturn;\n return factoryReturn;\n }\n\n throw new Error(`Unsupported field type kind: ${parsedType.kind}`);\n };\n};\n","/**\n * Fragment usage context using shared value container pattern.\n *\n * This module tracks fragment usages during operation building,\n * allowing metadata from spread fragments to be collected and aggregated.\n * Similar to field-path-context, uses a shared mutable container.\n */\n\nimport type { FieldPath } from \"./field-path-context\";\n\n/**\n * Record of a fragment being spread in an operation.\n * Stores metadata builder (not fragment reference) since fragment cannot reference itself.\n *\n * @template TFragmentMetadata - The type of metadata produced by the fragment's metadata builder\n */\nexport type FragmentUsageRecord<TFragmentMetadata = unknown> = {\n /** Metadata builder factory from the fragment, if defined */\n readonly metadataBuilder: (() => TFragmentMetadata | Promise<TFragmentMetadata>) | null;\n /** Field path where the fragment was spread */\n readonly path: FieldPath | null;\n};\n\n/**\n * Shared mutable container for collecting fragment usages.\n * Only synchronous access is supported.\n */\nconst fragmentUsageContext: { current: FragmentUsageRecord[] | null } = {\n current: null,\n};\n\n/**\n * Run a function with fragment usage collection enabled.\n * Returns both the function result and collected fragment usages.\n *\n * @internal\n */\nexport const withFragmentUsageCollection = <T>(fn: () => T): { result: T; usages: FragmentUsageRecord[] } => {\n const previousCollector = fragmentUsageContext.current;\n const usages: FragmentUsageRecord[] = [];\n fragmentUsageContext.current = usages;\n try {\n const result = fn();\n return { result, usages };\n } finally {\n fragmentUsageContext.current = previousCollector;\n }\n};\n\n/**\n * Record a fragment usage. Called when fragment.spread() is invoked.\n * No-op if not in a collection context.\n *\n * @internal\n */\nexport const recordFragmentUsage = (record: FragmentUsageRecord): void => {\n if (fragmentUsageContext.current) {\n fragmentUsageContext.current.push(record);\n }\n};\n","type ArgEntries<T extends object> = { [K in keyof T]-?: [value: T[K], key: K] }[keyof T];\ntype Entries<T extends object> = { [K in keyof T]: [key: K, value: T[K]] }[keyof T];\n\nexport function mapValues<TObject extends object, TMappedValue>(\n obj: TObject,\n fn: (...args: ArgEntries<TObject>) => TMappedValue,\n): {\n [K in keyof TObject]: TMappedValue;\n} {\n return Object.fromEntries((Object.entries(obj) as Entries<TObject>[]).map(([key, value]) => [key, fn(value, key)])) as {\n [K in keyof TObject]: TMappedValue;\n };\n}\n","/**\n * Utilities for creating variable assignments and references.\n * @module\n */\n\nimport { type AnyAssignableInput, createVarRefFromNestedValue, createVarRefFromVariable, VarRef } from \"../types/fragment\";\nimport type { AnyVarRef, NestedValue, VariableDefinitions } from \"../types/type-foundation\";\nimport { mapValues } from \"../utils/map-values\";\n\n/**\n * Creates variable assignments from provided values.\n *\n * Maps variable definitions to VarRefs. If a value is provided,\n * wraps it as a nested-value VarRef. If not provided, creates\n * an undefined VarRef (field will be omitted).\n *\n * Used when spreading fragments with partial variable values.\n *\n * @internal\n */\nexport const createVarAssignments = <TVariableDefinitions extends VariableDefinitions>(\n definitions: TVariableDefinitions,\n providedValues: AnyAssignableInput | void,\n): Readonly<Record<string, AnyVarRef>> => {\n return mapValues(definitions, (_, key): AnyVarRef => {\n const varName = key as string;\n if (!providedValues || providedValues[varName] === undefined) {\n return createVarRefFromNestedValue(undefined);\n }\n\n const provided = providedValues[varName];\n if (provided instanceof VarRef) {\n return provided;\n }\n\n return createVarRefFromNestedValue(provided as NestedValue);\n }) as Readonly<Record<string, AnyVarRef>>;\n};\n\n/**\n * Creates variable references from variable definitions.\n *\n * Maps each variable definition to a VarRef pointing to that variable.\n * Used in operation builders to create the `$` context object.\n *\n * @internal\n */\nexport const createVarRefs = <TVarDefinitions extends VariableDefinitions>(\n definitions: TVarDefinitions,\n): Readonly<Record<string, AnyVarRef>> =>\n mapValues(definitions as VariableDefinitions, (_, name): AnyVarRef => createVarRefFromVariable(name)) as Readonly<\n Record<string, AnyVarRef>\n >;\n","/**\n * Shared utility for merging variable definitions from interpolated fragments.\n * Used by both fragment and operation tagged template implementations.\n * @module\n */\n\nimport { Fragment } from \"../types/element\";\nimport type { AnyFragment } from \"../types/element/fragment\";\nimport type { AnyFieldsExtended } from \"../types/fragment\";\nimport type { AnyVarRef, VariableDefinitions } from \"../types/type-foundation\";\n\n/**\n * Merge variable definitions from interpolated fragments into the parent's variable definitions.\n * Deduplicates variables with matching names and types, throws on conflicting types.\n */\nexport function mergeVariableDefinitions(\n parentVars: VariableDefinitions,\n interpolationMap: ReadonlyMap<string, AnyFragment | ((ctx: { $: Readonly<Record<string, AnyVarRef>> }) => AnyFieldsExtended)>,\n): VariableDefinitions {\n const merged: Record<string, VariableDefinitions[string]> = { ...parentVars };\n\n for (const value of interpolationMap.values()) {\n // Only direct Fragment instances have variable definitions to merge\n // Callback interpolations handle their own variable context\n if (value instanceof Fragment) {\n const childVars = value.variableDefinitions;\n for (const [varName, varDef] of Object.entries(childVars)) {\n if (varName in merged) {\n // Variable already exists - check if types match\n const existing = merged[varName];\n // Compare kind, name, and modifier to determine if types are compatible\n if (existing?.kind !== varDef.kind || existing?.name !== varDef.name || existing?.modifier !== varDef.modifier) {\n throw new Error(\n `Variable definition conflict: $${varName} is defined with incompatible types ` +\n `(${existing?.kind}:${existing?.name}:${existing?.modifier} vs ${varDef.kind}:${varDef.name}:${varDef.modifier})`,\n );\n }\n // Types match - no need to duplicate\n } else {\n // New variable - add to merged definitions\n merged[varName] = varDef;\n }\n }\n }\n }\n\n return merged as VariableDefinitions;\n}\n","/**\n * Utilities for extracting values and paths from VarRefs.\n *\n * Provides type-safe access to nested values within VarRefs,\n * supporting both variable references and literal values.\n *\n * @module\n */\n\nimport type { ConstValue } from \"../types/type-foundation/const-value\";\nimport {\n type AnyVarRef,\n type AnyVarRefBrand,\n type NestedValueElement,\n VarRef,\n type VarRefInner,\n} from \"../types/type-foundation/var-ref\";\n\n/**\n * Recursively checks if a NestedValue contains any VarRef.\n *\n * Used by getVarRefValue to determine if it's safe to return as ConstValue.\n * @internal\n */\nexport const hasVarRefInside = (value: NestedValueElement | unknown): boolean => {\n if (value instanceof VarRef) {\n return true;\n }\n\n if (Array.isArray(value)) {\n return value.some(hasVarRefInside);\n }\n\n if (typeof value === \"object\" && value !== null) {\n return Object.values(value).some(hasVarRefInside);\n }\n\n return false;\n};\n\n/**\n * Get the variable name from a VarRef.\n * Throws if the VarRef contains a nested-value instead of a variable reference.\n */\nexport const getVarRefName = (varRef: AnyVarRef): string => {\n const inner = VarRef.getInner(varRef);\n if (inner.type !== \"variable\") {\n throw new Error(\"Expected variable reference, got nested-value\");\n }\n return inner.name;\n};\n\n/**\n * Get the const value from a VarRef.\n * Throws if the VarRef contains a variable reference instead of a nested-value,\n * or if the nested-value contains any VarRef inside.\n */\nexport const getVarRefValue = (varRef: AnyVarRef): ConstValue => {\n const inner = VarRef.getInner(varRef);\n if (inner.type !== \"nested-value\") {\n throw new Error(\"Expected nested-value, got variable reference\");\n }\n if (hasVarRefInside(inner.value)) {\n throw new Error(\"Cannot get const value: nested-value contains VarRef\");\n }\n return inner.value as ConstValue;\n};\n\n// ============================================================================\n// Path Types and Utilities\n// ============================================================================\n/**\n * Path segment types for navigating nested values.\n */\nexport type PathSegment = string;\n\n// biome-ignore lint/suspicious/noExplicitAny: abstract type\ntype AnySelectableProxy = any;\n\n/**\n * Type-safe path builder function.\n * Used with getNameAt and getValueAt helpers.\n */\nexport type Selector<T, U> = (proxy: T) => U;\ntype ProxyInner = {\n readonly varInner: VarRefInner | { type: \"virtual\"; varName: string; varSegments: readonly PathSegment[] };\n readonly segments: readonly PathSegment[];\n};\nconst SelectableProxyInnerRegistry = new WeakMap<AnySelectableProxy, ProxyInner>();\nconst getSelectableProxyInner = (proxy: AnySelectableProxy): ProxyInner => {\n const inner = SelectableProxyInnerRegistry.get(proxy);\n if (!inner) {\n throw new Error(`Proxy inner not found`);\n }\n return inner;\n};\nconst createSelectableProxy = <T>(current: ProxyInner): T => {\n const proxy: T = new Proxy(Object.create(null), {\n get(_, property) {\n if (typeof property === \"symbol\") {\n throw new Error(`Prohibited property access: ${String(property)}`);\n }\n const nextSegments = [...current.segments, property];\n\n if (current.varInner.type === \"virtual\") {\n return createSelectableProxy({\n varInner: current.varInner,\n segments: nextSegments,\n });\n }\n\n if (current.varInner.type === \"variable\") {\n return createSelectableProxy({\n varInner: { type: \"virtual\", varName: current.varInner.name, varSegments: nextSegments },\n segments: nextSegments,\n });\n }\n\n if (typeof current.varInner.value === \"object\" && current.varInner.value !== null) {\n const value = (current.varInner.value as { [key: string]: NestedValueElement })[property];\n return createSelectableProxy({\n varInner: value instanceof VarRef ? VarRef.getInner(value) : { type: \"nested-value\", value },\n segments: nextSegments,\n });\n }\n\n throw new Error(`Cannot access children of primitive value at path [${current.segments.join(\".\")}]`);\n },\n });\n\n SelectableProxyInnerRegistry.set(proxy, current);\n\n return proxy;\n};\n\n/**\n * Get the variable name from a VarRef at a specific path.\n *\n * @param varRef - The VarRef containing a nested-value\n * @param selector - Path builder function, e.g., p => p.user.age\n * @returns The variable name at the specified path\n * @throws If path doesn't lead to a VarRef with type \"variable\"\n *\n * @example\n * const ref = createVarRefFromNestedValue({\n * user: { age: someVariableRef }\n * });\n * getNameAt(ref, p => p.user.age); // returns the variable name\n */\nexport const getNameAt = <T, U>(varRef: VarRef<AnyVarRefBrand>, selector: (proxy: T) => U): string => {\n const proxy = createSelectableProxy<T>({ varInner: VarRef.getInner(varRef), segments: [] });\n const selected = selector(proxy);\n const inner = getSelectableProxyInner(selected);\n\n if (inner.varInner.type === \"virtual\") {\n throw new Error(`Value at path [${inner.segments.join(\".\")}] is inside a variable`);\n }\n\n if (inner.varInner.type !== \"variable\") {\n throw new Error(`Value at path [${inner.segments.join(\".\")}] is not a variable`);\n }\n\n return inner.varInner.name;\n};\n\n/**\n * Get the const value from a nested-value VarRef at a specific path.\n *\n * @param varRef - The VarRef containing a nested-value\n * @param pathFn - Path builder function, e.g., p => p.user.name\n * @returns The const value at the specified path\n * @throws If path leads to a VarRef or if value contains VarRef inside\n *\n * @example\n * const ref = createVarRefFromNestedValue({\n * user: { name: \"Alice\", age: someVariableRef }\n * });\n * getValueAt(ref, p => p.user.name); // returns \"Alice\"\n */\nexport const getValueAt = <T, U>(varRef: VarRef<AnyVarRefBrand>, selector: (proxy: T) => U): U => {\n const proxy = createSelectableProxy<T>({ varInner: VarRef.getInner(varRef), segments: [] });\n const selected = selector(proxy);\n const inner = getSelectableProxyInner(selected);\n\n if (inner.varInner.type === \"virtual\") {\n throw new Error(`Value at path [${inner.segments.join(\".\")}] is inside a variable`);\n }\n\n if (inner.varInner.type !== \"nested-value\") {\n throw new Error(`Value at path [${inner.segments.join(\".\")}] is not a nested-value`);\n }\n\n if (hasVarRefInside(inner.varInner.value)) {\n throw new Error(`Value at path [${inner.segments.join(\".\")}] contains nested VarRef`);\n }\n\n return inner.varInner.value as U;\n};\n\n/**\n * Gets the full path to a variable within a nested structure.\n *\n * Returns path segments starting with `$variableName` followed by\n * property accesses within that variable's value.\n *\n * @example\n * ```typescript\n * getVariablePath($.filter, p => p.user.id)\n * // Returns: [\"$filter\", \"user\", \"id\"]\n * ```\n */\nexport const getVariablePath = <T, U>(varRef: VarRef<AnyVarRefBrand>, selector: (proxy: T) => U): readonly PathSegment[] => {\n const proxy = createSelectableProxy<T>({ varInner: VarRef.getInner(varRef), segments: [] });\n const selected = selector(proxy);\n const inner = getSelectableProxyInner(selected);\n\n if (inner.varInner.type === \"virtual\") {\n return [`$${inner.varInner.varName}`, ...inner.segments.slice(inner.varInner.varSegments.length)];\n }\n\n if (inner.varInner.type === \"variable\") {\n return [`$${inner.varInner.name}`];\n }\n\n throw new Error(`Value at path [${inner.segments.join(\".\")}] is not a variable or inside a variable`);\n};\n\n// ============================================================================\n// Singleton for metadata builder context\n// ============================================================================\n\nimport type { VarRefTools } from \"../types/metadata/metadata\";\n\n/** Pre-built tools object passed as `$var` in metadata builder callbacks. */\nexport const varRefTools: VarRefTools = Object.freeze({\n getName: getVarRefName,\n getValue: getVarRefValue,\n getNameAt,\n getValueAt,\n getPath: getVariablePath,\n hasVarRefInside,\n});\n","/**\n * Fragment tagged template function for creating GraphQL fragments from template literals.\n * Supports Fragment Arguments RFC syntax for parameterized fragments.\n * @module\n */\n\nimport { Kind, parse as parseGraphql, type SelectionSetNode } from \"graphql\";\nimport { buildVarSpecifiers, createSchemaIndexFromSchema, preprocessFragmentArgs } from \"../graphql\";\nimport { findMatchingParen } from \"../graphql/fragment-args-preprocessor\";\nimport type { SchemaIndex } from \"../graphql/schema-index\";\nimport { Fragment } from \"../types/element\";\nimport type { AnyFragment } from \"../types/element/fragment\";\nimport type { AnyFieldSelection, AnyFieldsExtended } from \"../types/fragment\";\nimport type { VarRefTools } from \"../types/metadata/metadata\";\nimport type { AnyGraphqlSchema } from \"../types/schema\";\nimport type { AnyVarRef, VariableDefinitions } from \"../types/type-foundation\";\nimport type { AnyDirectiveRef } from \"../types/type-foundation/directive-ref\";\nimport { DirectiveRef } from \"../types/type-foundation/directive-ref\";\nimport { createVarRefFromVariable } from \"../types/type-foundation/var-ref\";\nimport { parseOutputField } from \"../utils/deferred-specifier-parser\";\nimport { createFieldFactories } from \"./fields-builder\";\nimport { recordFragmentUsage } from \"./fragment-usage-context\";\nimport { createVarAssignments } from \"./input\";\nimport { mergeVariableDefinitions } from \"./merge-variable-definitions\";\nimport type { FragmentTemplateMetadataOptions, TemplateResult } from \"./operation-tagged-template\";\nimport { varRefTools } from \"./var-ref-tools\";\n\n/** Tagged template function type for fragments. */\nexport type FragmentTaggedTemplateFunction = (\n strings: TemplateStringsArray,\n ...values: (AnyFragment | ((ctx: { $: Readonly<Record<string, AnyVarRef>> }) => AnyFieldsExtended))[]\n) => TemplateResult<AnyFragment>;\n\n/**\n * Extract the argument list text from a fragment definition with Fragment Arguments syntax.\n * Returns the text between parens in `fragment Name(...) on Type`, or null if no args.\n */\nfunction extractFragmentArgText(rawSource: string): string | null {\n const match = /\\bfragment\\s+\\w+\\s*\\(/.exec(rawSource);\n if (!match) return null;\n\n const openIndex = match.index + match[0].length - 1;\n const closeIndex = findMatchingParen(rawSource, openIndex);\n if (closeIndex === -1) return null;\n\n const afterParen = rawSource.slice(closeIndex + 1).trimStart();\n if (afterParen.startsWith(\"on\")) {\n return rawSource.slice(openIndex + 1, closeIndex);\n }\n return null;\n}\n\n/**\n * Extract variable definitions from Fragment Arguments syntax.\n * Wraps the argument list in a synthetic query to parse with graphql-js.\n */\nexport function extractFragmentVariables(rawSource: string, schemaIndex: SchemaIndex): VariableDefinitions {\n const argText = extractFragmentArgText(rawSource);\n if (!argText?.trim()) return {};\n\n const syntheticQuery = `query _Synthetic(${argText}) { __typename }`;\n\n let syntheticDoc: import(\"graphql\").DocumentNode;\n try {\n syntheticDoc = parseGraphql(syntheticQuery);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to parse fragment argument definitions: ${message}`);\n }\n\n const opDef = syntheticDoc.definitions[0];\n if (!opDef || opDef.kind !== Kind.OPERATION_DEFINITION) {\n return {};\n }\n\n const varDefNodes = opDef.variableDefinitions ?? [];\n // BuiltVarSpecifier is structurally compatible at runtime; cast needed because\n // BuiltVarSpecifier.defaultValue uses `unknown` while VarSpecifier uses `ConstValue`\n return buildVarSpecifiers(varDefNodes, schemaIndex) as VariableDefinitions;\n}\n\n/**\n * Filters out named fragment spreads that cannot be resolved without an interpolation map.\n * Used when building fields from compat templates or zero-interpolation tagged templates\n * that may contain standard GraphQL `...FragmentName` spreads.\n */\nexport function filterUnresolvedFragmentSpreads(\n selectionSet: SelectionSetNode,\n interpolationMap?: ReadonlyMap<string, unknown>,\n): SelectionSetNode {\n return {\n ...selectionSet,\n selections: selectionSet.selections\n .filter((sel) => {\n if (sel.kind !== Kind.FRAGMENT_SPREAD) return true;\n // Keep spreads that are in the interpolation map (e.g., __INTERPOLATION_N__)\n return interpolationMap?.has(sel.name.value) ?? false;\n })\n .map((sel) => {\n // Recurse into field and inline fragment selection sets\n if (sel.kind === Kind.FIELD && sel.selectionSet) {\n return { ...sel, selectionSet: filterUnresolvedFragmentSpreads(sel.selectionSet, interpolationMap) };\n }\n if (sel.kind === Kind.INLINE_FRAGMENT && sel.selectionSet) {\n return { ...sel, selectionSet: filterUnresolvedFragmentSpreads(sel.selectionSet, interpolationMap) };\n }\n return sel;\n }),\n };\n}\n\n/**\n * Builds field selections from a GraphQL AST SelectionSet by driving field factories.\n * Converts parsed AST selections into the AnyFieldsExtended format that the document builder expects.\n * Also used by typegen for static field extraction from tagged templates.\n */\nexport function buildFieldsFromSelectionSet(\n selectionSet: SelectionSetNode,\n schema: AnyGraphqlSchema,\n typeName: string,\n varAssignments?: Readonly<Record<string, AnyVarRef>>,\n interpolationMap?: ReadonlyMap<string, AnyFragment | ((ctx: { $: Readonly<Record<string, AnyVarRef>> }) => AnyFieldsExtended)>,\n): AnyFieldsExtended {\n const f = createFieldFactories(schema, typeName);\n const result: Record<string, unknown> = {};\n\n for (const selection of selectionSet.selections) {\n if (selection.kind === Kind.FIELD) {\n const fieldName = selection.name.value;\n const alias = selection.alias?.value ?? fieldName;\n // __typename is an implicit introspection field on all object types\n if (fieldName === \"__typename\") {\n result[alias] = true;\n continue;\n }\n\n // Build args and directives from AST\n const args = buildArgsFromASTArguments(selection.arguments ?? [], varAssignments);\n const directives = buildDirectivesFromAST(selection.directives, varAssignments);\n const hasAlias = alias !== fieldName;\n const extras =\n hasAlias || directives.length > 0\n ? { ...(hasAlias ? { alias } : {}), ...(directives.length > 0 ? { directives } : {}) }\n : undefined;\n\n if (selection.selectionSet) {\n // Object/union field — f(\"fieldName\", args, extras) returns a curried function\n const curried = f(fieldName, args as AnyFieldSelection[\"args\"], extras);\n if (typeof curried === \"function\") {\n // Detect union type via field specifier (runtime duck-typing)\n const typeDef = schema.object[typeName];\n const fieldDefRaw = typeDef?.fields[fieldName];\n const fieldSpec = typeof fieldDefRaw === \"string\" ? fieldDefRaw : (fieldDefRaw as unknown as { spec: string })?.spec;\n const parsedType = parseOutputField(fieldSpec as import(\"../types/type-foundation\").DeferredOutputField);\n\n if (parsedType.kind === \"union\") {\n // Union field: collect InlineFragmentNodes, build NestedUnionFieldsBuilder input\n const unionInput: Record<string, unknown> = {};\n let hasTypename = false;\n const unsupportedSelections: string[] = [];\n\n for (const sel of selection.selectionSet.selections) {\n if (sel.kind === Kind.INLINE_FRAGMENT) {\n if (!sel.typeCondition) {\n throw new Error(\"Inline fragments without type conditions are not supported in tagged templates\");\n }\n const memberName = sel.typeCondition.name.value;\n // Validate member is part of the union\n const unionDef = schema.union[parsedType.name];\n if (!unionDef) {\n throw new Error(`Union \"${parsedType.name}\" is not defined in schema`);\n }\n const isMember = memberName in unionDef.types;\n if (!isMember) {\n throw new Error(\n `Type \"${memberName}\" is not a member of union \"${parsedType.name}\" in tagged template inline fragment`,\n );\n }\n if (memberName in unionInput) {\n throw new Error(\n `Duplicate inline fragment for union member \"${memberName}\" in tagged template. ` +\n `Merge selections into a single \"... on ${memberName} { ... }\" block.`,\n );\n }\n const memberFields = buildFieldsFromSelectionSet(\n sel.selectionSet,\n schema,\n memberName,\n varAssignments,\n interpolationMap,\n );\n const memberDirectives = buildDirectivesFromAST(sel.directives, varAssignments, \"INLINE_FRAGMENT\");\n unionInput[memberName] = { fields: memberFields, directives: memberDirectives };\n } else if (sel.kind === Kind.FIELD && sel.name.value === \"__typename\") {\n if (sel.alias) {\n throw new Error(\n `Aliases on __typename in union selections are not supported in tagged templates. ` +\n `Use \"__typename\" without an alias.`,\n );\n }\n if (sel.directives?.length) {\n throw new Error(`Directives on __typename in union selections are not supported in tagged templates.`);\n }\n hasTypename = true;\n } else {\n // Track unsupported selections for deferred error reporting\n const desc = sel.kind === Kind.FIELD ? `Field \"${sel.name.value}\"` : \"Fragment spread\";\n unsupportedSelections.push(desc);\n }\n }\n\n // Post-loop validation\n const hasInlineFragments = Object.keys(unionInput).length > 0;\n\n if (unsupportedSelections.length > 0) {\n if (hasInlineFragments) {\n // Unsupported selections alongside real inline fragments\n throw new Error(\n `${unsupportedSelections[0]} alongside inline fragments in union selection is not supported in tagged templates. Use per-member inline fragments instead.`,\n );\n }\n // No inline fragments at all — require them\n throw new Error(\n `Union field \"${fieldName}\" requires at least __typename or inline fragment syntax (... on Type { fields }) in tagged templates`,\n );\n }\n\n // Must have at least __typename or an inline fragment\n if (!hasInlineFragments && !hasTypename) {\n throw new Error(\n `Union field \"${fieldName}\" requires at least __typename or inline fragment syntax (... on Type { fields }) in tagged templates`,\n );\n }\n\n if (hasTypename) {\n (unionInput as Record<string, unknown>).__typename = true;\n }\n\n const fieldResult = (curried as (nest: unknown) => Record<string, unknown>)(unionInput);\n Object.assign(result, fieldResult);\n } else {\n // Object field: existing path\n const nestedFields = buildFieldsFromSelectionSet(\n selection.selectionSet,\n schema,\n resolveFieldTypeName(schema, typeName, fieldName),\n varAssignments,\n interpolationMap,\n );\n const fieldResult = (curried as (nest: unknown) => Record<string, unknown>)(\n ({ f: nestedFactories }: { f: unknown }) => {\n // Ignore the provided factories; use pre-built fields\n void nestedFactories;\n return nestedFields;\n },\n );\n Object.assign(result, fieldResult);\n }\n } else {\n Object.assign(result, curried);\n }\n } else {\n // Scalar/enum field — f(\"fieldName\", args, extras) returns the field selection directly\n const fieldResult = f(fieldName, args as AnyFieldSelection[\"args\"], extras);\n if (typeof fieldResult === \"function\") {\n // Object field used without selection set — just call with empty builder\n const emptyResult = (fieldResult as (nest: unknown) => Record<string, unknown>)(() => ({}));\n Object.assign(result, emptyResult);\n } else {\n Object.assign(result, fieldResult);\n }\n }\n } else if (selection.kind === Kind.FRAGMENT_SPREAD) {\n // Handle fragment spread: ...FragmentName\n const fragmentName = selection.name.value;\n\n // Check interpolation map for interpolated fragments\n if (interpolationMap?.has(fragmentName)) {\n const interpolatedValue = interpolationMap.get(fragmentName);\n if (!interpolatedValue) {\n throw new Error(`Interpolation placeholder \"${fragmentName}\" has no value`);\n }\n\n let spreadFields: AnyFieldsExtended;\n if (interpolatedValue instanceof Fragment) {\n // Direct fragment interpolation: ...${frag}\n spreadFields = interpolatedValue.spread(varAssignments as never);\n } else {\n // Callback interpolation: ...${($) => frag.spread(args)}\n if (!varAssignments) {\n throw new Error(`Callback interpolation requires variable context`);\n }\n spreadFields = interpolatedValue({ $: varAssignments });\n }\n Object.assign(result, spreadFields);\n } else {\n // Fragment spread without interpolation - must use interpolation syntax\n throw new Error(\n `Fragment spread \"...${fragmentName}\" in tagged template must use interpolation syntax. ` +\n `Use \\`...@\\${fragment}\\` instead of \\`...FragmentName\\`.`,\n );\n }\n } else if (selection.kind === Kind.INLINE_FRAGMENT) {\n throw new Error(\n \"Inline fragments (... on Type) at the top level are not supported in tagged templates. \" +\n \"Use inline fragments only inside union field selections.\",\n );\n }\n }\n\n return result as AnyFieldsExtended;\n}\n\n/**\n * Convert GraphQL AST DirectiveNodes to DirectiveRef instances.\n * Reuses buildArgsFromASTArguments for directive argument conversion.\n */\nfunction buildDirectivesFromAST(\n directives: readonly import(\"graphql\").DirectiveNode[] | undefined,\n varAssignments?: Readonly<Record<string, AnyVarRef>>,\n location: import(\"../types/type-foundation/directive-ref\").ExecutableDirectiveLocation = \"FIELD\",\n): AnyDirectiveRef[] {\n if (!directives || directives.length === 0) return [];\n return directives.map(\n (d) =>\n new DirectiveRef({\n name: d.name.value,\n arguments: buildArgsFromASTArguments(d.arguments ?? [], varAssignments),\n locations: [location],\n }),\n );\n}\n\n/**\n * Build a simple args object from GraphQL AST argument nodes.\n * Extracts literal values from the AST for passing to field factories.\n */\nfunction buildArgsFromASTArguments(\n args: readonly {\n readonly name: { readonly value: string };\n readonly value: { readonly kind: string; readonly value?: unknown };\n }[],\n varAssignments?: Readonly<Record<string, AnyVarRef>>,\n): Record<string, unknown> {\n if (args.length === 0) return {};\n const result: Record<string, unknown> = {};\n for (const arg of args) {\n result[arg.name.value] = extractASTValue(arg.value, varAssignments);\n }\n return result;\n}\n\n/**\n * Extract a runtime value from a GraphQL AST ValueNode.\n */\nfunction extractASTValue(\n node: {\n readonly kind: string;\n readonly value?: unknown;\n readonly values?: readonly unknown[];\n readonly fields?: readonly { readonly name: { readonly value: string }; readonly value: unknown }[];\n },\n varAssignments?: Readonly<Record<string, AnyVarRef>>,\n): unknown {\n switch (node.kind) {\n case Kind.INT:\n return Number.parseInt(node.value as string, 10);\n case Kind.FLOAT:\n return Number.parseFloat(node.value as string);\n case Kind.STRING:\n case Kind.BOOLEAN:\n case Kind.ENUM:\n return node.value;\n case Kind.NULL:\n return null;\n case Kind.LIST:\n return (node.values as readonly { kind: string; value?: unknown }[])?.map((v) => extractASTValue(v, varAssignments)) ?? [];\n case Kind.OBJECT:\n return Object.fromEntries(\n (node.fields ?? []).map((f) => [\n f.name.value,\n extractASTValue(f.value as { kind: string; value?: unknown }, varAssignments),\n ]),\n );\n case Kind.VARIABLE: {\n const varName = (node as unknown as { name: { value: string } }).name.value;\n if (varAssignments && varName in varAssignments) {\n // biome-ignore lint/style/noNonNullAssertion: Checked with `in` operator above\n return varAssignments[varName]!;\n }\n return createVarRefFromVariable(varName);\n }\n default:\n return undefined;\n }\n}\n\n/**\n * Resolve the output type name for a field on a given type.\n * Looks up the field's type specifier in the schema and extracts the type name.\n * Handles both string specifiers (\"o|Avatar|?\") and object specifiers ({ spec: \"o|Avatar|?\" }).\n */\nfunction resolveFieldTypeName(schema: AnyGraphqlSchema, typeName: string, fieldName: string): string {\n const typeDef = schema.object[typeName];\n if (!typeDef) {\n throw new Error(`Type \"${typeName}\" is not defined in schema objects`);\n }\n // Runtime duck-typing: codegen may emit string or { spec, arguments }\n const fieldDef = typeDef.fields[fieldName] as string | { spec: string } | undefined;\n if (!fieldDef) {\n throw new Error(`Field \"${fieldName}\" is not defined on type \"${typeName}\"`);\n }\n const specStr = typeof fieldDef === \"string\" ? fieldDef : fieldDef.spec;\n const parts = specStr.split(\"|\");\n return parts[1] ?? typeName;\n}\n\n/** Curried fragment function type: fragment(\"name\", \"type\")`{ fields }` */\nexport type CurriedFragmentFunction = (name: string, typeName: string) => FragmentTaggedTemplateFunction;\n\n/**\n * Construct a synthetic GraphQL fragment source from JS arguments and template body.\n * Handles optional variable declarations: `($var: Type!) { fields }` or `{ fields }`.\n */\nfunction buildSyntheticFragmentSource(name: string, typeName: string, body: string): string {\n const trimmed = body.trim();\n if (trimmed.startsWith(\"(\")) {\n // Has variable declarations — find the matching closing paren\n const closeIndex = findMatchingParen(trimmed, 0);\n if (closeIndex === -1) {\n throw new Error(\"Unmatched parenthesis in fragment variable declarations\");\n }\n const varDecls = trimmed.slice(0, closeIndex + 1);\n const selectionSet = trimmed.slice(closeIndex + 1).trim();\n return `fragment ${name}${varDecls} on ${typeName} ${selectionSet}`;\n }\n return `fragment ${name} on ${typeName} ${trimmed}`;\n}\n\n/**\n * Creates a curried tagged template function for fragments.\n * New API: `fragment(\"name\", \"type\")\\`{ fields }\\`` returns TemplateResult<AnyFragment>.\n *\n * @param schema - The GraphQL schema definition\n */\nexport function createFragmentTaggedTemplate<TSchema extends AnyGraphqlSchema>(schema: TSchema): CurriedFragmentFunction {\n const schemaIndex = createSchemaIndexFromSchema(schema);\n\n return (fragmentName: string, onType: string): FragmentTaggedTemplateFunction => {\n // Validate onType exists in schema at curried call time\n if (!(onType in schema.object)) {\n throw new Error(`Type \"${onType}\" is not defined in schema objects`);\n }\n\n return (\n strings: TemplateStringsArray,\n ...values: (AnyFragment | ((ctx: { $: Readonly<Record<string, AnyVarRef>> }) => AnyFieldsExtended))[]\n ): TemplateResult<AnyFragment> => {\n // Validate interpolated values are fragments or callbacks\n for (let i = 0; i < values.length; i++) {\n const value = values[i];\n if (!(value instanceof Fragment) && typeof value !== \"function\") {\n throw new Error(\n `Tagged templates only accept Fragment instances or callback functions as interpolated values. ` +\n `Received ${typeof value} at position ${i}.`,\n );\n }\n }\n\n // Build template body with placeholders for interpolations\n let body = strings[0] ?? \"\";\n const interpolationMap = new Map<\n string,\n AnyFragment | ((ctx: { $: Readonly<Record<string, AnyVarRef>> }) => AnyFieldsExtended)\n >();\n\n for (let i = 0; i < values.length; i++) {\n const placeholderName = `__INTERPOLATION_${i}__`;\n interpolationMap.set(\n placeholderName,\n values[i] as AnyFragment | ((ctx: { $: Readonly<Record<string, AnyVarRef>> }) => AnyFieldsExtended),\n );\n body += placeholderName + (strings[i + 1] ?? \"\");\n }\n\n // Construct synthetic GraphQL source from JS args and template body\n const rawSource = buildSyntheticFragmentSource(fragmentName, onType, body);\n\n // Extract variables from Fragment Arguments syntax\n let varSpecifiers = extractFragmentVariables(rawSource, schemaIndex);\n\n // Merge variable definitions from interpolated fragments\n varSpecifiers = mergeVariableDefinitions(varSpecifiers, interpolationMap);\n\n // Preprocess to strip Fragment Arguments syntax\n const { preprocessed } = preprocessFragmentArgs(rawSource);\n\n // Parse the preprocessed GraphQL\n let document: import(\"graphql\").DocumentNode;\n try {\n document = parseGraphql(preprocessed);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`GraphQL parse error in tagged template: ${message}`);\n }\n\n // Extract the fragment definition (synthesized source guarantees exactly one)\n const fragmentDefs = document.definitions.filter((def) => def.kind === Kind.FRAGMENT_DEFINITION);\n if (fragmentDefs.length !== 1) {\n throw new Error(`Internal error: expected exactly one fragment definition in synthesized source`);\n }\n\n // biome-ignore lint/style/noNonNullAssertion: Length checked above\n const fragNode = fragmentDefs[0]!;\n if (fragNode.kind !== Kind.FRAGMENT_DEFINITION) {\n throw new Error(\"Unexpected definition kind\");\n }\n\n return (options?: FragmentTemplateMetadataOptions): AnyFragment => {\n // biome-ignore lint/suspicious/noExplicitAny: Fragment.create requires concrete schema type\n return Fragment.create<any, typeof onType, typeof varSpecifiers, AnyFieldsExtended>(() => ({\n typename: onType,\n key: fragmentName,\n schemaLabel: schema.label,\n variableDefinitions: varSpecifiers,\n // biome-ignore lint/suspicious/noExplicitAny: Runtime-only spread needs dynamic variable types\n spread: (variables: any) => {\n const $ = createVarAssignments(varSpecifiers, variables);\n\n // Handle metadata - can be static value or callback\n let metadataBuilder: (() => unknown | Promise<unknown>) | null = null;\n if (options?.metadata !== undefined) {\n const metadata = options.metadata;\n if (typeof metadata === \"function\") {\n metadataBuilder = () =>\n (metadata as (ctx: { $: unknown; $var: VarRefTools }) => unknown | Promise<unknown>)({\n $,\n $var: varRefTools,\n });\n } else {\n metadataBuilder = () => metadata;\n }\n }\n\n recordFragmentUsage({\n metadataBuilder,\n path: null,\n });\n\n return buildFieldsFromSelectionSet(\n fragNode.selectionSet,\n schema,\n onType,\n $ as Readonly<Record<string, AnyVarRef>>,\n interpolationMap,\n );\n },\n // biome-ignore lint/suspicious/noExplicitAny: Tagged template fragments bypass full type inference\n })) as any;\n };\n };\n };\n}\n","/**\n * Core operation building logic shared by operation and extend composers.\n * @module\n * @internal\n */\n\nimport type { VariableDefinitionNode } from \"graphql\";\nimport { Operation } from \"../types/element\";\nimport type { AnyOperationOf } from \"../types/element/operation\";\nimport type { AnyFieldsExtended } from \"../types/fragment\";\nimport type {\n AnyMetadataAdapter,\n DocumentTransformer,\n ExtractAdapterTypes,\n FragmentMetaInfo,\n MetadataBuilder,\n OperationDocumentTransformer,\n} from \"../types/metadata\";\nimport type { AnyGraphqlSchema, OperationType } from \"../types/schema\";\nimport type { VariableDefinitions } from \"../types/type-foundation\";\nimport { isPromiseLike } from \"../utils/promise\";\nimport { buildDocument } from \"./build-document\";\nimport type { FieldsBuilder } from \"./fields-builder\";\nimport { createFieldFactories } from \"./fields-builder\";\nimport { withFragmentUsageCollection } from \"./fragment-usage-context\";\nimport { createVarRefs } from \"./input\";\nimport { varRefTools } from \"./var-ref-tools\";\n\n/**\n * Shared base parameters for building an operation artifact.\n * @internal\n */\ntype OperationCoreParamsBase<\n TSchema extends AnyGraphqlSchema,\n TOperationType extends OperationType,\n TOperationName extends string,\n TVarDefinitions extends VariableDefinitions,\n TOperationMetadata,\n TAdapter extends AnyMetadataAdapter,\n> = {\n readonly schema: TSchema;\n readonly operationType: TOperationType;\n readonly operationTypeName: TSchema[\"operations\"][TOperationType] & keyof TSchema[\"object\"] & string;\n readonly operationName: TOperationName;\n readonly variables: TVarDefinitions;\n /** Pre-parsed VariableDefinitionNode[] from tagged template or options object parser */\n readonly variableDefinitionNodes?: readonly VariableDefinitionNode[];\n readonly adapter: TAdapter;\n readonly metadata?: MetadataBuilder<\n Readonly<Record<string, import(\"../types/type-foundation\").AnyVarRef>>,\n TOperationMetadata,\n ExtractAdapterTypes<TAdapter>[\"aggregatedFragmentMetadata\"],\n ExtractAdapterTypes<TAdapter>[\"schemaLevel\"]\n >;\n readonly transformDocument?: OperationDocumentTransformer<TOperationMetadata>;\n readonly adapterTransformDocument?: DocumentTransformer<\n ExtractAdapterTypes<TAdapter>[\"schemaLevel\"],\n ExtractAdapterTypes<TAdapter>[\"aggregatedFragmentMetadata\"]\n >;\n};\n\n/**\n * Parameters for building an operation artifact.\n * Uses `fieldsFactory` to evaluate fields and build document.\n *\n * @internal Used by extend.ts and operation-tagged-template.ts\n */\nexport type OperationCoreParams<\n TSchema extends AnyGraphqlSchema,\n TOperationType extends OperationType,\n TOperationName extends string,\n TVarDefinitions extends VariableDefinitions,\n TFields extends AnyFieldsExtended,\n TOperationMetadata,\n TAdapter extends AnyMetadataAdapter,\n> = OperationCoreParamsBase<TSchema, TOperationType, TOperationName, TVarDefinitions, TOperationMetadata, TAdapter> & {\n readonly fieldsFactory: FieldsBuilder<TFields>;\n};\n\n/**\n * Result type from buildOperationArtifact.\n * Matches the artifact shape expected by Operation.create().\n */\nexport type OperationArtifactResult<\n TOperationType extends OperationType,\n TOperationName extends string,\n TVarDefinitions extends VariableDefinitions,\n TFields extends AnyFieldsExtended,\n TOperationMetadata,\n> = {\n readonly operationType: TOperationType;\n readonly operationName: TOperationName;\n readonly schemaLabel: string;\n readonly variableNames: (keyof TVarDefinitions & string)[];\n readonly documentSource: () => TFields;\n readonly document: ReturnType<typeof buildDocument>;\n readonly metadata: TOperationMetadata | undefined;\n};\n\n/**\n * Builds an operation artifact from the provided parameters.\n *\n * This function contains the core logic for:\n * - Creating variable refs and field factories\n * - Evaluating fields with fragment usage tracking\n * - Building the document\n * - Handling metadata (sync and async)\n * - Applying document transformations\n *\n * @param params - Operation building parameters\n * @returns Operation artifact or Promise of artifact (if async metadata)\n *\n * @internal Used by extend.ts and operation-tagged-template.ts\n */\nexport const buildOperationArtifact = <\n TSchema extends AnyGraphqlSchema,\n TOperationType extends OperationType,\n TOperationName extends string,\n TVarDefinitions extends VariableDefinitions,\n TFields extends AnyFieldsExtended,\n TOperationMetadata,\n TAdapter extends AnyMetadataAdapter,\n>(\n params: OperationCoreParams<TSchema, TOperationType, TOperationName, TVarDefinitions, TFields, TOperationMetadata, TAdapter>,\n):\n | OperationArtifactResult<TOperationType, TOperationName, TVarDefinitions, TFields, TOperationMetadata>\n | Promise<OperationArtifactResult<TOperationType, TOperationName, TVarDefinitions, TFields, TOperationMetadata>> => {\n type TFragmentMetadata = ExtractAdapterTypes<TAdapter>[\"fragmentMetadata\"];\n type TAggregatedFragmentMetadata = ExtractAdapterTypes<TAdapter>[\"aggregatedFragmentMetadata\"];\n type TSchemaLevel = ExtractAdapterTypes<TAdapter>[\"schemaLevel\"];\n\n const {\n schema,\n operationType,\n operationTypeName,\n operationName,\n variables,\n variableDefinitionNodes,\n adapter,\n metadata: metadataBuilder,\n transformDocument: operationTransformDocument,\n adapterTransformDocument,\n } = params;\n\n // Create variable refs (needed for both field factory and metadata builder)\n const $ = createVarRefs<TVarDefinitions>(variables);\n\n const { fieldsFactory } = params;\n const f = createFieldFactories(schema, operationTypeName);\n\n // Evaluate fields with fragment tracking\n const collected = withFragmentUsageCollection(() => fieldsFactory({ f, $ }));\n const fields = collected.result;\n type FragmentUsage = ReturnType<typeof withFragmentUsageCollection>[\"usages\"];\n const fragmentUsages: FragmentUsage = collected.usages;\n\n // Build document\n const document = buildDocument<\n TSchema,\n TSchema[\"operations\"][TOperationType] & keyof TSchema[\"object\"] & string,\n TFields,\n TVarDefinitions\n >({\n operationName,\n operationType,\n operationTypeName,\n variableDefinitionNodes,\n variables,\n fields,\n schema,\n });\n\n const variableNames = Object.keys(variables) as (keyof TVarDefinitions & string)[];\n\n // 4. Check if any fragment has a metadata builder\n const hasFragmentMetadata = fragmentUsages.some((u) => u.metadataBuilder);\n\n // Fast path: no metadata to evaluate and no transform\n if (!hasFragmentMetadata && !metadataBuilder && !adapterTransformDocument && !operationTransformDocument) {\n return {\n operationType,\n operationName,\n schemaLabel: schema.label,\n variableNames,\n documentSource: () => fields,\n document: document as ReturnType<typeof buildDocument>,\n metadata: undefined,\n };\n }\n\n // 5. Helper to aggregate fragment metadata\n const aggregateFragmentMetadata = (\n resolvedFragmentMetadata: (TFragmentMetadata | undefined)[],\n ): TAggregatedFragmentMetadata => {\n const fragmentMetaInfos: FragmentMetaInfo<TFragmentMetadata>[] = fragmentUsages.map((usage, index) => ({\n metadata: resolvedFragmentMetadata[index],\n fieldPath: usage.path,\n }));\n return adapter.aggregateFragmentMetadata(fragmentMetaInfos) as TAggregatedFragmentMetadata;\n };\n\n // 6. Evaluate fragment metadata first (sync or async)\n const fragmentMetadataResults: (TFragmentMetadata | undefined | Promise<TFragmentMetadata>)[] = fragmentUsages.map((usage) =>\n usage.metadataBuilder ? usage.metadataBuilder() : undefined,\n );\n\n // Check if any fragment metadata is async\n const hasAsyncFragmentMetadata = fragmentMetadataResults.some((r) => isPromiseLike(r));\n\n // 7. Helper to build operation metadata from aggregated fragment metadata\n const buildOperationMetadata = (\n aggregatedFragmentMetadata: TAggregatedFragmentMetadata,\n ): TOperationMetadata | undefined | Promise<TOperationMetadata | undefined> => {\n const schemaLevel = adapter.schemaLevel as TSchemaLevel | undefined;\n return metadataBuilder?.({ $, $var: varRefTools, document, fragmentMetadata: aggregatedFragmentMetadata, schemaLevel });\n };\n\n // 8. Factory that creates the final artifact\n const makeCreateArtifact = (aggregated: TAggregatedFragmentMetadata) => {\n return ({\n metadata,\n }: {\n metadata: TOperationMetadata | undefined;\n }): OperationArtifactResult<TOperationType, TOperationName, TVarDefinitions, TFields, TOperationMetadata> => {\n // Step 1: Operation transform (typed metadata) - FIRST\n let finalDocument = operationTransformDocument\n ? (operationTransformDocument({\n document,\n metadata,\n }) as typeof document)\n : document;\n\n // Step 2: Adapter transform (schemaLevel + fragmentMetadata) - SECOND\n if (adapterTransformDocument) {\n finalDocument = adapterTransformDocument({\n document: finalDocument,\n operationName,\n operationType,\n variableNames,\n schemaLevel: adapter.schemaLevel as TSchemaLevel | undefined,\n fragmentMetadata: aggregated,\n }) as typeof document;\n }\n\n return {\n operationType,\n operationName,\n schemaLabel: schema.label,\n variableNames,\n documentSource: () => fields,\n document: finalDocument as ReturnType<typeof buildDocument>,\n metadata,\n };\n };\n };\n\n // 9. Handle async fragment metadata\n if (hasAsyncFragmentMetadata) {\n return Promise.all(fragmentMetadataResults).then(async (resolvedFragmentMetadata) => {\n const aggregated = aggregateFragmentMetadata(resolvedFragmentMetadata);\n const operationMetadata = await buildOperationMetadata(aggregated);\n return makeCreateArtifact(aggregated)({ metadata: operationMetadata });\n });\n }\n\n // 10. All fragment metadata is sync\n const syncFragmentMetadata = fragmentMetadataResults as (TFragmentMetadata | undefined)[];\n const aggregated = aggregateFragmentMetadata(syncFragmentMetadata);\n const createArtifact = makeCreateArtifact(aggregated);\n\n const operationMetadataResult = buildOperationMetadata(aggregated);\n\n // Use duck typing for VM sandbox compatibility\n if (isPromiseLike(operationMetadataResult)) {\n return operationMetadataResult.then((metadata) => createArtifact({ metadata }));\n }\n\n return createArtifact({ metadata: operationMetadataResult });\n};\n\n/**\n * Wraps a buildOperationArtifact call into an Operation.create() invocation,\n * handling both sync and async artifact results.\n *\n * @param artifactFactory - Factory that produces the artifact (may return Promise for async metadata)\n *\n * @internal Used by extend.ts and operation-tagged-template.ts\n */\nexport const wrapArtifactAsOperation = <TOperationType extends OperationType>(\n artifactFactory: () =>\n | OperationArtifactResult<TOperationType, string, VariableDefinitions, AnyFieldsExtended, unknown>\n | Promise<OperationArtifactResult<TOperationType, string, VariableDefinitions, AnyFieldsExtended, unknown>>,\n): AnyOperationOf<TOperationType> => {\n // biome-ignore lint/suspicious/noExplicitAny: Type cast required for Operation.create with dynamic artifact\n return Operation.create(artifactFactory as never) as any;\n};\n","/**\n * Extend composer factory for creating Operations from TemplateCompatSpec.\n * @module\n */\n\nimport { Kind, type OperationDefinitionNode, parse as parseGraphql } from \"graphql\";\nimport { buildVarSpecifiers, createSchemaIndexFromSchema } from \"../graphql\";\nimport type { GqlDefine } from \"../types/element\";\nimport type { TemplateCompatSpec } from \"../types/element/compat-spec\";\nimport type { AnyFields } from \"../types/fragment\";\nimport type {\n AnyMetadataAdapter,\n DefaultMetadataAdapter,\n DocumentTransformer,\n ExtractAdapterTypes,\n MetadataBuilder,\n OperationDocumentTransformer,\n} from \"../types/metadata\";\nimport { defaultMetadataAdapter } from \"../types/metadata\";\nimport type { AnyGraphqlSchema, OperationType } from \"../types/schema\";\nimport type { AnyVarRef, VariableDefinitions } from \"../types/type-foundation\";\nimport { buildFieldsFromSelectionSet, filterUnresolvedFragmentSpreads } from \"./fragment-tagged-template\";\nimport { buildOperationArtifact, wrapArtifactAsOperation } from \"./operation-core\";\n\n/**\n * Options for extending a compat spec into a full operation.\n */\nexport type ExtendOptions<\n _TSchema extends AnyGraphqlSchema,\n _TVarDefinitions extends VariableDefinitions,\n TOperationMetadata,\n TAggregatedFragmentMetadata,\n TSchemaLevel,\n> = {\n /** Optional metadata builder */\n metadata?: MetadataBuilder<Readonly<Record<string, AnyVarRef>>, TOperationMetadata, TAggregatedFragmentMetadata, TSchemaLevel>;\n /** Optional document transformer */\n transformDocument?: OperationDocumentTransformer<TOperationMetadata>;\n};\n\n/**\n * Creates a factory for extending compat specs into full operations.\n *\n * The extend function takes a TemplateCompatSpec (created by `query.compat(\"Name\")\\`...\\``)\n * and optional metadata/transformDocument options, then creates a full Operation.\n *\n * @param schema - The GraphQL schema definition\n * @param adapter - Optional metadata adapter for custom metadata handling\n * @param transformDocument - Optional document transformer\n * @returns Extend composer function\n *\n * @internal Used by `createGqlElementComposer`\n */\nexport const createExtendComposer = <\n TSchema extends AnyGraphqlSchema,\n TAdapter extends AnyMetadataAdapter = DefaultMetadataAdapter,\n>(\n schema: NoInfer<TSchema>,\n adapter?: TAdapter,\n transformDocument?: DocumentTransformer<\n ExtractAdapterTypes<TAdapter>[\"schemaLevel\"],\n ExtractAdapterTypes<TAdapter>[\"aggregatedFragmentMetadata\"]\n >,\n) => {\n const resolvedAdapter = adapter ?? (defaultMetadataAdapter as TAdapter);\n\n type TAggregatedFragmentMetadata = ExtractAdapterTypes<TAdapter>[\"aggregatedFragmentMetadata\"];\n type TSchemaLevel = ExtractAdapterTypes<TAdapter>[\"schemaLevel\"];\n\n return <\n _TOperationType extends OperationType,\n _TOperationName extends string,\n TVarDefinitions extends VariableDefinitions,\n _TFields extends AnyFields,\n TOperationMetadata = unknown,\n >(\n compat: GqlDefine<TemplateCompatSpec>,\n options?: ExtendOptions<TSchema, TVarDefinitions, TOperationMetadata, TAggregatedFragmentMetadata, TSchemaLevel>,\n ) => {\n const spec = compat.value;\n\n return buildOperationFromTemplateSpec(\n schema,\n spec,\n resolvedAdapter,\n // biome-ignore lint/suspicious/noExplicitAny: Options type narrowing not possible across union\n options as any,\n transformDocument,\n );\n };\n};\n\n/**\n * Builds an Operation from a TemplateCompatSpec by parsing the raw GraphQL source.\n * Evaluates fields via buildFieldsFromSelectionSet for correct typegen output.\n */\nconst buildOperationFromTemplateSpec = <TSchema extends AnyGraphqlSchema, TAdapter extends AnyMetadataAdapter>(\n schema: TSchema,\n spec: TemplateCompatSpec,\n adapter: TAdapter,\n options:\n | ExtendOptions<\n TSchema,\n VariableDefinitions,\n unknown,\n ExtractAdapterTypes<TAdapter>[\"aggregatedFragmentMetadata\"],\n ExtractAdapterTypes<TAdapter>[\"schemaLevel\"]\n >\n | undefined,\n adapterTransformDocument:\n | DocumentTransformer<\n ExtractAdapterTypes<TAdapter>[\"schemaLevel\"],\n ExtractAdapterTypes<TAdapter>[\"aggregatedFragmentMetadata\"]\n >\n | undefined,\n) => {\n const { operationType, operationName, graphqlSource } = spec;\n\n // 1. Parse the raw GraphQL source\n const document = parseGraphql(graphqlSource);\n\n // 2. Extract operation definition for variable analysis\n const opDef = document.definitions.find((d): d is OperationDefinitionNode => d.kind === Kind.OPERATION_DEFINITION);\n if (!opDef) {\n throw new Error(\"No operation definition found in compat template spec\");\n }\n\n // 3. Build VarSpecifiers from variable definitions\n const schemaIndex = createSchemaIndexFromSchema(spec.schema);\n const varSpecifiers = buildVarSpecifiers(opDef.variableDefinitions ?? [], schemaIndex);\n\n // 4. Determine root type name\n const operationTypeName = schema.operations[operationType] as keyof typeof schema.object & string;\n\n // 5. Filter named fragment spreads that can't be resolved without interpolation context\n const filteredSelectionSet = filterUnresolvedFragmentSpreads(opDef.selectionSet);\n\n // 6. Delegate to buildOperationArtifact with fieldsFactory and pre-parsed variableDefinitionNodes\n return wrapArtifactAsOperation(\n () =>\n buildOperationArtifact({\n schema,\n operationType,\n operationTypeName,\n operationName,\n variables: varSpecifiers as unknown as VariableDefinitions,\n variableDefinitionNodes: opDef.variableDefinitions ?? [],\n fieldsFactory: ({ $ }) => {\n return buildFieldsFromSelectionSet(\n filteredSelectionSet,\n schema,\n operationTypeName,\n $ as Readonly<Record<string, import(\"../types/type-foundation\").AnyVarRef>>,\n );\n },\n adapter,\n metadata: options?.metadata,\n transformDocument: options?.transformDocument,\n adapterTransformDocument,\n }),\n // biome-ignore lint/suspicious/noExplicitAny: Type cast required for Operation.create with template compat spec\n ) as any;\n};\n","/**\n * Operation tagged template function for creating GraphQL operations from template literals.\n * Also supports options object dispatch for callback builder path.\n * @module\n */\n\nimport { Kind, parse as parseGraphql } from \"graphql\";\nimport { buildVarSpecifiers, createSchemaIndexFromSchema } from \"../graphql\";\nimport { Fragment } from \"../types/element\";\nimport type { AnyFragment } from \"../types/element/fragment\";\nimport type { AnyOperationOf } from \"../types/element/operation\";\nimport type { AnyFieldsExtended } from \"../types/fragment\";\nimport type { AnyMetadataAdapter, DocumentTransformer, OperationDocumentTransformer } from \"../types/metadata\";\nimport { defaultMetadataAdapter } from \"../types/metadata\";\nimport type { AnyGraphqlSchema, OperationType } from \"../types/schema\";\nimport type { AnyVarRef, VariableDefinitions } from \"../types/type-foundation\";\nimport type { FieldsBuilder } from \"./fields-builder\";\nimport { buildFieldsFromSelectionSet, filterUnresolvedFragmentSpreads } from \"./fragment-tagged-template\";\nimport { mergeVariableDefinitions } from \"./merge-variable-definitions\";\nimport { buildOperationArtifact, wrapArtifactAsOperation } from \"./operation-core\";\n\n/** Options for fragment TemplateResult resolution. */\nexport type FragmentTemplateMetadataOptions = {\n metadata?:\n | unknown\n | ((context: {\n $: Readonly<Record<string, unknown>>;\n $var: import(\"../types/metadata/metadata\").VarRefTools;\n }) => unknown | Promise<unknown>);\n};\n\n/** Context provided to operation metadata callbacks. */\nexport type OperationMetadataContext = {\n // biome-ignore lint/suspicious/noExplicitAny: Metadata context types are adapter-dependent; any allows test flexibility\n readonly $: Readonly<Record<string, any>>;\n readonly $var: import(\"../types/metadata/metadata\").VarRefTools;\n readonly document: import(\"graphql\").DocumentNode;\n // biome-ignore lint/suspicious/noExplicitAny: Aggregated fragment metadata shape depends on adapter\n readonly fragmentMetadata: any;\n // biome-ignore lint/suspicious/noExplicitAny: Schema-level metadata shape depends on adapter\n readonly schemaLevel: any;\n};\n\n/** Options for operation TemplateResult resolution — receives full metadata pipeline context. */\nexport type OperationTemplateMetadataOptions = {\n metadata?: unknown;\n /** Optional per-operation document transformer */\n transformDocument?: OperationDocumentTransformer<unknown>;\n};\n\n/** @deprecated Use `FragmentTemplateMetadataOptions` or `OperationTemplateMetadataOptions` instead. */\nexport type TemplateResultMetadataOptions = FragmentTemplateMetadataOptions;\n\n/** Callable result from tagged template - resolves to Operation or Fragment. */\nexport type TemplateResult<\n TElement extends AnyOperationOf<OperationType> | AnyFragment,\n TOptions = TElement extends AnyOperationOf<OperationType> ? OperationTemplateMetadataOptions : FragmentTemplateMetadataOptions,\n> = (options?: TOptions) => TElement;\n\n/** Tagged template function type for operations. */\nexport type OperationTaggedTemplateFunction<TOperationType extends OperationType = OperationType> = (\n strings: TemplateStringsArray,\n ...values: (AnyFragment | ((ctx: { $: Readonly<Record<string, AnyVarRef>> }) => AnyFieldsExtended))[]\n) => TemplateResult<AnyOperationOf<TOperationType>>;\n\n/** Options object for callback builder path */\nexport type OperationOptionsObject = {\n variables?: string;\n fields: FieldsBuilder;\n};\n\n/** Dispatch: tagged template OR options object */\nexport type OperationBuilderDispatch<TOperationType extends OperationType = OperationType> =\n OperationTaggedTemplateFunction<TOperationType> &\n ((options: OperationOptionsObject) => TemplateResult<AnyOperationOf<TOperationType>>);\n\n/** Curried operation function type: query(\"name\")`($var: Type!) { fields }` or query(\"name\")({ variables, fields }) */\nexport type CurriedOperationFunction<TOperationType extends OperationType = OperationType> = (\n operationName: string,\n) => OperationBuilderDispatch<TOperationType>;\n\n/**\n * Construct a synthetic GraphQL operation source from JS arguments and template body.\n * Handles optional variable declarations: `($var: Type!) { fields }` or `{ fields }`.\n */\nfunction buildSyntheticOperationSource(operationType: OperationType, operationName: string, body: string): string {\n const trimmed = body.trim();\n // Body starts with \"(\" -> variable declarations present, directly prepend operation header\n // Body starts with \"{\" -> just selection set, prepend header with space\n // Either way: `<operationType> <name><body>` produces valid GraphQL\n return `${operationType} ${operationName} ${trimmed}`;\n}\n\n/**\n * Resolves a metadata option from OperationTemplateMetadataOptions into a MetadataBuilder\n * compatible with buildOperationArtifact.\n *\n * - `undefined` -> `undefined` (no metadata)\n * - Raw value -> `() => value` (static metadata)\n * - Callback -> forwarded directly (receives full pipeline context)\n */\n// biome-ignore lint/suspicious/noExplicitAny: Private helper bridging untyped template options to typed MetadataBuilder\nconst resolveMetadataOption = (metadataOption: OperationTemplateMetadataOptions[\"metadata\"]): any => {\n if (metadataOption === undefined) return undefined;\n if (typeof metadataOption === \"function\") return metadataOption;\n return () => metadataOption;\n};\n\n/**\n * Creates a curried function for a specific operation type.\n * Supports both tagged template and options object dispatch.\n *\n * Tagged template: `query(\"name\")\\`($var: Type!) { fields }\\`` returns TemplateResult<Operation>.\n * Options object: `query(\"name\")({ variables, fields })` returns TemplateResult<Operation>.\n *\n * @param schema - The GraphQL schema definition\n * @param operationType - The operation type (query, mutation, subscription)\n * @param metadataAdapter - Optional metadata adapter for metadata aggregation\n * @param adapterTransformDocument - Optional document transformer from adapter\n */\nexport const createOperationTaggedTemplate = <TSchema extends AnyGraphqlSchema, TOperationType extends OperationType>(\n schema: TSchema,\n operationType: TOperationType,\n metadataAdapter?: AnyMetadataAdapter,\n // biome-ignore lint/suspicious/noExplicitAny: DocumentTransformer generic params not needed here\n adapterTransformDocument?: DocumentTransformer<any, any>,\n): CurriedOperationFunction<TOperationType> => {\n const schemaIndex = createSchemaIndexFromSchema(schema);\n\n return (operationName: string): OperationBuilderDispatch<TOperationType> => {\n // Dispatcher function that checks the first argument to determine path\n const dispatch = (\n firstArg: TemplateStringsArray | OperationOptionsObject,\n ...rest: (AnyFragment | ((ctx: { $: Readonly<Record<string, AnyVarRef>> }) => AnyFieldsExtended))[]\n ): TemplateResult<AnyOperationOf<TOperationType>> => {\n // Check if it's a tagged template (TemplateStringsArray has .raw)\n if (\"raw\" in firstArg) {\n return handleTaggedTemplate(\n schema,\n schemaIndex,\n operationType,\n operationName,\n metadataAdapter,\n adapterTransformDocument,\n firstArg as TemplateStringsArray,\n rest,\n );\n }\n\n // Options object path\n return handleOptionsObject(\n schema,\n schemaIndex,\n operationType,\n operationName,\n metadataAdapter,\n adapterTransformDocument,\n firstArg as OperationOptionsObject,\n );\n };\n\n return dispatch as OperationBuilderDispatch<TOperationType>;\n };\n};\n\n/**\n * Handles the tagged template path.\n */\nfunction handleTaggedTemplate<TSchema extends AnyGraphqlSchema, TOperationType extends OperationType>(\n schema: TSchema,\n schemaIndex: import(\"../graphql/schema-index\").SchemaIndex,\n operationType: TOperationType,\n operationName: string,\n metadataAdapter: AnyMetadataAdapter | undefined,\n // biome-ignore lint/suspicious/noExplicitAny: DocumentTransformer generic params not needed here\n adapterTransformDocument: DocumentTransformer<any, any> | undefined,\n strings: TemplateStringsArray,\n values: (AnyFragment | ((ctx: { $: Readonly<Record<string, AnyVarRef>> }) => AnyFieldsExtended))[],\n): TemplateResult<AnyOperationOf<TOperationType>> {\n // Validate interpolated values are fragments or callbacks\n for (let i = 0; i < values.length; i++) {\n const value = values[i];\n if (!(value instanceof Fragment) && typeof value !== \"function\") {\n throw new Error(\n `Tagged templates only accept Fragment instances or callback functions as interpolated values. ` +\n `Received ${typeof value} at position ${i}.`,\n );\n }\n }\n\n // Build template body with placeholders for interpolations\n let body = strings[0] ?? \"\";\n const interpolationMap = new Map<\n string,\n AnyFragment | ((ctx: { $: Readonly<Record<string, AnyVarRef>> }) => AnyFieldsExtended)\n >();\n\n for (let i = 0; i < values.length; i++) {\n const placeholderName = `__INTERPOLATION_${i}__`;\n interpolationMap.set(\n placeholderName,\n values[i] as AnyFragment | ((ctx: { $: Readonly<Record<string, AnyVarRef>> }) => AnyFieldsExtended),\n );\n body += placeholderName + (strings[i + 1] ?? \"\");\n }\n\n // Construct synthetic GraphQL source from JS args and template body\n const source = buildSyntheticOperationSource(operationType, operationName, body);\n\n // Parse the GraphQL source with placeholders\n let document: import(\"graphql\").DocumentNode;\n try {\n document = parseGraphql(source);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`GraphQL parse error in tagged template: ${message}`);\n }\n\n const opDefs = document.definitions.filter((def) => def.kind === Kind.OPERATION_DEFINITION);\n if (opDefs.length !== 1) {\n throw new Error(`Internal error: expected exactly one operation definition in synthesized source`);\n }\n\n // biome-ignore lint/style/noNonNullAssertion: Length checked above\n const opNode = opDefs[0]!;\n if (opNode.kind !== Kind.OPERATION_DEFINITION) {\n throw new Error(\"Unexpected definition kind\");\n }\n\n const varDefNodes = opNode.variableDefinitions ?? [];\n let varSpecifiers = buildVarSpecifiers(varDefNodes, schemaIndex) as VariableDefinitions;\n\n // Merge variable definitions from interpolated fragments\n varSpecifiers = mergeVariableDefinitions(varSpecifiers, interpolationMap);\n\n // Check if any interpolated fragments contributed new variables.\n // If so, varDefNodes (from the parsed template) is incomplete — omit it so that\n // buildDocument derives VariableDefinitionNodes from the merged varSpecifiers instead.\n const hasInterpolatedFragmentVars = [...interpolationMap.values()].some(\n (v) => v instanceof Fragment && Object.keys(v.variableDefinitions).length > 0,\n );\n\n // Determine root type name based on operation type\n const operationTypeName = schema.operations[operationType];\n if (operationTypeName === null) {\n throw new Error(`Operation type ${operationType} is not defined in schema roots`);\n }\n\n const resolvedAdapter = metadataAdapter ?? defaultMetadataAdapter;\n\n return (options?: OperationTemplateMetadataOptions): AnyOperationOf<TOperationType> => {\n const resolvedMetadata = resolveMetadataOption(options?.metadata);\n\n return wrapArtifactAsOperation(() =>\n buildOperationArtifact({\n schema,\n operationType,\n operationTypeName,\n operationName,\n variables: varSpecifiers,\n variableDefinitionNodes: hasInterpolatedFragmentVars ? undefined : varDefNodes,\n fieldsFactory: ({ $ }) => {\n return buildFieldsFromSelectionSet(\n filterUnresolvedFragmentSpreads(opNode.selectionSet, interpolationMap),\n schema,\n operationTypeName,\n $ as Readonly<Record<string, AnyVarRef>>,\n interpolationMap,\n );\n },\n adapter: resolvedAdapter,\n metadata: resolvedMetadata,\n transformDocument: options?.transformDocument,\n adapterTransformDocument,\n }),\n );\n };\n}\n\n/**\n * Handles the options object path.\n */\nfunction handleOptionsObject<TSchema extends AnyGraphqlSchema, TOperationType extends OperationType>(\n schema: TSchema,\n schemaIndex: import(\"../graphql/schema-index\").SchemaIndex,\n operationType: TOperationType,\n operationName: string,\n metadataAdapter: AnyMetadataAdapter | undefined,\n // biome-ignore lint/suspicious/noExplicitAny: DocumentTransformer generic params not needed here\n adapterTransformDocument: DocumentTransformer<any, any> | undefined,\n options: OperationOptionsObject,\n): TemplateResult<AnyOperationOf<TOperationType>> {\n // Parse variables from string if provided\n let varSpecifiers: VariableDefinitions = {};\n let varDefNodes: readonly import(\"graphql\").VariableDefinitionNode[] = [];\n\n if (options.variables) {\n // options.variables is a string like \"($id: ID!)\" or \"($id: ID!, $limit: Int)\"\n // Parse it as GraphQL: wrap in a dummy operation to get variable definition nodes\n const varSource = `query __var_parse__ ${String(options.variables).trim()} { __typename }`;\n const parsed = parseGraphql(varSource);\n const opDef = parsed.definitions[0];\n if (opDef?.kind === Kind.OPERATION_DEFINITION) {\n varDefNodes = opDef.variableDefinitions ?? [];\n varSpecifiers = buildVarSpecifiers(varDefNodes, schemaIndex) as VariableDefinitions;\n }\n }\n\n const operationTypeName = schema.operations[operationType];\n if (operationTypeName === null) {\n throw new Error(`Operation type ${operationType} is not defined in schema roots`);\n }\n\n const resolvedAdapter = metadataAdapter ?? defaultMetadataAdapter;\n\n // Return TemplateResult (step 2 callable)\n return (step2Options?: OperationTemplateMetadataOptions): AnyOperationOf<TOperationType> => {\n const resolvedMetadata = resolveMetadataOption(step2Options?.metadata);\n\n return wrapArtifactAsOperation(() =>\n buildOperationArtifact({\n schema,\n operationType,\n operationTypeName,\n operationName,\n variables: varSpecifiers,\n variableDefinitionNodes: varDefNodes,\n fieldsFactory: options.fields,\n adapter: resolvedAdapter,\n metadata: resolvedMetadata,\n transformDocument: step2Options?.transformDocument,\n adapterTransformDocument,\n }),\n );\n };\n}\n","/**\n * Main entry point for composing GraphQL elements.\n * @module\n */\n\nimport type { AnyFragment, AnyGqlDefine, AnyOperation } from \"../types/element\";\nimport { GqlDefine } from \"../types/element\";\nimport type { Adapter, AnyAdapter, AnyMetadataAdapter, DefaultAdapter, DefaultMetadataAdapter } from \"../types/metadata\";\nimport type { AnyGraphqlSchema } from \"../types/schema\";\nimport { createColocateHelper } from \"./colocate\";\nimport { createCompatTaggedTemplate } from \"./compat-tagged-template\";\nimport { applyContextTransformer } from \"./context-transformer\";\nimport { createStandardDirectives, type StandardDirectives } from \"./directive-builder\";\nimport { createExtendComposer } from \"./extend\";\nimport { createFragmentTaggedTemplate } from \"./fragment-tagged-template\";\nimport { createOperationTaggedTemplate } from \"./operation-tagged-template\";\n\n/**\n * Function signature for composing GraphQL elements (fragments or operations).\n *\n * The composer provides a context with builders for fragments, operations,\n * variables, and colocation helpers.\n */\nexport type GqlElementComposer<TContext> = <TResult extends AnyFragment | AnyOperation | AnyGqlDefine>(\n composeElement: (context: TContext) => TResult,\n) => TResult;\n\n/**\n * GQL element composer with schema access.\n *\n * Extends the base composer function with a `$schema` property that provides\n * runtime access to the schema definition. This is useful for:\n * - Type generation tools (typegen)\n * - Runtime schema introspection\n * - Debugging and tooling\n */\nexport type GqlElementComposerWithSchema<TContext, TSchema extends AnyGraphqlSchema> = GqlElementComposer<TContext> & {\n /**\n * The GraphQL schema definition used by this composer.\n * Provides runtime access to schema types, operations, and metadata.\n */\n readonly $schema: TSchema;\n};\n\n/**\n * Extracts the helpers type from an adapter.\n * Uses `any` for non-target type parameters to avoid contravariance issues\n * with the `aggregateFragmentMetadata` function parameter type.\n */\n// biome-ignore lint/suspicious/noExplicitAny: Required to avoid contravariance issues in conditional type matching\ntype ExtractHelpers<TAdapter extends AnyAdapter> = TAdapter extends Adapter<infer THelpers, any, any, any> ? THelpers : object;\n\n/**\n * Extracts the metadata adapter type from an adapter.\n * Handles optional metadata property correctly.\n */\nexport type ExtractMetadataAdapter<TAdapter extends AnyAdapter> = TAdapter extends { metadata?: infer M }\n ? NonNullable<M> extends AnyMetadataAdapter\n ? NonNullable<M>\n : DefaultMetadataAdapter\n : DefaultMetadataAdapter;\n\n/**\n * Configuration options for `createGqlElementComposer`.\n */\nexport type GqlElementComposerOptions<\n _TSchema extends AnyGraphqlSchema,\n TDirectiveMethods extends StandardDirectives,\n TAdapter extends AnyAdapter = DefaultAdapter,\n> = {\n /** Optional adapter for custom helpers and metadata handling. */\n adapter?: TAdapter;\n /** Optional custom directive methods (including schema-defined directives). */\n directiveMethods?: TDirectiveMethods;\n};\n\n/**\n * Creates a GQL element composer for a given schema.\n *\n * This is the main entry point for defining GraphQL operations and fragments.\n * The returned function provides a context with:\n * - `fragment`: Tagged template function for fragment definitions\n * - `query/mutation/subscription`: Operation builders (tagged template + options object + .compat)\n * - `$dir`: Field directive helpers (@skip, @include)\n * - `$colocate`: Fragment colocation utilities\n *\n * @param schema - The GraphQL schema definition\n * @param options - Configuration including optional adapter\n * @returns Element composer function\n *\n * @example\n * ```typescript\n * const gql = createGqlElementComposer(schema, {});\n *\n * const GetUser = gql(({ query, $dir }) =>\n * query(\"GetUser\")`($id: ID!) {\n * user(id: $id) { name email }\n * }`()\n * );\n * ```\n */\nexport const createGqlElementComposer = <\n TSchema extends AnyGraphqlSchema,\n TDirectiveMethods extends StandardDirectives,\n TAdapter extends AnyAdapter = DefaultAdapter,\n>(\n schema: NoInfer<TSchema>,\n options: GqlElementComposerOptions<NoInfer<TSchema>, NoInfer<TDirectiveMethods>, NoInfer<TAdapter>>,\n) => {\n type THelpers = ExtractHelpers<TAdapter>;\n type TMetadataAdapter = ExtractMetadataAdapter<TAdapter>;\n const { adapter, directiveMethods } = options;\n const helpers = adapter?.helpers as THelpers | undefined;\n const metadataAdapter = adapter?.metadata as TMetadataAdapter | undefined;\n const transformDocument = adapter?.transformDocument;\n // Fragment: curried tagged template function — fragment(\"name\", \"type\")`{ fields }`\n const fragment = createFragmentTaggedTemplate(schema);\n\n // Hybrid context: curried tagged template / options object functions with .compat property\n const context = {\n fragment,\n query: Object.assign(createOperationTaggedTemplate(schema, \"query\", metadataAdapter, transformDocument), {\n compat: createCompatTaggedTemplate(schema, \"query\"),\n }),\n mutation: Object.assign(createOperationTaggedTemplate(schema, \"mutation\", metadataAdapter, transformDocument), {\n compat: createCompatTaggedTemplate(schema, \"mutation\"),\n }),\n subscription: Object.assign(createOperationTaggedTemplate(schema, \"subscription\", metadataAdapter, transformDocument), {\n compat: createCompatTaggedTemplate(schema, \"subscription\"),\n }),\n define: <TValue>(factory: () => TValue | Promise<TValue>) => GqlDefine.create(factory),\n extend: createExtendComposer<TSchema, TMetadataAdapter>(schema, metadataAdapter, transformDocument),\n $dir: directiveMethods ?? (createStandardDirectives() as TDirectiveMethods),\n $colocate: createColocateHelper(),\n ...(helpers ?? ({} as THelpers)),\n };\n\n // Apply context transformer if set (for programmatic API like @soda-gql/sdk)\n const transformedContext = applyContextTransformer(context);\n\n const elementComposer: GqlElementComposer<typeof context> = (composeElement) => composeElement(transformedContext);\n\n // Attach schema as readonly property for runtime access\n const composerWithSchema = elementComposer as GqlElementComposerWithSchema<typeof context, TSchema>;\n Object.defineProperty(composerWithSchema, \"$schema\", {\n value: schema,\n writable: false,\n enumerable: true,\n configurable: false,\n });\n\n return composerWithSchema;\n};\n\n/**\n * Abstract Context type for prebuilt composers.\n *\n * Provides minimal structure while allowing PrebuiltTypeRegistry to resolve\n * actual types. Used by prebuilt module to avoid heavy schema type inference.\n *\n * Type safety in prebuilt comes from `ResolvePrebuiltElement`, not from\n * the Context type.\n */\nexport type AnyGqlContext = {\n readonly fragment: (...args: unknown[]) => unknown;\n readonly query: ((...args: unknown[]) => unknown) & {\n compat: (...args: unknown[]) => AnyGqlDefine;\n };\n readonly mutation: ((...args: unknown[]) => unknown) & {\n compat: (...args: unknown[]) => AnyGqlDefine;\n };\n readonly subscription: ((...args: unknown[]) => unknown) & {\n compat: (...args: unknown[]) => AnyGqlDefine;\n };\n readonly define: <TValue>(factory: () => TValue | Promise<TValue>) => GqlDefine<TValue>;\n readonly extend: (...args: unknown[]) => AnyOperation;\n readonly $dir: StandardDirectives;\n readonly $colocate: unknown;\n readonly [key: string]: unknown;\n};\n","/**\n * Type calculator for generating TypeScript type strings from field selections.\n *\n * This is a runtime reimplementation of the InferFields type-level computation,\n * used for generating prebuilt types that can be bundled without losing type information.\n *\n * @module\n */\n\nimport { Kind, type TypeNode, type VariableDefinitionNode } from \"graphql\";\nimport type { AnyFieldSelection, AnyFieldsExtended, AnyFieldValue, AnyUnionSelection } from \"../types/fragment\";\nimport type { AnyGraphqlSchema } from \"../types/schema\";\nimport type {\n DeferredOutputField,\n InputDepthOverrides,\n InputTypeSpecifiers,\n TypeModifier,\n VariableDefinitions,\n} from \"../types/type-foundation\";\nimport { parseInputSpecifier, parseOutputField } from \"../utils/deferred-specifier-parser\";\n\n/**\n * Formatters for customizing type name output.\n *\n * Used by type generation functions to format scalar and input object type names\n * with custom prefixes or patterns (e.g., schema-specific prefixes).\n */\nexport type TypeFormatters = {\n /**\n * Format a scalar input type name.\n * Default: `ScalarInput<\"Name\">`\n */\n readonly scalarInput?: (name: string) => string;\n /**\n * Format a scalar output type name.\n * Default: `ScalarOutput<\"Name\">`\n */\n readonly scalarOutput?: (name: string) => string;\n /**\n * Format an input object type name.\n * Default: returns the name unchanged\n */\n readonly inputObject?: (name: string) => string;\n};\n\n/**\n * Apply a type modifier to a base type string.\n *\n * Modifier format:\n * - \"!\" = required (T)\n * - \"?\" = optional (T | null | undefined)\n * - \"![]!\" = required array of required items (T[])\n * - \"![]?\" = optional array of required items (T[] | null | undefined)\n * - \"?[]!\" = required array of optional items ((T | null | undefined)[])\n * - \"?[]?\" = optional array of optional items ((T | null | undefined)[] | null | undefined)\n * - Deeper nesting follows the same pattern\n */\nexport const applyTypeModifier = (baseType: string, modifier: TypeModifier): string => {\n // Parse modifier from inside out\n // Modifier format: innerNullability[]outerNullability[]...\n // e.g., \"?[]!\" means: inner is nullable, wrapped in non-null array\n\n if (modifier === \"!\") {\n return baseType;\n }\n if (modifier === \"?\") {\n return `(${baseType} | null | undefined)`;\n }\n\n // For array types, parse the modifier pattern\n // Pattern: (innerNullability)([]outerNullability)*\n const parts = modifier.split(\"[]\");\n if (parts.length < 2) {\n // Fallback for unexpected modifier format\n return baseType;\n }\n\n // Build type from inside out\n let result = baseType;\n\n // First part is the innermost nullability\n const innerNullability = parts[0];\n if (innerNullability === \"?\") {\n result = `(${result} | null | undefined)`;\n }\n\n // Remaining parts are array wrappings with their nullability\n for (let i = 1; i < parts.length; i++) {\n const arrayNullability = parts[i];\n result = `(${result})[]`;\n if (arrayNullability === \"?\") {\n result = `(${result} | null | undefined)`;\n }\n }\n\n return result;\n};\n\n/**\n * Get the TypeScript type string for a scalar output type from the schema.\n *\n * Returns a `ScalarOutput<\"Name\">` reference for all scalars in the schema.\n * The actual type is resolved at compile time from the inject file's scalar definitions.\n * This allows users to customize even built-in scalars (ID, String, etc.).\n */\nexport const getScalarOutputType = (schema: AnyGraphqlSchema, scalarName: string): string => {\n // ALL scalars use ScalarOutput reference - inject file is the source of truth\n if (schema.scalar[scalarName]) {\n return `ScalarOutput<\"${scalarName}\">`;\n }\n // Unknown scalar not in schema\n return \"unknown\";\n};\n\n/**\n * Get the TypeScript type string for a scalar input type from the schema.\n *\n * Returns a `ScalarInput<\"Name\">` reference for all scalars in the schema.\n * Used for input/variable types in operations.\n */\nexport const getScalarInputType = (schema: AnyGraphqlSchema, scalarName: string): string => {\n if (schema.scalar[scalarName]) {\n return `ScalarInput<\"${scalarName}\">`;\n }\n return \"unknown\";\n};\n\n/**\n * Get the TypeScript type string for an enum type from the schema.\n */\nexport const getEnumType = (schema: AnyGraphqlSchema, enumName: string): string => {\n const enumDef = schema.enum[enumName];\n if (!enumDef) {\n return \"string\";\n }\n\n // Get enum values and create a union type\n const values = Object.keys(enumDef.values);\n if (values.length === 0) {\n return \"never\";\n }\n\n return values.map((v) => `\"${v}\"`).join(\" | \");\n};\n\n/**\n * Default depth limit for input object type generation.\n */\nconst DEFAULT_INPUT_DEPTH = 3;\n\n/**\n * Options for generating input object types.\n */\nexport type GenerateInputObjectTypeOptions = {\n /**\n * Default depth limit for recursive types.\n * @default 3\n */\n readonly defaultDepth?: number;\n /**\n * Per-type depth overrides.\n */\n readonly depthOverrides?: InputDepthOverrides;\n /**\n * Custom formatters for type names.\n */\n readonly formatters?: TypeFormatters;\n};\n\n/**\n * Generate a TypeScript type string for an input object type.\n *\n * Recursively expands fields using ScalarInput for scalars.\n * Returns `unknown` if depth is exhausted or circular reference is detected.\n *\n * @param schema - The GraphQL schema\n * @param inputName - The input object type name\n * @param options - Generation options including depth limits\n * @param seen - Set of already visited input names (for circular reference detection)\n * @param currentDepth - Current recursion depth\n */\nexport const generateInputObjectType = (\n schema: AnyGraphqlSchema,\n inputName: string,\n options: GenerateInputObjectTypeOptions = {},\n seen: Set<string> = new Set(),\n currentDepth?: number,\n): string => {\n const inputDef = schema.input[inputName];\n if (!inputDef) {\n return \"unknown\";\n }\n\n // Get depth limit for this type\n const depthOverrides = options.depthOverrides ?? {};\n const defaultDepth = options.defaultDepth ?? DEFAULT_INPUT_DEPTH;\n const maxDepth = depthOverrides[inputName] ?? defaultDepth;\n\n // Initialize or use current depth\n const depth = currentDepth ?? maxDepth;\n\n // Check depth exhaustion\n if (depth <= 0) {\n return \"unknown\";\n }\n\n // Check circular reference\n if (seen.has(inputName)) {\n return \"unknown\";\n }\n\n // Add to seen set for this branch\n const newSeen = new Set(seen);\n newSeen.add(inputName);\n\n const fields = inputDef.fields;\n const fieldEntries = Object.entries(fields);\n\n if (fieldEntries.length === 0) {\n return \"{}\";\n }\n\n const fieldTypes = fieldEntries.map(([fieldName, specifierStr]) => {\n const specifier = parseInputSpecifier(specifierStr as string);\n const fieldType = generateInputFieldType(schema, specifier, options, newSeen, depth - 1);\n const isOptional = specifier.modifier === \"?\" || specifier.modifier.endsWith(\"?\");\n const hasDefault = specifier.hasDefault;\n\n // Fields with defaults or nullable fields are optional\n if (hasDefault || isOptional) {\n return `readonly ${fieldName}?: ${fieldType}`;\n }\n return `readonly ${fieldName}: ${fieldType}`;\n });\n\n return `{ ${fieldTypes.join(\"; \")} }`;\n};\n\n/**\n * Generate a TypeScript type string for an input field based on its parsed specifier.\n */\nconst generateInputFieldType = (\n schema: AnyGraphqlSchema,\n specifier: { readonly kind: string; readonly name: string; readonly modifier: string },\n options: GenerateInputObjectTypeOptions,\n seen: Set<string>,\n depth: number,\n): string => {\n let baseType: string;\n const { formatters } = options;\n\n switch (specifier.kind) {\n case \"scalar\":\n baseType = formatters?.scalarInput?.(specifier.name) ?? getScalarInputType(schema, specifier.name);\n break;\n case \"enum\":\n baseType = getEnumType(schema, specifier.name);\n break;\n case \"input\":\n baseType =\n formatters?.inputObject?.(specifier.name) ?? generateInputObjectType(schema, specifier.name, options, seen, depth);\n break;\n default:\n baseType = \"unknown\";\n }\n\n return applyTypeModifier(baseType, specifier.modifier as TypeModifier);\n};\n\n/**\n * Calculate the TypeScript type string for a single field selection.\n *\n * @param schema - The GraphQL schema\n * @param selection - The field selection to calculate type for\n * @param formatters - Optional formatters for customizing type names\n */\nexport const calculateFieldType = (\n schema: AnyGraphqlSchema,\n selection: AnyFieldSelection,\n formatters?: TypeFormatters,\n): string => {\n // Parse the deferred output specifier (handles both string and object formats)\n const parsedType = parseOutputField(selection.type as DeferredOutputField);\n\n // Handle __typename field specially - return literal type name\n if (selection.field === \"__typename\") {\n // For __typename, the name in the specifier is the parent type name\n return applyTypeModifier(`\"${parsedType.name}\"`, parsedType.modifier as TypeModifier);\n }\n\n // Handle object types (nested selection)\n if (parsedType.kind === \"object\" && selection.object) {\n const nestedType = calculateFieldsType(schema, selection.object, formatters, parsedType.name);\n return applyTypeModifier(nestedType, parsedType.modifier as TypeModifier);\n }\n\n // Handle union types\n if (parsedType.kind === \"union\" && selection.union) {\n const unionType = calculateUnionType(schema, selection.union, formatters, parsedType.name);\n return applyTypeModifier(unionType, parsedType.modifier as TypeModifier);\n }\n\n // Handle scalar types (including __typename which is represented as scalar)\n if (parsedType.kind === \"scalar\") {\n const scalarType = formatters?.scalarOutput?.(parsedType.name) ?? getScalarOutputType(schema, parsedType.name);\n return applyTypeModifier(scalarType, parsedType.modifier as TypeModifier);\n }\n\n // Handle enum types\n if (parsedType.kind === \"enum\") {\n const enumType = getEnumType(schema, parsedType.name);\n return applyTypeModifier(enumType, parsedType.modifier as TypeModifier);\n }\n\n // Fallback\n return \"unknown\";\n};\n\n/**\n * Calculate the TypeScript type string for a union type selection.\n *\n * When `__typename: true` is set, generates types for ALL union members with __typename,\n * even those not explicitly selected (they get only __typename).\n */\nconst calculateUnionType = (\n schema: AnyGraphqlSchema,\n union: AnyUnionSelection,\n formatters?: TypeFormatters,\n unionTypeName?: string,\n): string => {\n const { selections, __typename: hasTypenameFlag } = union;\n const memberTypes: string[] = [];\n\n if (hasTypenameFlag && unionTypeName) {\n // Get all union member names from schema\n const unionDef = schema.union[unionTypeName];\n if (unionDef) {\n const allMemberNames = Object.keys(unionDef.types);\n\n for (const typeName of allMemberNames) {\n const member = selections[typeName];\n if (member && typeof member === \"object\") {\n // Selected member: include fields + __typename\n const fieldsType = calculateFieldsType(schema, member.fields, formatters, typeName);\n memberTypes.push(`${fieldsType} & { readonly __typename: \"${typeName}\" }`);\n } else {\n // Unselected member: only __typename\n memberTypes.push(`{ readonly __typename: \"${typeName}\" }`);\n }\n }\n }\n } else {\n // Original behavior without __typename flag\n for (const [typeName, member] of Object.entries(selections)) {\n if (member && typeof member === \"object\") {\n const memberType = calculateFieldsType(schema, member.fields, formatters, typeName);\n memberTypes.push(memberType);\n }\n }\n }\n\n if (memberTypes.length === 0) {\n return \"never\";\n }\n\n return memberTypes.join(\" | \");\n};\n\n/**\n * Check if a field value is shorthand (true) vs factory return (AnyFieldSelection).\n */\nconst isShorthandValue = (value: AnyFieldValue): value is true => value === true;\n\n/**\n * Expand shorthand to AnyFieldSelection using schema type info.\n * Used at prebuilt type generation time to convert `true` to full field selection.\n *\n * @param schema - The GraphQL schema\n * @param typeName - The parent object type name\n * @param fieldName - The field name to select\n */\nconst expandShorthandForType = (schema: AnyGraphqlSchema, typeName: string, fieldName: string): AnyFieldSelection => {\n const typeDef = schema.object[typeName];\n if (!typeDef) {\n throw new Error(`Type \"${typeName}\" not found in schema`);\n }\n\n const fieldSpec = typeDef.fields[fieldName];\n if (!fieldSpec) {\n throw new Error(`Field \"${fieldName}\" not found on type \"${typeName}\"`);\n }\n\n return {\n parent: typeName,\n field: fieldName,\n type: fieldSpec,\n args: {},\n directives: [],\n object: null,\n union: null,\n };\n};\n\n/**\n * Calculate the TypeScript type string for a set of field selections.\n * This is the main entry point for type calculation.\n *\n * @param schema - The GraphQL schema\n * @param fields - The field selections to calculate types for\n * @param formatters - Optional formatters for customizing type names\n * @param typeName - Parent type name for shorthand expansion\n */\nexport const calculateFieldsType = (\n schema: AnyGraphqlSchema,\n fields: AnyFieldsExtended,\n formatters?: TypeFormatters,\n typeName?: string,\n): string => {\n const entries = Object.entries(fields);\n\n if (entries.length === 0) {\n return \"{}\";\n }\n\n const fieldTypes = entries.map(([alias, value]) => {\n let selection: AnyFieldSelection;\n if (isShorthandValue(value)) {\n if (!typeName) {\n throw new Error(\n `Shorthand syntax (${alias}: true) requires type context. ` +\n `This is an internal error - type name should be provided.`,\n );\n }\n selection = expandShorthandForType(schema, typeName, alias);\n } else {\n selection = value;\n }\n const fieldType = calculateFieldType(schema, selection, formatters);\n // Use readonly for all fields to match InferFields behavior\n return `readonly ${alias}: ${fieldType}`;\n });\n\n return `{ ${fieldTypes.join(\"; \")} }`;\n};\n\n/**\n * Convert a GraphQL TypeNode to a TypeScript type string for input types.\n *\n * Handles NonNullType, ListType, and NamedType recursively.\n * Uses ScalarInput for scalar types since this is used for input/variable types.\n *\n * @param schema - The GraphQL schema\n * @param typeNode - The GraphQL type node to convert\n * @param formatters - Optional formatters for customizing type names\n */\nexport const graphqlTypeToTypeScript = (schema: AnyGraphqlSchema, typeNode: TypeNode, formatters?: TypeFormatters): string => {\n switch (typeNode.kind) {\n case Kind.NON_NULL_TYPE:\n return graphqlTypeToTypeScript(schema, typeNode.type, formatters);\n case Kind.LIST_TYPE: {\n const inner = graphqlTypeToTypeScript(schema, typeNode.type, formatters);\n return `(${inner})[]`;\n }\n case Kind.NAMED_TYPE: {\n const name = typeNode.name.value;\n // Check if scalar - use ScalarInput for input types\n if (schema.scalar[name]) {\n return formatters?.scalarInput?.(name) ?? getScalarInputType(schema, name);\n }\n // Check if enum\n if (schema.enum[name]) {\n return getEnumType(schema, name);\n }\n // Input object - use formatter or return name directly\n return formatters?.inputObject?.(name) ?? name;\n }\n }\n};\n\n/**\n * Generate a TypeScript type string for operation input variables.\n *\n * Extracts variable types from GraphQL VariableDefinitionNode AST.\n *\n * @param schema - The GraphQL schema\n * @param variableDefinitions - Variable definition nodes from the operation\n * @param formatters - Optional formatters for customizing type names\n */\nexport const generateInputType = (\n schema: AnyGraphqlSchema,\n variableDefinitions: readonly VariableDefinitionNode[],\n formatters?: TypeFormatters,\n): string => {\n if (variableDefinitions.length === 0) {\n return \"{}\";\n }\n\n const fields = variableDefinitions.map((varDef) => {\n const name = varDef.variable.name.value;\n const isRequired = varDef.type.kind === Kind.NON_NULL_TYPE;\n const tsType = graphqlTypeToTypeScript(schema, varDef.type, formatters);\n\n // Apply nullability wrapper for optional fields\n const finalType = isRequired ? tsType : `(${tsType} | null | undefined)`;\n return `readonly ${name}${isRequired ? \"\" : \"?\"}: ${finalType}`;\n });\n\n return `{ ${fields.join(\"; \")} }`;\n};\n\n/**\n * Generate TypeScript type for a single input field from its parsed specifier.\n * Used by generateInputTypeFromSpecifiers.\n */\nconst generateInputFieldTypeFromSpecifier = (\n schema: AnyGraphqlSchema,\n specifier: { kind: string; name: string; modifier: string },\n options: GenerateInputObjectTypeOptions,\n): string => {\n let baseType: string;\n const { formatters } = options;\n\n switch (specifier.kind) {\n case \"scalar\":\n baseType = formatters?.scalarInput?.(specifier.name) ?? getScalarInputType(schema, specifier.name);\n break;\n case \"enum\":\n baseType = getEnumType(schema, specifier.name);\n break;\n case \"input\":\n baseType = formatters?.inputObject?.(specifier.name) ?? generateInputObjectType(schema, specifier.name, options);\n break;\n default:\n baseType = \"unknown\";\n }\n\n return applyTypeModifier(baseType, specifier.modifier as TypeModifier);\n};\n\n/**\n * Generate a TypeScript type string for input variables from InputTypeSpecifiers.\n *\n * Unlike generateInputType which works with GraphQL AST VariableDefinitionNode[],\n * this function works with soda-gql's internal InputTypeSpecifiers format.\n * Used for generating Fragment input types in prebuilt mode.\n *\n * @param schema - The GraphQL schema\n * @param specifiers - Input type specifiers (variable definitions)\n * @param options - Generation options including depth limits\n */\nexport const generateInputTypeFromSpecifiers = (\n schema: AnyGraphqlSchema,\n specifiers: InputTypeSpecifiers,\n options: GenerateInputObjectTypeOptions = {},\n): string => {\n const entries = Object.entries(specifiers);\n\n if (entries.length === 0) {\n return \"void\";\n }\n\n const fields = entries.map(([name, specifierStr]) => {\n const specifier = parseInputSpecifier(specifierStr as string);\n // Check if the outermost type is required\n // \"!\" = required, \"?\" = optional\n // \"![]!\" = required (outer), \"![]?\" = optional (outer)\n // For arrays, check if the last character is \"!\" (required outer) or \"?\" (optional outer)\n const isOuterRequired = specifier.modifier.endsWith(\"!\");\n const hasDefault = specifier.hasDefault;\n const baseType = generateInputFieldTypeFromSpecifier(schema, specifier, options);\n\n // Field is optional if outer type is nullable or has default value\n const isOptional = !isOuterRequired || hasDefault;\n\n return `readonly ${name}${isOptional ? \"?\" : \"\"}: ${baseType}`;\n });\n\n return `{ ${fields.join(\"; \")} }`;\n};\n\n/**\n * Generate a TypeScript type string for input variables from VariableDefinitions.\n *\n * Unlike generateInputTypeFromSpecifiers which works with deferred specifier strings,\n * this function works with VarSpecifier objects from variable definitions.\n * Used for generating Fragment input types in prebuilt mode.\n *\n * @param schema - The GraphQL schema\n * @param varDefs - Variable definitions (VarSpecifier objects)\n * @param options - Generation options including depth limits\n */\nexport const generateInputTypeFromVarDefs = (\n schema: AnyGraphqlSchema,\n varDefs: VariableDefinitions,\n options: GenerateInputObjectTypeOptions = {},\n): string => {\n const entries = Object.entries(varDefs);\n\n if (entries.length === 0) {\n return \"void\";\n }\n\n const fields = entries.map(([name, varSpec]) => {\n // VarSpecifier already has kind, name, modifier as properties\n const isOuterRequired = varSpec.modifier.endsWith(\"!\");\n const hasDefault = varSpec.defaultValue !== null;\n const baseType = generateInputFieldTypeFromSpecifier(schema, varSpec, options);\n\n // Field is optional if outer type is nullable or has default value\n const isOptional = !isOuterRequired || hasDefault;\n\n return `readonly ${name}${isOptional ? \"?\" : \"\"}: ${baseType}`;\n });\n\n return `{ ${fields.join(\"; \")} }`;\n};\n"],"mappings":"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"}