{"version":3,"file":"TypeInfo.js","sourceRoot":"","sources":["../../src/utilities/TypeInfo.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,MAAM,EAAE,4BAA2B;AAC5C,OAAO,EAAE,IAAI,EAAE,8BAA6B;AAE5C,OAAO,EAAE,oBAAoB,EAAE,gCAA+B;AAY9D,OAAO,EACL,YAAY,EACZ,eAAe,EACf,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,WAAW,EACX,UAAU,EACV,YAAY,EACZ,YAAY,GACb,+BAA8B;AAI/B,OAAO,EAAE,WAAW,EAAE,0BAAyB;AAa/C,MAAM,OAAO,QAAQ;IAyFnB,YACE,MAAqB,EAKrB,WAAgC,EAChC,kBAEC;QAED,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,yBAAyB,GAAG,kBAAkB,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACpE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC7B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACzC,CAAC;YACD,IAAI,eAAe,CAAC,WAAW,CAAC,EAAE,CAAC;gBACjC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC1C,CAAC;YACD,IAAI,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;IACH,CAAC;IAMD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QACtB,OAAO,UAAU,CAAC;IACpB,CAAC;IAkCD,OAAO;QACL,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IAkCD,aAAa;QACX,OAAO,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IAmCD,YAAY;QACV,OAAO,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAoCD,kBAAkB;QAChB,OAAO,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IA8BD,WAAW;QACT,OAAO,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IA8BD,eAAe;QACb,OAAO,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IA8BD,YAAY;QACV,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IA8BD,WAAW;QACT,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IA0CD,oBAAoB;QAClB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IA4CD,0BAA0B;QAGxB,OAAO,IAAI,CAAC,yBAAyB,CAAC;IACxC,CAAC;IA0CD,mBAAmB;QACjB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAmCD,YAAY;QACV,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IA+BD,KAAK,CAAC,IAAa;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAK5B,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACnB,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;gBACvD,IAAI,CAAC,yBAAyB,GAAG,CAAC,YAAoB,EAAE,EAAE,CACxD,kBAAkB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBACvC,MAAM;YACR,CAAC;YACD,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;gBACxB,MAAM,SAAS,GAAY,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;gBACxD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CACxB,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CACnD,CAAC;gBACF,MAAM;YACR,CAAC;YACD,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBAChB,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;gBACxC,IAAI,QAAQ,CAAC;gBACb,IAAI,SAAkB,CAAC;gBACvB,IAAI,UAAU,EAAE,CAAC;oBACf,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxD,IAAI,QAAQ,EAAE,CAAC;wBACb,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC;oBAC5B,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACnC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBACtE,MAAM;YACR,CAAC;YACD,KAAK,IAAI,CAAC,SAAS;gBACjB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACvD,MAAM;YACR,KAAK,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBAC/B,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACpD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBACpE,MAAM;YACR,CAAC;YACD,KAAK,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;gBAC1B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,0BAA0B,EAAE,CACzD,IAAI,CAAC,IAAI,CAAC,KAAK,CAChB,CAAC;gBACF,MAAM;YACR,CAAC;YACD,KAAK,IAAI,CAAC,eAAe,CAAC;YAC1B,KAAK,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBAC9B,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC;gBAC5C,MAAM,UAAU,GAAY,gBAAgB;oBAC1C,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC;oBACvC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;gBACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBACxE,MAAM;YACR,CAAC;YACD,KAAK,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBAC9B,MAAM,SAAS,GAAY,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC1D,IAAI,CAAC,eAAe,CAAC,IAAI,CACvB,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAC/C,CAAC;gBACF,MAAM;YACR,CAAC;YACD,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACnB,IAAI,MAAM,CAAC;gBACX,IAAI,OAAgB,CAAC;gBACrB,MAAM,gBAAgB,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACnE,IAAI,gBAAgB,EAAE,CAAC;oBACrB,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CACjC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CACtC,CAAC;oBACF,IAAI,MAAM,EAAE,CAAC;wBACX,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;oBACxB,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;gBACxB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAC1B,MAAM,EAAE,OAAO,IAAI,MAAM,EAAE,YAAY,IAAI,SAAS,CACrD,CAAC;gBACF,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBACtE,MAAM;YACR,CAAC;YACD,KAAK,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBAC5B,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBACtD,MAAM,MAAM,GAAG,iBAAiB,EAAE,mBAAmB,CAAC,GAAG,CACvD,IAAI,CAAC,IAAI,CAAC,KAAK,CAChB,CAAC;gBACF,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC;gBAChC,IAAI,OAAgB,CAAC;gBACrB,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBACnD,CAAC;gBACD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBACtE,MAAM;YACR,CAAC;YACD,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBACf,MAAM,QAAQ,GAAY,eAAe,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;gBAC/D,MAAM,QAAQ,GAAY,UAAU,CAAC,QAAQ,CAAC;oBAC5C,CAAC,CAAC,QAAQ,CAAC,MAAM;oBACjB,CAAC,CAAC,SAAS,CAAC;gBAEd,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACxC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBACxE,MAAM;YACR,CAAC;YACD,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;gBACvB,MAAM,UAAU,GAAY,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;gBAC9D,IAAI,cAA4C,CAAC;gBACjD,IAAI,UAAyC,CAAC;gBAC9C,IAAI,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;oBAClC,UAAU,GAAG,UAAU,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACrD,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;wBACvB,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC;oBACnC,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAC1B,UAAU,EAAE,OAAO,IAAI,UAAU,EAAE,YAAY,IAAI,SAAS,CAC7D,CAAC;gBACF,IAAI,CAAC,eAAe,CAAC,IAAI,CACvB,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CACzD,CAAC;gBACF,MAAM;YACR,CAAC;YACD,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBACf,MAAM,QAAQ,GAAY,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;gBAC5D,IAAI,SAAS,CAAC;gBACd,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACzB,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC5C,CAAC;gBACD,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;gBAC5B,MAAM;YACR,CAAC;YACD,QAAQ;QAEV,CAAC;IACH,CAAC;IA+BD,KAAK,CAAC,IAAa;QACjB,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,IAAI,CAAC,QAAQ;gBAChB,IAAI,CAAC,yBAAyB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;gBAC5C,MAAM;YACR,KAAK,IAAI,CAAC,aAAa;gBACrB,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC;gBAC5B,MAAM;YACR,KAAK,IAAI,CAAC,KAAK;gBACb,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC;gBAC1B,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;gBACtB,MAAM;YACR,KAAK,IAAI,CAAC,SAAS;gBACjB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBACvB,MAAM;YACR,KAAK,IAAI,CAAC,eAAe;gBACvB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;gBAC/B,MAAM;YACR,KAAK,IAAI,CAAC,oBAAoB,CAAC;YAC/B,KAAK,IAAI,CAAC,eAAe,CAAC;YAC1B,KAAK,IAAI,CAAC,mBAAmB;gBAC3B,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;gBACtB,MAAM;YACR,KAAK,IAAI,CAAC,mBAAmB;gBAC3B,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC;gBAC3B,MAAM;YACR,KAAK,IAAI,CAAC,QAAQ;gBAChB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACtB,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC;gBAC9B,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC;gBAC3B,MAAM;YACR,KAAK,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBAC5B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;gBAC9B,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC;gBAC9B,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC;gBAC3B,MAAM;YACR,CAAC;YACD,KAAK,IAAI,CAAC,IAAI,CAAC;YACf,KAAK,IAAI,CAAC,YAAY;gBACpB,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC;gBAC9B,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC;gBAC3B,MAAM;YACR,KAAK,IAAI,CAAC,IAAI;gBACZ,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBACvB,MAAM;YACR,QAAQ;QAEV,CAAC;IACH,CAAC;CACF;AAED,SAAS,qBAAqB,CAC5B,QAAsB;IAEtB,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAA6B,CAAC;IAChE,KAAK,MAAM,UAAU,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC9C,IAAI,UAAU,CAAC,IAAI,KAAK,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACjD,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAkC,CAAC;YACtE,IAAI,UAAU,CAAC,mBAAmB,EAAE,CAAC;gBACnC,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,mBAAmB,EAAE,CAAC;oBACpD,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;YACD,MAAM,SAAS,GAAG,EAAE,UAAU,EAAE,mBAAmB,EAAE,CAAC;YACtD,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IACD,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAqCD,MAAM,UAAU,iBAAiB,CAC/B,QAAkB,EAClB,OAAmB;IAEnB,OAAO;QACL,KAAK,CAAC,GAAG,IAAI;YACX,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACrB,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrB,MAAM,EAAE,GAAG,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;YAC1D,IAAI,EAAE,EAAE,CAAC;gBACP,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBACvC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACrB,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;wBACnB,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACzB,CAAC;gBACH,CAAC;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QACD,KAAK,CAAC,GAAG,IAAI;YACX,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACrB,MAAM,EAAE,GAAG,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;YAC1D,IAAI,MAAM,CAAC;YACX,IAAI,EAAE,EAAE,CAAC;gBACP,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACnC,CAAC;YACD,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrB,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["/** @category Type Info */\n\nimport type { Maybe } from '../jsutils/Maybe.ts';\n\nimport type {\n  ASTNode,\n  DocumentNode,\n  FragmentDefinitionNode,\n  VariableDefinitionNode,\n} from '../language/ast.ts';\nimport { isNode } from '../language/ast.ts';\nimport { Kind } from '../language/kinds.ts';\nimport type { ASTVisitor } from '../language/visitor.ts';\nimport { getEnterLeaveForKind } from '../language/visitor.ts';\n\nimport type {\n  GraphQLArgument,\n  GraphQLCompositeType,\n  GraphQLEnumValue,\n  GraphQLField,\n  GraphQLInputField,\n  GraphQLInputType,\n  GraphQLOutputType,\n  GraphQLType,\n} from '../type/definition.ts';\nimport {\n  getNamedType,\n  getNullableType,\n  isCompositeType,\n  isEnumType,\n  isInputObjectType,\n  isInputType,\n  isListType,\n  isObjectType,\n  isOutputType,\n} from '../type/definition.ts';\nimport type { GraphQLDirective } from '../type/directives.ts';\nimport type { GraphQLSchema } from '../type/schema.ts';\n\nimport { typeFromAST } from './typeFromAST.ts';\n\n/** @internal */\nexport interface FragmentSignature {\n  readonly definition: FragmentDefinitionNode;\n  readonly variableDefinitions: Map<string, VariableDefinitionNode>;\n}\n\n/**\n * TypeInfo is a utility class which, given a GraphQL schema, can keep track\n * of the current field and type definitions at any point in a GraphQL document\n * AST during a recursive descent by calling `enter(node)` and `leave(node)`.\n */\nexport class TypeInfo {\n  private _schema: GraphQLSchema;\n  private _typeStack: Array<Maybe<GraphQLOutputType>>;\n  private _parentTypeStack: Array<Maybe<GraphQLCompositeType>>;\n  private _inputTypeStack: Array<Maybe<GraphQLInputType>>;\n  private _fieldDefStack: Array<Maybe<GraphQLField<unknown, unknown>>>;\n  private _defaultValueStack: Array<unknown>;\n  private _directive: Maybe<GraphQLDirective>;\n  private _argument: Maybe<GraphQLArgument>;\n  private _enumValue: Maybe<GraphQLEnumValue>;\n  private _fragmentSignaturesByName: (\n    fragmentName: string,\n  ) => Maybe<FragmentSignature>;\n\n  private _fragmentSignature: Maybe<FragmentSignature>;\n  private _fragmentArgument: Maybe<VariableDefinitionNode>;\n\n  /**\n   * Creates a TypeInfo instance.\n   * @param schema - Schema used for type lookups.\n   * @param initialType - Optional type to use at the start of traversal.\n   * @param fragmentSignatures - Fragment signatures available during traversal.\n   * @example\n   * ```ts\n   * // Track field types during a visitWithTypeInfo traversal.\n   * import { parse, visit } from 'graphql/language';\n   * import { buildSchema } from 'graphql/utilities';\n   * import { TypeInfo, visitWithTypeInfo } from 'graphql/utilities';\n   *\n   * const schema = buildSchema(`\n   *   type Query {\n   *     greeting: String\n   *   }\n   * `);\n   * const typeInfo = new TypeInfo(schema);\n   * const seenTypes = [];\n   *\n   * visit(\n   *   parse('{ greeting }'),\n   *   visitWithTypeInfo(typeInfo, {\n   *     Field: () => {\n   *       seenTypes.push(String(typeInfo.getType()));\n   *     },\n   *   }),\n   * );\n   *\n   * seenTypes; // => ['String']\n   * ```\n   * @example\n   * ```ts\n   * // This variant starts from an initial type and supplies fragment signatures.\n   * import { Kind, parse } from 'graphql/language';\n   * import { buildSchema, TypeInfo } from 'graphql/utilities';\n   *\n   * const schema = buildSchema(`\n   *   type Query {\n   *     greeting(name: String): String\n   *   }\n   * `);\n   * const fragmentDocument = parse(\n   *   'fragment GreetingFields($name: String) on Query { greeting(name: $name) }',\n   *   { experimentalFragmentArguments: true },\n   * );\n   * const fragmentDefinition = fragmentDocument.definitions[0];\n   * const variableDefinition = fragmentDefinition.variableDefinitions[0];\n   * const typeInfo = new TypeInfo(schema, schema.getQueryType(), (name) =>\n   *   name === 'GreetingFields'\n   *     ? {\n   *         definition: fragmentDefinition,\n   *         variableDefinitions: new Map([['name', variableDefinition]]),\n   *       }\n   *     : undefined,\n   * );\n   *\n   * typeInfo.enter({\n   *   kind: Kind.SELECTION_SET,\n   *   selections: [],\n   * });\n   * typeInfo.enter({\n   *   kind: Kind.FRAGMENT_SPREAD,\n   *   name: { kind: Kind.NAME, value: 'GreetingFields' },\n   *   arguments: [],\n   *   directives: [],\n   * });\n   *\n   * String(typeInfo.getParentType()); // => 'Query'\n   * typeInfo.getFragmentSignature()?.definition.name.value; // => 'GreetingFields'\n   * ```\n   */\n  constructor(\n    schema: GraphQLSchema,\n    /**\n     * Initial type may be provided in rare cases to facilitate traversals\n     * beginning somewhere other than documents.\n     */\n    initialType?: Maybe<GraphQLType>,\n    fragmentSignatures?: Maybe<\n      (fragmentName: string) => Maybe<FragmentSignature>\n    >,\n  ) {\n    this._schema = schema;\n    this._typeStack = [];\n    this._parentTypeStack = [];\n    this._inputTypeStack = [];\n    this._fieldDefStack = [];\n    this._defaultValueStack = [];\n    this._directive = null;\n    this._argument = null;\n    this._enumValue = null;\n    this._fragmentSignaturesByName = fragmentSignatures ?? (() => null);\n    this._fragmentSignature = null;\n    this._fragmentArgument = null;\n    if (initialType) {\n      if (isInputType(initialType)) {\n        this._inputTypeStack.push(initialType);\n      }\n      if (isCompositeType(initialType)) {\n        this._parentTypeStack.push(initialType);\n      }\n      if (isOutputType(initialType)) {\n        this._typeStack.push(initialType);\n      }\n    }\n  }\n\n  /**\n   * Returns the value used by `Object.prototype.toString`.\n   * @returns The built-in string tag for this object.\n   */\n  get [Symbol.toStringTag](): string {\n    return 'TypeInfo';\n  }\n\n  /**\n   * Returns the current output type at this point in traversal.\n   * @returns The current output type, if known.\n   * @example\n   * ```ts\n   * import { parse, visit } from 'graphql/language';\n   * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities';\n   *\n   * const schema = buildSchema(`\n   *   type Query {\n   *     viewer: User\n   *   }\n   *\n   *   type User {\n   *     name: String\n   *   }\n   * `);\n   * const typeInfo = new TypeInfo(schema);\n   * const fieldTypes = {};\n   *\n   * visit(\n   *   parse('{ viewer { name } }'),\n   *   visitWithTypeInfo(typeInfo, {\n   *     Field: (node) => {\n   *       fieldTypes[node.name.value] = String(typeInfo.getType());\n   *     },\n   *   }),\n   * );\n   *\n   * fieldTypes; // => { viewer: 'User', name: 'String' }\n   * ```\n   */\n  getType(): Maybe<GraphQLOutputType> {\n    return this._typeStack.at(-1);\n  }\n\n  /**\n   * Returns the current parent composite type.\n   * @returns The current parent composite type, if known.\n   * @example\n   * ```ts\n   * import { parse, visit } from 'graphql/language';\n   * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities';\n   *\n   * const schema = buildSchema(`\n   *   type Query {\n   *     viewer: User\n   *   }\n   *\n   *   type User {\n   *     name: String\n   *   }\n   * `);\n   * const typeInfo = new TypeInfo(schema);\n   * const parentTypes = {};\n   *\n   * visit(\n   *   parse('{ viewer { name } }'),\n   *   visitWithTypeInfo(typeInfo, {\n   *     Field: (node) => {\n   *       parentTypes[node.name.value] = String(typeInfo.getParentType());\n   *     },\n   *   }),\n   * );\n   *\n   * parentTypes; // => { viewer: 'Query', name: 'User' }\n   * ```\n   */\n  getParentType(): Maybe<GraphQLCompositeType> {\n    return this._parentTypeStack.at(-1);\n  }\n\n  /**\n   * Returns the current input type at this point in traversal.\n   * @returns The current input type, if known.\n   * @example\n   * ```ts\n   * import { parse, visit } from 'graphql/language';\n   * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities';\n   *\n   * const schema = buildSchema(`\n   *   type Query {\n   *     reviews(stars: Int!, sort: Sort = NEWEST): [String]\n   *   }\n   *\n   *   enum Sort {\n   *     NEWEST\n   *     OLDEST\n   *   }\n   * `);\n   * const typeInfo = new TypeInfo(schema);\n   * const inputTypes = {};\n   *\n   * visit(\n   *   parse('{ reviews(stars: 5, sort: OLDEST) }'),\n   *   visitWithTypeInfo(typeInfo, {\n   *     Argument: (node) => {\n   *       inputTypes[node.name.value] = String(typeInfo.getInputType());\n   *     },\n   *   }),\n   * );\n   *\n   * inputTypes; // => { stars: 'Int!', sort: 'Sort' }\n   * ```\n   */\n  getInputType(): Maybe<GraphQLInputType> {\n    return this._inputTypeStack.at(-1);\n  }\n\n  // Note: continues to expose the closest enclosing valid input type if\n  // traversal descends into syntax with no corresponding GraphQL input type.\n  /**\n   * Returns the parent input type for the current input position.\n   * @returns The parent input type, if known.\n   * @example\n   * ```ts\n   * import { parse, visit } from 'graphql/language';\n   * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities';\n   *\n   * const schema = buildSchema(`\n   *   input ReviewFilter {\n   *     stars: Int!\n   *   }\n   *\n   *   type Query {\n   *     reviews(filter: ReviewFilter): [String]\n   *   }\n   * `);\n   * const typeInfo = new TypeInfo(schema);\n   * const parentInputTypes = {};\n   *\n   * visit(\n   *   parse('{ reviews(filter: { stars: 5 }) }'),\n   *   visitWithTypeInfo(typeInfo, {\n   *     ObjectField: (node) => {\n   *       parentInputTypes[node.name.value] = String(typeInfo.getParentInputType());\n   *     },\n   *   }),\n   * );\n   *\n   * parentInputTypes; // => { stars: 'ReviewFilter' }\n   * ```\n   */\n  getParentInputType(): Maybe<GraphQLInputType> {\n    return this._inputTypeStack.at(-2);\n  }\n\n  /**\n   * Returns the current field definition.\n   * @returns The current field definition, if known.\n   * @example\n   * ```ts\n   * import { parse, visit } from 'graphql/language';\n   * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities';\n   *\n   * const schema = buildSchema(`\n   *   type Query {\n   *     greeting: String\n   *   }\n   * `);\n   * const typeInfo = new TypeInfo(schema);\n   * let fieldName;\n   *\n   * visit(\n   *   parse('{ greeting }'),\n   *   visitWithTypeInfo(typeInfo, {\n   *     Field: () => {\n   *       fieldName = typeInfo.getFieldDef()?.name;\n   *     },\n   *   }),\n   * );\n   *\n   * fieldName; // => 'greeting'\n   * ```\n   */\n  getFieldDef(): Maybe<GraphQLField<unknown, unknown>> {\n    return this._fieldDefStack.at(-1);\n  }\n\n  /**\n   * Returns the default input representation for the current input position.\n   * @returns The current default input, if one is available.\n   * @example\n   * ```ts\n   * import { parse, visit } from 'graphql/language';\n   * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities';\n   *\n   * const schema = buildSchema(`\n   *   type Query {\n   *     reviews(limit: Int = 10): [String]\n   *   }\n   * `);\n   * const typeInfo = new TypeInfo(schema);\n   * let defaultLimit;\n   *\n   * visit(\n   *   parse('{ reviews(limit: 5) }'),\n   *   visitWithTypeInfo(typeInfo, {\n   *     Argument: () => {\n   *       defaultLimit = typeInfo.getDefaultValue();\n   *     },\n   *   }),\n   * );\n   *\n   * defaultLimit; // => { literal: { kind: 'IntValue', value: '10' } }\n   * ```\n   */\n  getDefaultValue(): unknown {\n    return this._defaultValueStack.at(-1);\n  }\n\n  /**\n   * Returns the current directive definition.\n   * @returns The current directive definition, if known.\n   * @example\n   * ```ts\n   * import { parse, visit } from 'graphql/language';\n   * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities';\n   *\n   * const schema = buildSchema(`\n   *   type Query {\n   *     greeting: String\n   *   }\n   * `);\n   * const typeInfo = new TypeInfo(schema);\n   * let directiveName;\n   *\n   * visit(\n   *   parse('{ greeting @include(if: true) }'),\n   *   visitWithTypeInfo(typeInfo, {\n   *     Directive: () => {\n   *       directiveName = typeInfo.getDirective()?.name;\n   *     },\n   *   }),\n   * );\n   *\n   * directiveName; // => 'include'\n   * ```\n   */\n  getDirective(): Maybe<GraphQLDirective> {\n    return this._directive;\n  }\n\n  /**\n   * Returns the current argument definition.\n   * @returns The current argument definition, if known.\n   * @example\n   * ```ts\n   * import { parse, visit } from 'graphql/language';\n   * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities';\n   *\n   * const schema = buildSchema(`\n   *   type Query {\n   *     reviews(limit: Int = 10): [String]\n   *   }\n   * `);\n   * const typeInfo = new TypeInfo(schema);\n   * let argumentName;\n   *\n   * visit(\n   *   parse('{ reviews(limit: 5) }'),\n   *   visitWithTypeInfo(typeInfo, {\n   *     Argument: () => {\n   *       argumentName = typeInfo.getArgument()?.name;\n   *     },\n   *   }),\n   * );\n   *\n   * argumentName; // => 'limit'\n   * ```\n   */\n  getArgument(): Maybe<GraphQLArgument> {\n    return this._argument;\n  }\n\n  /**\n   * Returns the current fragment signature.\n   * @returns The fragment signature for the current fragment definition.\n   * @example\n   * ```ts\n   * import { parse, visit } from 'graphql/language';\n   * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities';\n   *\n   * const schema = buildSchema(`\n   *   type Query {\n   *     greeting: String\n   *   }\n   * `);\n   * const document = parse(\n   *   `\n   *     {\n   *       ...GreetingFields\n   *     }\n   *\n   *     fragment GreetingFields on Query {\n   *       greeting\n   *     }\n   *   `,\n   *   { experimentalFragmentArguments: true },\n   * );\n   * const typeInfo = new TypeInfo(schema);\n   * let fragmentName;\n   *\n   * visit(\n   *   document,\n   *   visitWithTypeInfo(typeInfo, {\n   *     FragmentSpread: () => {\n   *       fragmentName = typeInfo.getFragmentSignature()?.definition.name.value;\n   *     },\n   *   }),\n   * );\n   *\n   * fragmentName; // => 'GreetingFields'\n   * ```\n   */\n  getFragmentSignature(): Maybe<FragmentSignature> {\n    return this._fragmentSignature;\n  }\n\n  /**\n   * Returns the function used to look up fragment signatures by name.\n   * @returns A function that maps fragment names to fragment signatures.\n   * @example\n   * ```ts\n   * import { parse, visit } from 'graphql/language';\n   * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities';\n   *\n   * const schema = buildSchema(`\n   *   type Query {\n   *     greeting: String\n   *   }\n   * `);\n   * const document = parse(\n   *   `\n   *     {\n   *       ...GreetingFields\n   *     }\n   *\n   *     fragment GreetingFields on Query {\n   *       greeting\n   *     }\n   *   `,\n   *   { experimentalFragmentArguments: true },\n   * );\n   * const typeInfo = new TypeInfo(schema);\n   * let fragmentName;\n   *\n   * visit(\n   *   document,\n   *   visitWithTypeInfo(typeInfo, {\n   *     Document: () => {\n   *       const getFragmentSignature = typeInfo.getFragmentSignatureByName();\n   *       fragmentName =\n   *         getFragmentSignature('GreetingFields')?.definition.name.value;\n   *     },\n   *   }),\n   * );\n   *\n   * fragmentName; // => 'GreetingFields'\n   * ```\n   */\n  getFragmentSignatureByName(): (\n    fragmentName: string,\n  ) => Maybe<FragmentSignature> {\n    return this._fragmentSignaturesByName;\n  }\n\n  /**\n   * Returns the current fragment argument definition.\n   * @returns The variable definition for the current fragment argument.\n   * @example\n   * ```ts\n   * import { parse, visit } from 'graphql/language';\n   * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities';\n   *\n   * const schema = buildSchema(`\n   *   type Query {\n   *     greeting(name: String): String\n   *   }\n   * `);\n   * const document = parse(\n   *   `\n   *     {\n   *       ...GreetingFields(name: \"Ada\")\n   *     }\n   *\n   *     fragment GreetingFields($name: String) on Query {\n   *       greeting(name: $name)\n   *     }\n   *   `,\n   *   { experimentalFragmentArguments: true },\n   * );\n   * const typeInfo = new TypeInfo(schema);\n   * let argumentName;\n   *\n   * visit(\n   *   document,\n   *   visitWithTypeInfo(typeInfo, {\n   *     FragmentArgument: () => {\n   *       argumentName = typeInfo.getFragmentArgument()?.variable.name.value;\n   *     },\n   *   }),\n   * );\n   *\n   * argumentName; // => 'name'\n   * ```\n   */\n  getFragmentArgument(): Maybe<VariableDefinitionNode> {\n    return this._fragmentArgument;\n  }\n\n  /**\n   * Returns the current enum value definition.\n   * @returns The current enum value definition, if known.\n   * @example\n   * ```ts\n   * import { parse, visit } from 'graphql/language';\n   * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities';\n   *\n   * const schema = buildSchema(`\n   *   enum Sort {\n   *     NEWEST\n   *     OLDEST\n   *   }\n   *\n   *   type Query {\n   *     reviews(sort: Sort = NEWEST): [String]\n   *   }\n   * `);\n   * const typeInfo = new TypeInfo(schema);\n   * let enumValueName;\n   *\n   * visit(\n   *   parse('{ reviews(sort: OLDEST) }'),\n   *   visitWithTypeInfo(typeInfo, {\n   *     EnumValue: () => {\n   *       enumValueName = typeInfo.getEnumValue()?.name;\n   *     },\n   *   }),\n   * );\n   *\n   * enumValueName; // => 'OLDEST'\n   * ```\n   */\n  getEnumValue(): Maybe<GraphQLEnumValue> {\n    return this._enumValue;\n  }\n\n  /**\n   * Updates this TypeInfo instance for an entered AST node.\n   * @param node - AST node being entered.\n   * @returns Nothing.\n   * @example\n   * ```ts\n   * import { Kind, parse } from 'graphql/language';\n   * import { buildSchema, TypeInfo } from 'graphql/utilities';\n   *\n   * const schema = buildSchema(`\n   *   type Query {\n   *     greeting: String\n   *   }\n   * `);\n   * const document = parse('{ greeting }');\n   * const operation = document.definitions[0];\n   * const selectionSet = operation.selectionSet;\n   * const field = selectionSet.selections[0];\n   * const typeInfo = new TypeInfo(schema);\n   *\n   * typeInfo.enter(operation);\n   * typeInfo.enter(selectionSet);\n   * typeInfo.enter(field);\n   *\n   * field.kind; // => Kind.FIELD\n   * typeInfo.getParentType()?.name; // => 'Query'\n   * String(typeInfo.getType()); // => 'String'\n   * ```\n   */\n  enter(node: ASTNode): void {\n    const schema = this._schema;\n    // Note: many of the types below are explicitly typed as \"unknown\" to drop\n    // any assumptions of a valid schema to ensure runtime types are properly\n    // checked before continuing since TypeInfo is used as part of validation\n    // which occurs before guarantees of schema and document validity.\n    switch (node.kind) {\n      case Kind.DOCUMENT: {\n        const fragmentSignatures = getFragmentSignatures(node);\n        this._fragmentSignaturesByName = (fragmentName: string) =>\n          fragmentSignatures.get(fragmentName);\n        break;\n      }\n      case Kind.SELECTION_SET: {\n        const namedType: unknown = getNamedType(this.getType());\n        this._parentTypeStack.push(\n          isCompositeType(namedType) ? namedType : undefined,\n        );\n        break;\n      }\n      case Kind.FIELD: {\n        const parentType = this.getParentType();\n        let fieldDef;\n        let fieldType: unknown;\n        if (parentType) {\n          fieldDef = schema.getField(parentType, node.name.value);\n          if (fieldDef) {\n            fieldType = fieldDef.type;\n          }\n        }\n        this._fieldDefStack.push(fieldDef);\n        this._typeStack.push(isOutputType(fieldType) ? fieldType : undefined);\n        break;\n      }\n      case Kind.DIRECTIVE:\n        this._directive = schema.getDirective(node.name.value);\n        break;\n      case Kind.OPERATION_DEFINITION: {\n        const rootType = schema.getRootType(node.operation);\n        this._typeStack.push(isObjectType(rootType) ? rootType : undefined);\n        break;\n      }\n      case Kind.FRAGMENT_SPREAD: {\n        this._fragmentSignature = this.getFragmentSignatureByName()(\n          node.name.value,\n        );\n        break;\n      }\n      case Kind.INLINE_FRAGMENT:\n      case Kind.FRAGMENT_DEFINITION: {\n        const typeConditionAST = node.typeCondition;\n        const outputType: unknown = typeConditionAST\n          ? typeFromAST(schema, typeConditionAST)\n          : getNamedType(this.getType());\n        this._typeStack.push(isOutputType(outputType) ? outputType : undefined);\n        break;\n      }\n      case Kind.VARIABLE_DEFINITION: {\n        const inputType: unknown = typeFromAST(schema, node.type);\n        this._inputTypeStack.push(\n          isInputType(inputType) ? inputType : undefined,\n        );\n        break;\n      }\n      case Kind.ARGUMENT: {\n        let argDef;\n        let argType: unknown;\n        const fieldOrDirective = this.getDirective() ?? this.getFieldDef();\n        if (fieldOrDirective) {\n          argDef = fieldOrDirective.args.find(\n            (arg) => arg.name === node.name.value,\n          );\n          if (argDef) {\n            argType = argDef.type;\n          }\n        }\n        this._argument = argDef;\n        this._defaultValueStack.push(\n          argDef?.default ?? argDef?.defaultValue ?? undefined,\n        );\n        this._inputTypeStack.push(isInputType(argType) ? argType : undefined);\n        break;\n      }\n      case Kind.FRAGMENT_ARGUMENT: {\n        const fragmentSignature = this.getFragmentSignature();\n        const argDef = fragmentSignature?.variableDefinitions.get(\n          node.name.value,\n        );\n        this._fragmentArgument = argDef;\n        let argType: unknown;\n        if (argDef) {\n          argType = typeFromAST(this._schema, argDef.type);\n        }\n        this._inputTypeStack.push(isInputType(argType) ? argType : undefined);\n        break;\n      }\n      case Kind.LIST: {\n        const listType: unknown = getNullableType(this.getInputType());\n        const itemType: unknown = isListType(listType)\n          ? listType.ofType\n          : undefined;\n        // List positions never have a default value.\n        this._defaultValueStack.push(undefined);\n        this._inputTypeStack.push(isInputType(itemType) ? itemType : undefined);\n        break;\n      }\n      case Kind.OBJECT_FIELD: {\n        const objectType: unknown = getNamedType(this.getInputType());\n        let inputFieldType: GraphQLInputType | undefined;\n        let inputField: GraphQLInputField | undefined;\n        if (isInputObjectType(objectType)) {\n          inputField = objectType.getFields()[node.name.value];\n          if (inputField != null) {\n            inputFieldType = inputField.type;\n          }\n        }\n        this._defaultValueStack.push(\n          inputField?.default ?? inputField?.defaultValue ?? undefined,\n        );\n        this._inputTypeStack.push(\n          isInputType(inputFieldType) ? inputFieldType : undefined,\n        );\n        break;\n      }\n      case Kind.ENUM: {\n        const enumType: unknown = getNamedType(this.getInputType());\n        let enumValue;\n        if (isEnumType(enumType)) {\n          enumValue = enumType.getValue(node.value);\n        }\n        this._enumValue = enumValue;\n        break;\n      }\n      default:\n      // Ignore other nodes\n    }\n  }\n\n  /**\n   * Updates this TypeInfo instance for a left AST node.\n   * @param node - AST node being entered.\n   * @returns Nothing.\n   * @example\n   * ```ts\n   * import { parse } from 'graphql/language';\n   * import { buildSchema, TypeInfo } from 'graphql/utilities';\n   *\n   * const schema = buildSchema(`\n   *   type Query {\n   *     greeting: String\n   *   }\n   * `);\n   * const document = parse('{ greeting }');\n   * const operation = document.definitions[0];\n   * const selectionSet = operation.selectionSet;\n   * const field = selectionSet.selections[0];\n   * const typeInfo = new TypeInfo(schema);\n   *\n   * typeInfo.enter(operation);\n   * typeInfo.enter(selectionSet);\n   * typeInfo.enter(field);\n   * String(typeInfo.getType()); // => 'String'\n   *\n   * typeInfo.leave(field);\n   * typeInfo.getType(); // => undefined\n   * ```\n   */\n  leave(node: ASTNode): void {\n    switch (node.kind) {\n      case Kind.DOCUMENT:\n        this._fragmentSignaturesByName = () => null;\n        break;\n      case Kind.SELECTION_SET:\n        this._parentTypeStack.pop();\n        break;\n      case Kind.FIELD:\n        this._fieldDefStack.pop();\n        this._typeStack.pop();\n        break;\n      case Kind.DIRECTIVE:\n        this._directive = null;\n        break;\n      case Kind.FRAGMENT_SPREAD:\n        this._fragmentSignature = null;\n        break;\n      case Kind.OPERATION_DEFINITION:\n      case Kind.INLINE_FRAGMENT:\n      case Kind.FRAGMENT_DEFINITION:\n        this._typeStack.pop();\n        break;\n      case Kind.VARIABLE_DEFINITION:\n        this._inputTypeStack.pop();\n        break;\n      case Kind.ARGUMENT:\n        this._argument = null;\n        this._defaultValueStack.pop();\n        this._inputTypeStack.pop();\n        break;\n      case Kind.FRAGMENT_ARGUMENT: {\n        this._fragmentArgument = null;\n        this._defaultValueStack.pop();\n        this._inputTypeStack.pop();\n        break;\n      }\n      case Kind.LIST:\n      case Kind.OBJECT_FIELD:\n        this._defaultValueStack.pop();\n        this._inputTypeStack.pop();\n        break;\n      case Kind.ENUM:\n        this._enumValue = null;\n        break;\n      default:\n      // Ignore other nodes\n    }\n  }\n}\n\nfunction getFragmentSignatures(\n  document: DocumentNode,\n): Map<string, FragmentSignature> {\n  const fragmentSignatures = new Map<string, FragmentSignature>();\n  for (const definition of document.definitions) {\n    if (definition.kind === Kind.FRAGMENT_DEFINITION) {\n      const variableDefinitions = new Map<string, VariableDefinitionNode>();\n      if (definition.variableDefinitions) {\n        for (const varDef of definition.variableDefinitions) {\n          variableDefinitions.set(varDef.variable.name.value, varDef);\n        }\n      }\n      const signature = { definition, variableDefinitions };\n      fragmentSignatures.set(definition.name.value, signature);\n    }\n  }\n  return fragmentSignatures;\n}\n\n/**\n * Creates a new visitor instance which maintains a provided TypeInfo instance\n * along with visiting visitor.\n * @param typeInfo - TypeInfo instance to update during traversal.\n * @param visitor - Visitor callbacks to wrap with TypeInfo updates.\n * @returns A visitor that keeps TypeInfo in sync while delegating callbacks.\n * @example\n * ```ts\n * import { parse, visit } from 'graphql/language';\n * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities';\n *\n * const schema = buildSchema(`\n *   type Query {\n *     greeting: String\n *   }\n * `);\n * const typeInfo = new TypeInfo(schema);\n * const fields = [];\n *\n * visit(\n *   parse('{ greeting }'),\n *   visitWithTypeInfo(typeInfo, {\n *     Field: (node) => {\n *       fields.push({\n *         name: node.name.value,\n *         parentType: String(typeInfo.getParentType()),\n *         type: String(typeInfo.getType()),\n *       });\n *     },\n *   }),\n * );\n *\n * fields; // => [{ name: 'greeting', parentType: 'Query', type: 'String' }]\n * ```\n */\nexport function visitWithTypeInfo(\n  typeInfo: TypeInfo,\n  visitor: ASTVisitor,\n): ASTVisitor {\n  return {\n    enter(...args) {\n      const node = args[0];\n      typeInfo.enter(node);\n      const fn = getEnterLeaveForKind(visitor, node.kind).enter;\n      if (fn) {\n        const result = fn.apply(visitor, args);\n        if (result !== undefined) {\n          typeInfo.leave(node);\n          if (isNode(result)) {\n            typeInfo.enter(result);\n          }\n        }\n        return result;\n      }\n    },\n    leave(...args) {\n      const node = args[0];\n      const fn = getEnterLeaveForKind(visitor, node.kind).leave;\n      let result;\n      if (fn) {\n        result = fn.apply(visitor, args);\n      }\n      typeInfo.leave(node);\n      return result;\n    },\n  };\n}\n"]}