{"id":18398,"library":"graphql-compose","title":"graphql-compose","description":"Programmatic GraphQL schema builder with a type registry for constructing and editing output/input types, fields, arguments, and interfaces. v9.1.0 (stable) supports GraphQL v14–16, ships TypeScript definitions, and is ESM-only. Key differentiators vs graphql-tools: Resolver abstraction for CRUD operations, built-in projection parser from AST, OutputType-to-InputType converter, and plugin ecosystem (mongoose, JSON, Elasticsearch). Releases ~monthly; recent fixes address security (removed object-path) and TypeScript compatibility.","status":"active","version":"9.1.0","language":"javascript","source_language":"en","source_url":"https://github.com/graphql-compose/graphql-compose","tags":["javascript","graphql","compose","typescript"],"install":[{"cmd":"npm install graphql-compose","lang":"bash","label":"npm"},{"cmd":"yarn add graphql-compose","lang":"bash","label":"yarn"},{"cmd":"pnpm add graphql-compose","lang":"bash","label":"pnpm"}],"dependencies":[{"reason":"peer dependency; required to run GraphQL schemas","package":"graphql","optional":false}],"imports":[{"note":"Default export is not available; named export only. Since v9, ESM-only; use import statement.","wrong":"const schemaComposer = require('graphql-compose').schemaComposer","symbol":"schemaComposer","correct":"import { schemaComposer } from 'graphql-compose'"},{"note":"Named export for type composer; default export does not exist.","wrong":"import ObjectTypeComposer from 'graphql-compose'","symbol":"ObjectTypeComposer","correct":"import { ObjectTypeComposer } from 'graphql-compose'"},{"note":"Resolver class for defining named GraphQL field configs.","wrong":"","symbol":"Resolver","correct":"import { Resolver } from 'graphql-compose'"},{"note":"Custom scalar; use named import.","wrong":"const { GraphQLDate } = require('graphql-compose')","symbol":"GraphQLDate","correct":"import { GraphQLDate } from 'graphql-compose'"},{"note":"Import types when only type information is needed (TS).","wrong":"","symbol":"graphql-compose types","correct":"import type { ObjectTypeComposer } from 'graphql-compose'"}],"quickstart":{"code":"import { schemaComposer, ObjectTypeComposer, Resolver } from 'graphql-compose';\nimport { GraphQLSchema, GraphQLObjectType, GraphQLString } from 'graphql';\n\nconst UserTC = schemaComposer.createObjectTC({\n  name: 'User',\n  fields: {\n    id: 'ID!',\n    name: 'String!',\n  },\n});\n\nUserTC.addResolver({\n  name: 'findById',\n  type: UserTC,\n  args: { id: 'ID!' },\n  resolve: async ({ args }) => {\n    // pretend to fetch from DB\n    return { id: args.id, name: 'John' };\n  },\n});\n\nschemaComposer.Query.addFields({\n  user: UserTC.getResolver('findById'),\n});\n\nconst schema = schemaComposer.buildSchema();\nconsole.log(schema);\n// schema ready to be used with express-graphql or other server","lang":"typescript","description":"Creates an object type composer for User, adds a resolver, attaches to Query root, builds schema."},"warnings":[{"fix":"Upgrade graphql to v14, v15, or v16. If locked to v13, stay on graphql-compose v8.","message":"v9 dropped support for GraphQL v13 and older; peer dependency now requires graphql@^14.2.0 || ^15.0.0 || ^16.0.0","severity":"breaking","affected_versions":">=9.0.0"},{"fix":"Use import statements or dynamic import(). If CJS required, stick with v8.","message":"v9 is ESM-only; CommonJS require() will fail.","severity":"breaking","affected_versions":">=9.0.0"},{"fix":"If using deep path access, migrate to ES2020 optional chaining or lodash.get.","message":"Removed object-path dependency due to security alerts; use native lodash.get or optional chaining.","severity":"deprecated","affected_versions":">=9.0.5"},{"fix":"Use import { schemaComposer } for shared app schema; use new SchemaComposer() for isolated test contexts.","message":"schemaComposer is a singleton; importing it multiple times yields the same instance. Do not create new instances with new SchemaComposer() unless you intend separate registries.","severity":"gotcha","affected_versions":">=7.0.0"},{"fix":"Consider using addFields or removeField methods; check for deprecation warnings in v10.","message":"ObjectTypeComposer.setField() mutates the type in-place; future versions may prefer immutable patterns.","severity":"deprecated","affected_versions":">=9.0.0"}],"env_vars":null,"last_verified":"2026-04-25T00:00:00.000Z","next_check":"2026-07-24T00:00:00.000Z","problems":[{"fix":"Ensure the type is created (e.g., schemaComposer.createObjectTC) before referencing it in resolver type field.","cause":"Resolver referenced a type that hasn't been added to the schemaComposer yet.","error":"TypeError: Cannot read properties of undefined (reading 'getType')"},{"fix":"Do not create an object type composer with same name as root types. Use schemaComposer.Query directly.","cause":"Accidentally created duplicate root types via schemaComposer.Query.addFields() and schemaComposer.createObjectTC({ name: 'Query'}).","error":"Error: Schema must contain uniquely named types but contains multiple types named \"Query\"."},{"fix":"Verify resolver returns an object matching UserTC fields and that schemaComposer.buildSchema() is called after adding resolvers.","cause":"Resolver type is set to UserTC but resolver does not return object; or query selects subfields but schema built incorrectly.","error":"GraphQLError: Field \"user\" must not have a selection since type \"User\" has no subfields."},{"fix":"npm install graphql@^14.2.0 || ^15.0.0 || ^16.0.0","cause":"Missing graphql peer dependency.","error":"Module not found: Can't resolve 'graphql' in ..."}],"ecosystem":"npm","meta_description":null,"install_score":null,"install_tag":null,"quickstart_score":null,"quickstart_tag":null}