Spaces:
Running
Running
; | |
Object.defineProperty(exports, '__esModule', { | |
value: true, | |
}); | |
exports.lexicographicSortSchema = lexicographicSortSchema; | |
var _inspect = require('../jsutils/inspect.js'); | |
var _invariant = require('../jsutils/invariant.js'); | |
var _keyValMap = require('../jsutils/keyValMap.js'); | |
var _naturalCompare = require('../jsutils/naturalCompare.js'); | |
var _definition = require('../type/definition.js'); | |
var _directives = require('../type/directives.js'); | |
var _introspection = require('../type/introspection.js'); | |
var _schema = require('../type/schema.js'); | |
/** | |
* Sort GraphQLSchema. | |
* | |
* This function returns a sorted copy of the given GraphQLSchema. | |
*/ | |
function lexicographicSortSchema(schema) { | |
const schemaConfig = schema.toConfig(); | |
const typeMap = (0, _keyValMap.keyValMap)( | |
sortByName(schemaConfig.types), | |
(type) => type.name, | |
sortNamedType, | |
); | |
return new _schema.GraphQLSchema({ | |
...schemaConfig, | |
types: Object.values(typeMap), | |
directives: sortByName(schemaConfig.directives).map(sortDirective), | |
query: replaceMaybeType(schemaConfig.query), | |
mutation: replaceMaybeType(schemaConfig.mutation), | |
subscription: replaceMaybeType(schemaConfig.subscription), | |
}); | |
function replaceType(type) { | |
if ((0, _definition.isListType)(type)) { | |
// @ts-expect-error | |
return new _definition.GraphQLList(replaceType(type.ofType)); | |
} else if ((0, _definition.isNonNullType)(type)) { | |
// @ts-expect-error | |
return new _definition.GraphQLNonNull(replaceType(type.ofType)); | |
} // @ts-expect-error FIXME: TS Conversion | |
return replaceNamedType(type); | |
} | |
function replaceNamedType(type) { | |
return typeMap[type.name]; | |
} | |
function replaceMaybeType(maybeType) { | |
return maybeType && replaceNamedType(maybeType); | |
} | |
function sortDirective(directive) { | |
const config = directive.toConfig(); | |
return new _directives.GraphQLDirective({ | |
...config, | |
locations: sortBy(config.locations, (x) => x), | |
args: sortArgs(config.args), | |
}); | |
} | |
function sortArgs(args) { | |
return sortObjMap(args, (arg) => ({ ...arg, type: replaceType(arg.type) })); | |
} | |
function sortFields(fieldsMap) { | |
return sortObjMap(fieldsMap, (field) => ({ | |
...field, | |
type: replaceType(field.type), | |
args: field.args && sortArgs(field.args), | |
})); | |
} | |
function sortInputFields(fieldsMap) { | |
return sortObjMap(fieldsMap, (field) => ({ | |
...field, | |
type: replaceType(field.type), | |
})); | |
} | |
function sortTypes(array) { | |
return sortByName(array).map(replaceNamedType); | |
} | |
function sortNamedType(type) { | |
if ( | |
(0, _definition.isScalarType)(type) || | |
(0, _introspection.isIntrospectionType)(type) | |
) { | |
return type; | |
} | |
if ((0, _definition.isObjectType)(type)) { | |
const config = type.toConfig(); | |
return new _definition.GraphQLObjectType({ | |
...config, | |
interfaces: () => sortTypes(config.interfaces), | |
fields: () => sortFields(config.fields), | |
}); | |
} | |
if ((0, _definition.isInterfaceType)(type)) { | |
const config = type.toConfig(); | |
return new _definition.GraphQLInterfaceType({ | |
...config, | |
interfaces: () => sortTypes(config.interfaces), | |
fields: () => sortFields(config.fields), | |
}); | |
} | |
if ((0, _definition.isUnionType)(type)) { | |
const config = type.toConfig(); | |
return new _definition.GraphQLUnionType({ | |
...config, | |
types: () => sortTypes(config.types), | |
}); | |
} | |
if ((0, _definition.isEnumType)(type)) { | |
const config = type.toConfig(); | |
return new _definition.GraphQLEnumType({ | |
...config, | |
values: sortObjMap(config.values, (value) => value), | |
}); | |
} | |
if ((0, _definition.isInputObjectType)(type)) { | |
const config = type.toConfig(); | |
return new _definition.GraphQLInputObjectType({ | |
...config, | |
fields: () => sortInputFields(config.fields), | |
}); | |
} | |
/* c8 ignore next 3 */ | |
// Not reachable, all possible types have been considered. | |
false || | |
(0, _invariant.invariant)( | |
false, | |
'Unexpected type: ' + (0, _inspect.inspect)(type), | |
); | |
} | |
} | |
function sortObjMap(map, sortValueFn) { | |
const sortedMap = Object.create(null); | |
for (const key of Object.keys(map).sort(_naturalCompare.naturalCompare)) { | |
sortedMap[key] = sortValueFn(map[key]); | |
} | |
return sortedMap; | |
} | |
function sortByName(array) { | |
return sortBy(array, (obj) => obj.name); | |
} | |
function sortBy(array, mapToKey) { | |
return array.slice().sort((obj1, obj2) => { | |
const key1 = mapToKey(obj1); | |
const key2 = mapToKey(obj2); | |
return (0, _naturalCompare.naturalCompare)(key1, key2); | |
}); | |
} | |