UNPKG

graphql

Version:

A Query Language and Runtime which can target any service.

1 lines 5.81 kB
{"version":3,"file":"lexicographicSortSchema.js","sourceRoot":"","sources":["../../src/utilities/lexicographicSortSchema.ts"],"names":[],"mappings":"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","sourcesContent":["/** @category Schema Construction */\n\nimport { naturalCompare } from '../jsutils/naturalCompare.ts';\nimport type { ObjMap } from '../jsutils/ObjMap.ts';\n\nimport { GraphQLSchema } from '../type/schema.ts';\n\nimport { mapSchemaConfig, SchemaElementKind } from './mapSchemaConfig.ts';\n\n/**\n * Sort GraphQLSchema.\n *\n * This function returns a sorted copy of the given GraphQLSchema.\n * @param schema - GraphQL schema to use.\n * @returns A copy of the schema with types, fields, arguments, and values sorted lexicographically.\n * @example\n * ```ts\n * import {\n * buildSchema,\n * lexicographicSortSchema,\n * printSchema,\n * } from 'graphql/utilities';\n *\n * const schema = buildSchema(`\n * type Query {\n * zebra: String\n * apple: String\n * }\n *\n * enum Episode {\n * JEDI\n * NEW_HOPE\n * EMPIRE\n * }\n * `);\n *\n * const sortedSchema = lexicographicSortSchema(schema);\n *\n * printSchema(sortedSchema);\n * // =>\n * // enum Episode {\n * // EMPIRE\n * // JEDI\n * // NEW_HOPE\n * // }\n * //\n * // type Query {\n * // apple: String\n * // zebra: String\n * // }\n * ```\n */\nexport function lexicographicSortSchema(schema: GraphQLSchema): GraphQLSchema {\n return new GraphQLSchema(\n mapSchemaConfig(schema.toConfig(), () => ({\n [SchemaElementKind.OBJECT]: (config) => ({\n ...config,\n interfaces: () => sortByName(config.interfaces()),\n fields: () => sortObjMap(config.fields()),\n }),\n [SchemaElementKind.FIELD]: (config) => ({\n ...config,\n args: sortObjMap(config.args),\n }),\n [SchemaElementKind.INTERFACE]: (config) => ({\n ...config,\n interfaces: () => sortByName(config.interfaces()),\n fields: () => sortObjMap(config.fields()),\n }),\n [SchemaElementKind.UNION]: (config) => ({\n ...config,\n types: () => sortByName(config.types()),\n }),\n [SchemaElementKind.ENUM]: (config) => ({\n ...config,\n values: () => sortObjMap(config.values()),\n }),\n [SchemaElementKind.INPUT_OBJECT]: (config) => ({\n ...config,\n fields: () => sortObjMap(config.fields()),\n }),\n [SchemaElementKind.DIRECTIVE]: (config) => ({\n ...config,\n locations: sortBy(config.locations, (x) => x),\n args: sortObjMap(config.args),\n }),\n [SchemaElementKind.SCHEMA]: (config) => ({\n ...config,\n types: sortByName(config.types),\n directives: sortByName(config.directives),\n }),\n })),\n );\n}\n\nfunction sortObjMap<T, R>(map: ObjMap<T>): ObjMap<R> {\n const sortedMap = Object.create(null);\n for (const key of Object.keys(map).sort(naturalCompare)) {\n sortedMap[key] = map[key];\n }\n return sortedMap;\n}\n\nfunction sortByName<T extends { readonly name: string }>(\n array: ReadonlyArray<T>,\n): Array<T> {\n return sortBy(array, (obj) => obj.name);\n}\n\nfunction sortBy<T>(\n array: ReadonlyArray<T>,\n mapToKey: (item: T) => string,\n): Array<T> {\n return array.slice().sort((obj1, obj2) => {\n const key1 = mapToKey(obj1);\n const key2 = mapToKey(obj2);\n return naturalCompare(key1, key2);\n });\n}\n"]}