Skip to content

Commit 74bb0d3

Browse files
committed
Add assertion on specifiedBy in extendSchema test
1 parent ab93443 commit 74bb0d3

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

src/utilities/__tests__/extendSchema-test.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,13 +345,23 @@ describe('extendSchema', () => {
345345
}
346346
347347
scalar Foo
348+
349+
directive @foo on SCALAR
348350
`);
349351
const extensionSDL = dedent`
350-
extend scalar Foo @specified(by: "https://example.com/foo_spec")
352+
extend scalar Foo @foo
353+
354+
extend scalar Foo @specified(by: "https://first.com/foo_spec")
355+
356+
extend scalar Foo @specified(by: "https://second.com/foo_spec")
351357
`;
358+
352359
const extendedSchema = extendSchema(schema, parse(extensionSDL));
353360
const foo = extendedSchema.getType('Foo');
354361

362+
// Assert that the last specifiedBy takes precedence
363+
expect(foo.toConfig().specifiedBy).to.equal('https://second.com/foo_spec');
364+
355365
expect(validateSchema(extendedSchema)).to.deep.equal([]);
356366
expect(printExtensionNodes(foo)).to.deep.equal(extensionSDL);
357367
});

src/utilities/extendSchema.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import {
4040
type EnumValueDefinitionNode,
4141
type DirectiveDefinitionNode,
4242
type ScalarTypeDefinitionNode,
43+
type ScalarTypeExtensionNode,
4344
} from '../language/ast';
4445

4546
import { assertValidSDLExtension } from '../validation/validate';
@@ -329,9 +330,14 @@ export function extendSchemaImpl(
329330
function extendScalarType(type: GraphQLScalarType): GraphQLScalarType {
330331
const config = type.toConfig();
331332
const extensions = typeExtensionsMap[config.name] || [];
333+
const specifiedBys = [
334+
config.specifiedBy,
335+
...extensions.map(getSpecifiedBy),
336+
].filter(Boolean);
332337

333338
return new GraphQLScalarType({
334339
...config,
340+
specifiedBy: specifiedBys[specifiedBys.length - 1],
335341
extensionASTNodes: concatMaybeArrays(
336342
config.extensionASTNodes,
337343
extensions,
@@ -729,7 +735,9 @@ function getDeprecationReason(
729735
/**
730736
* Given a scalar node, returns the string value for the specified by.
731737
*/
732-
function getSpecifiedBy(node: ScalarTypeDefinitionNode): ?string {
738+
function getSpecifiedBy(
739+
node: ScalarTypeDefinitionNode | ScalarTypeExtensionNode,
740+
): ?string {
733741
const specified = getDirectiveValues(GraphQLSpecifiedDirective, node);
734742
return specified && (specified.by: any);
735743
}

0 commit comments

Comments
 (0)