You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
177 lines
4.6 KiB
177 lines
4.6 KiB
'use strict'; |
|
|
|
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); |
|
}); |
|
}
|
|
|