From 0f45eea149693614e2846050a159ea4b6e74ca95 Mon Sep 17 00:00:00 2001 From: Alex Reilly Date: Mon, 13 Sep 2021 18:54:04 -0700 Subject: [PATCH 01/64] apply old changes on top of up to date main branch --- graphql-16.0.0-rc.3.tgz | Bin 0 -> 277476 bytes src/__testUtils__/kitchenSinkQuery.ts | 4 + src/execution/__tests__/executor-test.ts | 151 ++++++++++ src/execution/execute.ts | 4 +- src/index.ts | 3 + src/language/__tests__/lexer-test.ts | 22 +- src/language/__tests__/parser-test.ts | 64 +++++ src/language/__tests__/printer-test.ts | 5 + src/language/__tests__/visitor-test.ts | 20 ++ src/language/ast.ts | 3 + src/language/lexer.ts | 2 + src/language/parser.ts | 12 + src/language/printer.ts | 17 +- src/language/tokenKind.ts | 1 + src/utilities/applyRequiredStatus.ts | 19 ++ src/utilities/index.ts | 2 + src/validation/.DS_Store | Bin 0 -> 6148 bytes .../OverlappingFieldsCanBeMergedRule-test.ts | 261 ++++++++++++++++++ .../rules/OverlappingFieldsCanBeMergedRule.ts | 29 +- 19 files changed, 594 insertions(+), 25 deletions(-) create mode 100644 graphql-16.0.0-rc.3.tgz create mode 100644 src/utilities/applyRequiredStatus.ts create mode 100644 src/validation/.DS_Store diff --git a/graphql-16.0.0-rc.3.tgz b/graphql-16.0.0-rc.3.tgz new file mode 100644 index 0000000000000000000000000000000000000000..7012e9e912d5f129f903e3b6cc7fc6eac2eeece8 GIT binary patch literal 277476 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%0DhrAtBTNW?)EpR55!_%IQ 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

Y_@#zWV>q+@=&24NZAuEc|60bN@ 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%0Aj}+ATh3OO^8_%+1eidmYzcKrYzNjag=q~CjMl@M zIHf#hf%%wgXBDZxlo&4Dcy`m&W6Qp@x&YxkrFZIevBCp+u2C;7=Q1{9jaj)R$bY)l z^SnzoGBc+c3Y<}KW(0njb^!igri=wubCi5I5@z`7iGzJsER&pipoCq!LVH&j9hMg! z^Tf1vo1kP?rrYThXlma@IsD6c$~C&_#oWxvcD?JZSfdnKQZbl>v_jx_!}33ZiP$MW zlOrQj!=VV#?$Fa0WByz;&66<u|Livb>5Gz_EX#$I9Dt@;Lecp2jlX4 zf*rjLvvRy=@Dcdz>-@a54UQQ380Gy;CH?stWcT33j7Q{4ONEp06d=kK2u`S@Gcl2c zqLC&76O`{7cbV`HKt*6=J_2naEv`X$TL3fp-zfc+uuf#EyqyYpGI=n~D>vQ$U>&wg zqu%+1&r{5uEci^R`+O<6Op&?i;0l8nuw zu2Y3kT55t zA(xM%*rFDo-I3MJlCdow?FdW>MBK8=yB^A&-^9rUn<;;^(_=&1;GN zSpW7GvUkB76SRKo*?&R+`TjZOUk&=){n7ssxUEt8$hw>rGa=LZE%8J%>{<`q=QQW! zpd*wBQXPi)=P^W4YvFk25uBra6!gaRX12#RHOb1G2k5<>j=}Nnu7X+}z6Yws(<_vP z?≀M3spx|3E{dD$~DWSzN(R`GR~`Q8=yt$mZOoyU)A0>rB+Va3>$xGfG;Kr{kN8 zVZ`7U#mW7ju-WtuaE(rRfBU|1Ub4&)GR^UtMRta{&o?k zC~@Nf2jb%Sb;<$irH0aK?dbHls%&H{9XUWClwJFq!^76SRjZfruU9DuU1fD0W=&g? z12LR!=6b5qIABcUQXtA$dx_3%7n4kBd_Aa(818e##SDHoDF~rExHzg;A8t;_1q#F( z_5uIdefYt4z=0jwO~~!kViY`172893Qm6Acy@r#;Rmf5I?-2?`l|Rcvf%I_B`cKnd zAQ(^0(7G>R$!fiXm8?&XEBhJMtZ+L4o=F4MaNyy1*!j*~uu5?32~4wyN#nY)YMGX= z$Rn|N>yJW#+DRl4uP71p!|IU~!|E0MYIa##5`}ou+a@GKM_xcDB}NDL&)R z;A0(;+`DoS@Q+R~0*`TK} zlQh{we!qu^058eV&7C(uqmEtJxDms_FmpXvd zWD3>L4)B&?-r~9M?3P0lPyZnVC|nPkl!e^uYQ5qqXgp|0BGLm@ErH!4q=^L;Jk)F?Wi%+r6hWhP?qLc zi;SixW&_7-EbOwStH9$vsFOev)ha-88?T-0UOSvicdf5{(5Y4R*&G#Ll*9OjYfRi6 z`=W;?>9vu&>M1S3|#Woq+vQ(GGbx7ZXYX9A~K4S5F%@=0?N+){OxTIoJTl>cBm5&7Y7s@?rX3tm)HOcn7QZB$_ zs^?zVf`N>t0AiB}H$H-YilfK!$WQ+U!tfa!Oz0Gp{=s*FT36jZjP9&tcB0^^Kw)v8 zw>d;Rx76Ld**Cj;U;g3We8V|FaB}cs-9)xr^}c@IU~}!8%iat z3;OIy?hP5y^7ll7vVK1PQeMON=H-5nn51oB0U6A|`b!d%hz3~y(t5DEli+Vqr0RB6;@_`MHouF5)WnWa%nnavr>3ffA z{^Z5%7KObThWn6U?}0|%lgBKx0x&=Q$R}~iiO&fQM$D(qh3coVxM2{V7GCjtm& z7TKBawU>q-gL)VaxN&DmqogEf*&Op&=aVu&#}n8khhfe=21}>gqLfDl`p�$=?WF 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пx`o&Vo0`u|~6(AUUb_FxX&I4_J}p8QPu$iAHw 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 diff --git a/src/execution/__tests__/executor-test.ts b/src/execution/__tests__/executor-test.ts index 8782e4e57e..577f3a6b05 100644 --- a/src/execution/__tests__/executor-test.ts +++ b/src/execution/__tests__/executor-test.ts @@ -22,7 +22,7 @@ import { import { execute, executeSync } from '../execute'; import { modifiedOutputType } from '../../utilities/applyRequiredStatus'; -import { ComplexRequiredStatus } from '../../language/ast'; +import { ComplexRequiredStatus, RequiredStatus } from '../../language/ast'; describe('Execute: Handles basic execution tasks', () => { it('throws if no document is provided', () => { @@ -1320,7 +1320,7 @@ describe('Execute: Handles basic execution tasks', () => { ), }, mixedThreeDList: { - //[[[?]!]!]? + // [[[?]!]!]? type: new GraphQLList( new GraphQLNonNull( new GraphQLList( @@ -1387,7 +1387,7 @@ describe('Execute: Handles basic execution tasks', () => { document: singleNonNullOnNullValueDocument, }); - expectJSON(singleNonNullOnNullValueResult).to.deep.equal({ + expectJSON(singleNonNullOnNullValueResult).toDeepEqual({ data: { food: null }, errors: [ { @@ -1413,7 +1413,7 @@ describe('Execute: Handles basic execution tasks', () => { document: bothNonNullOnNullValueDocument, }); - expectJSON(bothNonNullOnNullValueResult).to.deep.equal({ + expectJSON(bothNonNullOnNullValueResult).toDeepEqual({ data: { food: null }, errors: [ { @@ -1456,7 +1456,7 @@ describe('Execute: Handles basic execution tasks', () => { document: nonNullAliasOnNullValueDocument, }); - expectJSON(nonNullAliasOnNullValueResult).to.deep.equal({ + expectJSON(nonNullAliasOnNullValueResult).toDeepEqual({ data: { food: null }, errors: [ { @@ -1483,7 +1483,7 @@ describe('Execute: Handles basic execution tasks', () => { document: nonNullInFragmentDocument, }); - expectJSON(nonNullInFragmentResult).to.deep.equal({ + expectJSON(nonNullInFragmentResult).toDeepEqual({ data: { food: null }, errors: [ { @@ -1514,7 +1514,7 @@ describe('Execute: Handles basic execution tasks', () => { document: aliasedNullAndNonNull, }); - expectJSON(aliasedNullAndNonNullResult).to.deep.equal({ + expectJSON(aliasedNullAndNonNullResult).toDeepEqual({ data: { nonNullable: null, nullable: { calories: 10, name: null } }, errors: [ { @@ -1539,7 +1539,7 @@ describe('Execute: Handles basic execution tasks', () => { document: listsQuery, }); - expectJSON(listsQueryResult).to.deep.equal({ + expectJSON(listsQueryResult).toDeepEqual({ data: { lists: null }, errors: [ { @@ -1565,7 +1565,7 @@ describe('Execute: Handles basic execution tasks', () => { document: listsQuery, }); - expectJSON(listsQueryResult).to.deep.equal({ + expectJSON(listsQueryResult).toDeepEqual({ data: { lists: { mixedThreeDList: null } }, errors: [ { @@ -1591,7 +1591,7 @@ describe('Execute: Handles basic execution tasks', () => { document: listsQuery, }); - expectJSON(listsQueryResult).to.deep.equal({ + expectJSON(listsQueryResult).toDeepEqual({ data: { lists: { mixedThreeDList: [null, null] } }, errors: [ { @@ -1611,25 +1611,25 @@ describe('Execute: Handles basic execution tasks', () => { }); it('modifiedOutputType produces correct output types', () => { - let type = new GraphQLList( + const type = new GraphQLList( new GraphQLNonNull( new GraphQLList(new GraphQLNonNull(new GraphQLList(GraphQLInt))), ), ); - let requiredStatus = new ComplexRequiredStatus( - 'unset', + const requiredStatus = new ComplexRequiredStatus( + RequiredStatus.UNSET, new ComplexRequiredStatus( - 'optional', + RequiredStatus.OPTIONAL, new ComplexRequiredStatus( - 'unset', - new ComplexRequiredStatus('required', undefined), + RequiredStatus.UNSET, + new ComplexRequiredStatus(RequiredStatus.REQUIRED, undefined), ), ), ); - let outputType = modifiedOutputType(type, requiredStatus); - let expectedOutputType = new GraphQLList( + const outputType = modifiedOutputType(type, requiredStatus); + const expectedOutputType = new GraphQLList( new GraphQLList( new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(GraphQLInt))), ), diff --git a/src/execution/execute.ts b/src/execution/execute.ts index e0efbad697..25f6850c9f 100644 --- a/src/execution/execute.ts +++ b/src/execution/execute.ts @@ -55,11 +55,11 @@ import { import { modifiedOutputType } from '../utilities/applyRequiredStatus'; import { getVariableValues, getArgumentValues } from './values'; + import { collectFields, collectSubfields as _collectSubfields, } from './collectFields'; -import { syntaxError } from '../error/syntaxError'; /** * A memoized collection of relevant subfields with regard to the return @@ -496,11 +496,18 @@ function executeField( try { returnType = modifiedOutputType(fieldDef.type, fieldNodes[0].required); } catch (error) { + const location = fieldNodes[0]?.loc; + let starts: ReadonlyArray | undefined = []; + + /* istanbul ignore next (branch where location is undefined is difficult to test) */ + if (location !== undefined) { + starts = [location.start]; + } throw new GraphQLError( 'Syntax Error: Something is wrong with the nullability designator. Is the correct list depth being used?', undefined, - fieldNodes[0].loc!.source, - [fieldNodes[0].loc!.start], + fieldNodes[0].loc?.source, + starts, pathToArray(path), ); } diff --git a/src/index.ts b/src/index.ts index 8c46c12fb1..b7aa4819c0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -236,8 +236,6 @@ export { export type { ParseOptions, SourceLocation, - TokenKindEnum, - KindEnum, DirectiveLocationEnum, /** Visitor utilities */ ASTVisitor, @@ -305,7 +303,6 @@ export type { UnionTypeExtensionNode, EnumTypeExtensionNode, InputObjectTypeExtensionNode, - RequiredStatus, } from './language/index'; /** Execute GraphQL queries. */ diff --git a/src/language/__tests__/parser-test.ts b/src/language/__tests__/parser-test.ts index 4a3037e861..4120ef216e 100644 --- a/src/language/__tests__/parser-test.ts +++ b/src/language/__tests__/parser-test.ts @@ -11,6 +11,7 @@ import { Kind } from '../kinds'; import { Source } from '../source'; import { TokenKind } from '../tokenKind'; import { parse, parseValue, parseConstValue, parseType } from '../parser'; +import { RequiredStatus } from '../ast'; function expectSyntaxError(text: string) { return expectToThrowJSON(() => parse(text)); @@ -343,13 +344,13 @@ describe('Parser', () => { }); it('parses field with required list elements', () => { - let result = parse(dedent` + const result = parse(dedent` { field[!] } `); - expectJSON(result).to.deep.equal({ + expectJSON(result).toDeepEqual({ kind: Kind.DOCUMENT, loc: { start: 0, end: 14 }, definitions: [ @@ -376,9 +377,9 @@ describe('Parser', () => { arguments: [], directives: [], required: { - status: 'unset', + status: RequiredStatus.UNSET, subStatus: { - status: 'required', + status: RequiredStatus.REQUIRED, subStatus: undefined, }, }, @@ -392,13 +393,13 @@ describe('Parser', () => { }); it('parses field with optional list elements', () => { - let result = parse(dedent` + const result = parse(dedent` { field[?] } `); - expectJSON(result).to.deep.equal({ + expectJSON(result).toDeepEqual({ kind: Kind.DOCUMENT, loc: { start: 0, end: 14 }, definitions: [ @@ -425,9 +426,9 @@ describe('Parser', () => { arguments: [], directives: [], required: { - status: 'unset', + status: RequiredStatus.UNSET, subStatus: { - status: 'optional', + status: RequiredStatus.OPTIONAL, subStatus: undefined, }, }, @@ -441,13 +442,13 @@ describe('Parser', () => { }); it('parses field with required list', () => { - let result = parse(dedent` + const result = parse(dedent` { field[]! } `); - expectJSON(result).to.deep.equal({ + expectJSON(result).toDeepEqual({ kind: Kind.DOCUMENT, loc: { start: 0, end: 14 }, definitions: [ @@ -474,9 +475,9 @@ describe('Parser', () => { arguments: [], directives: [], required: { - status: 'required', + status: RequiredStatus.REQUIRED, subStatus: { - status: 'unset', + status: RequiredStatus.UNSET, subStatus: undefined, }, }, @@ -490,14 +491,13 @@ describe('Parser', () => { }); it('parses field with optional list', () => { - console.log(); - let result = parse(dedent` + const result = parse(dedent` { field[]? } `); - expectJSON(result).to.deep.equal({ + expectJSON(result).toDeepEqual({ kind: Kind.DOCUMENT, loc: { start: 0, end: 14 }, definitions: [ @@ -524,9 +524,9 @@ describe('Parser', () => { arguments: [], directives: [], required: { - status: 'optional', + status: RequiredStatus.OPTIONAL, subStatus: { - status: 'unset', + status: RequiredStatus.UNSET, subStatus: undefined, }, }, @@ -540,13 +540,13 @@ describe('Parser', () => { }); it('parses multidimensional field with mixed list elements', () => { - let result = parse(dedent` + const result = parse(dedent` { field[[[?]!]]! } `); - expectJSON(result).to.deep.equal({ + expectJSON(result).toDeepEqual({ kind: Kind.DOCUMENT, loc: { start: 0, end: 20 }, definitions: [ @@ -573,13 +573,13 @@ describe('Parser', () => { arguments: [], directives: [], required: { - status: 'required', + status: RequiredStatus.REQUIRED, subStatus: { - status: 'unset', + status: RequiredStatus.UNSET, subStatus: { - status: 'required', + status: RequiredStatus.REQUIRED, subStatus: { - status: 'optional', + status: RequiredStatus.OPTIONAL, subStatus: undefined, }, }, @@ -644,7 +644,7 @@ describe('Parser', () => { } `), ).to.throw('Syntax Error: Invalid nullability designator'); - + expect(() => parse(` query { @@ -706,7 +706,7 @@ describe('Parser', () => { ], directives: [], required: { - status: 'unset', + status: RequiredStatus.UNSET, subStatus: undefined, }, selectionSet: { @@ -725,7 +725,7 @@ describe('Parser', () => { arguments: [], directives: [], required: { - status: 'unset', + status: RequiredStatus.UNSET, subStatus: undefined, }, selectionSet: undefined, @@ -742,7 +742,7 @@ describe('Parser', () => { arguments: [], directives: [], required: { - status: 'unset', + status: RequiredStatus.UNSET, subStatus: undefined, }, selectionSet: undefined, @@ -793,7 +793,7 @@ describe('Parser', () => { arguments: [], directives: [], required: { - status: 'unset', + status: RequiredStatus.UNSET, subStatus: undefined, }, selectionSet: { @@ -812,7 +812,7 @@ describe('Parser', () => { arguments: [], directives: [], required: { - status: 'unset', + status: RequiredStatus.UNSET, subStatus: undefined, }, selectionSet: undefined, diff --git a/src/language/__tests__/printer-test.ts b/src/language/__tests__/printer-test.ts index 8bd5283f2f..699392b70f 100644 --- a/src/language/__tests__/printer-test.ts +++ b/src/language/__tests__/printer-test.ts @@ -8,15 +8,14 @@ import { Kind } from '../kinds'; import { parse } from '../parser'; import { print } from '../printer'; +import { ComplexRequiredStatus, RequiredStatus } from '../ast'; + describe('Printer: Query document', () => { it('prints minimal ast', () => { const ast = { kind: Kind.FIELD, name: { kind: Kind.NAME, value: 'foo' }, - required: { - status: 'unset', - subStatus: undefined, - }, + required: new ComplexRequiredStatus(RequiredStatus.UNSET), } as const; expect(print(ast)).to.equal('foo'); }); diff --git a/src/language/ast.ts b/src/language/ast.ts index ad96e7dd84..4cf04c7652 100644 --- a/src/language/ast.ts +++ b/src/language/ast.ts @@ -1,6 +1,6 @@ import type { Kind } from './kinds'; -import { stat } from 'fs'; import type { Source } from './source'; + import type { TokenKind } from './tokenKind'; /** @@ -353,7 +353,11 @@ export interface SelectionSetNode { export type SelectionNode = FieldNode | FragmentSpreadNode | InlineFragmentNode; -export type RequiredStatus = 'required' | 'optional' | 'unset'; +export enum RequiredStatus { + REQUIRED = 'required', + OPTIONAL = 'optional', + UNSET = 'unset', +} export class ComplexRequiredStatus { readonly status: RequiredStatus; @@ -367,6 +371,10 @@ export class ComplexRequiredStatus { this.status = status; this.subStatus = subStatus; } + + get [Symbol.toStringTag]() { + return 'ComplexRequiredStatus'; + } } export interface FieldNode { diff --git a/src/language/index.ts b/src/language/index.ts index 44cd96e88a..8c87399e0e 100644 --- a/src/language/index.ts +++ b/src/language/index.ts @@ -6,10 +6,8 @@ export type { SourceLocation } from './location'; export { printLocation, printSourceLocation } from './printLocation'; export { Kind } from './kinds'; -export type { KindEnum } from './kinds'; export { TokenKind } from './tokenKind'; -export type { TokenKindEnum } from './tokenKind'; export { Lexer } from './lexer'; @@ -90,8 +88,6 @@ export type { UnionTypeExtensionNode, EnumTypeExtensionNode, InputObjectTypeExtensionNode, - RequiredStatus, - ComplexRequiredStatus, } from './ast'; export { diff --git a/src/language/parser.ts b/src/language/parser.ts index 1b5eac8ce5..168ca17f51 100644 --- a/src/language/parser.ts +++ b/src/language/parser.ts @@ -3,7 +3,6 @@ import type { Maybe } from '../jsutils/Maybe'; import type { GraphQLError } from '../error/GraphQLError'; import { syntaxError } from '../error/syntaxError'; -import type { TokenKindEnum } from './tokenKind'; import { TokenKind } from './tokenKind'; import type { @@ -62,10 +61,14 @@ import type { UnionTypeExtensionNode, EnumTypeExtensionNode, InputObjectTypeExtensionNode, - RequiredStatus, } from './ast'; -import { Location, OperationTypeNode, ComplexRequiredStatus } from './ast'; +import { + Location, + OperationTypeNode, + ComplexRequiredStatus, + RequiredStatus, +} from './ast'; import { Kind } from './kinds'; import { Source, isSource } from './source'; @@ -432,7 +435,7 @@ export class Parser { name = nameOrAlias; } - let required = this.parseRequiredStatus(); + const required = this.parseRequiredStatus(); return this.node(start, { kind: Kind.FIELD, @@ -451,34 +454,32 @@ export class Parser { * Nullability : * - ! * - ? - * + * * NOTES: * parseRequiredStatus assumes that if you have a designator like [[[!]!]!]! , the tokens can be - * grouped like ([[[) (!) (]!) (]!) (]!) . The center designator is on its own, and the rest are + * grouped like ([[[) (!) (]!) (]!) (]!) . The center designator is on its own, and the rest are * attached to a right bracket. This thinking simplifies parsing. - * + * * A designator on its own like with `field!` is found using the same subroutine that's used to * find the center designator mentioned above. */ parseRequiredStatus(): ComplexRequiredStatus { const stillDefiningNullabilityDesignator = (): boolean => { - let allowedTokens = [ + const allowedTokens = [ TokenKind.BRACKET_L, TokenKind.BRACKET_R, TokenKind.QUESTION_MARK, TokenKind.BANG, ]; - const reducer = (prv: boolean, current: TokenKindEnum): boolean => { - return prv || this.peek(current); - }; + const reducer = (prv: boolean, current: TokenKind): boolean => + prv || this.peek(current); return allowedTokens.reduce(reducer, false); }; - var listDepthCount = 0; + let listDepthCount = 0; - var lastRequiredStatus: RequiredStatus = 'unset'; - var outerComplexRequiredStatus: ComplexRequiredStatus | undefined = - undefined; + let lastRequiredStatus: RequiredStatus = RequiredStatus.UNSET; + let outerComplexRequiredStatus: ComplexRequiredStatus | undefined; // The spec expects !, ?, or [ until there's a ] while (stillDefiningNullabilityDesignator()) { @@ -511,7 +512,8 @@ export class Parser { outerComplexRequiredStatus = new ComplexRequiredStatus( lastRequiredStatus, // handles unset elements on the innermost list - outerComplexRequiredStatus ?? new ComplexRequiredStatus('unset'), + outerComplexRequiredStatus ?? + new ComplexRequiredStatus(RequiredStatus.UNSET), ); } else { throw syntaxError( @@ -524,7 +526,7 @@ export class Parser { // There are no more characters that could make up a nullability designator // Indicates unbalanced braces eg [[] or []] - if (listDepthCount != 0) { + if (listDepthCount !== 0) { throw syntaxError( this._lexer.source, this._lexer.token.start, @@ -537,21 +539,21 @@ export class Parser { new ComplexRequiredStatus(lastRequiredStatus) ); } - + /** * Nullability : * - ! * - ? - * + * */ parseSimpleRequiredStatus(): RequiredStatus { let required: RequiredStatus; if (this.expectOptionalToken(TokenKind.BANG)) { - required = 'required'; + required = RequiredStatus.REQUIRED; } else if (this.expectOptionalToken(TokenKind.QUESTION_MARK)) { - required = 'optional'; + required = RequiredStatus.OPTIONAL; } else { - required = 'unset'; + required = RequiredStatus.UNSET; } return required; } diff --git a/src/language/printer.ts b/src/language/printer.ts index e13abe2eb4..b89de0b6ae 100644 --- a/src/language/printer.ts +++ b/src/language/printer.ts @@ -1,11 +1,11 @@ import type { Maybe } from '../jsutils/Maybe'; -import type { ASTNode } from './ast'; +import type { ASTNode, ComplexRequiredStatus } from './ast'; +import { RequiredStatus } from './ast'; import type { ASTReducer } from './visitor'; import { visit } from './visitor'; import { printBlockString } from './blockString'; import { printString } from './printString'; -import { ComplexRequiredStatus } from './ast'; /** * Converts an AST into a string, using one set of reasonable @@ -64,33 +64,36 @@ const printDocASTReducer: ASTReducer = { selectionSet, required, }) { - let buildRequiredDesignator = ( - required: ComplexRequiredStatus, + const buildRequiredDesignator = ( + requiredStatus: ComplexRequiredStatus, accumulator: string = '', depth: number = 0, ): string => { - if (required.subStatus) { - accumulator = buildRequiredDesignator( - required.subStatus, - accumulator + '[', + let tempAccumulator = accumulator; + if (requiredStatus.subStatus) { + tempAccumulator = buildRequiredDesignator( + requiredStatus.subStatus, + tempAccumulator + '[', depth + 1, ); } - if (required.status === 'required') { - accumulator += '!'; - } else if (required.status === 'optional') { - accumulator += '?'; + if (requiredStatus.status === RequiredStatus.REQUIRED) { + tempAccumulator += '!'; + } else if (requiredStatus.status === RequiredStatus.OPTIONAL) { + tempAccumulator += '?'; } if (depth > 0) { - accumulator += ']'; + tempAccumulator += ']'; } - return accumulator; + return tempAccumulator; }; - let prefix = wrap('', alias, ': ') + name; - let requiredDesignator = buildRequiredDesignator(required); + const prefix = wrap('', alias, ': ') + name; + const requiredDesignator = buildRequiredDesignator( + required as unknown as ComplexRequiredStatus, + ); let argsLine = prefix + requiredDesignator + wrap('(', join(args, ', '), ')'); diff --git a/src/utilities/__tests__/TypeInfo-test.ts b/src/utilities/__tests__/TypeInfo-test.ts index 8a557fc664..f04dc28f69 100644 --- a/src/utilities/__tests__/TypeInfo-test.ts +++ b/src/utilities/__tests__/TypeInfo-test.ts @@ -12,7 +12,7 @@ import { getNamedType, isCompositeType } from '../../type/definition'; import { buildSchema } from '../buildASTSchema'; import { TypeInfo, visitWithTypeInfo } from '../TypeInfo'; -import { ComplexRequiredStatus } from '../../language/ast'; +import { ComplexRequiredStatus, RequiredStatus } from '../../language/ast'; const testSchema = buildSchema(` interface Pet { @@ -269,7 +269,7 @@ describe('visitWithTypeInfo', () => { { kind: 'Field', name: { kind: 'Name', value: '__typename' }, - required: new ComplexRequiredStatus('unset'), + required: new ComplexRequiredStatus(RequiredStatus.UNSET), }, ], }, diff --git a/src/utilities/applyRequiredStatus.ts b/src/utilities/applyRequiredStatus.ts index f61bb77231..9974a74b86 100644 --- a/src/utilities/applyRequiredStatus.ts +++ b/src/utilities/applyRequiredStatus.ts @@ -1,4 +1,3 @@ -import type { RequiredStatus } from '../language/ast'; import type { GraphQLOutputType } from '../type/definition'; import { getNullableType, @@ -7,7 +6,8 @@ import { assertListType, GraphQLList, } from '../type/definition'; -import { ComplexRequiredStatus } from '../language/ast'; +import type { ComplexRequiredStatus } from '../language/ast'; +import { RequiredStatus } from '../language/ast'; /** * Implements the "Accounting For Client Controlled Nullability Designators" @@ -19,9 +19,9 @@ function simpleModifiedOutputType( type: GraphQLOutputType, required: RequiredStatus, ): GraphQLOutputType { - if (required === 'required' && !isNonNullType(type)) { + if (required === RequiredStatus.REQUIRED && !isNonNullType(type)) { return new GraphQLNonNull(type); - } else if (required === 'optional') { + } else if (required === RequiredStatus.OPTIONAL) { return getNullableType(type); } return type; @@ -36,10 +36,10 @@ export function modifiedOutputType( } // If execution reaches this point, type is a list. - let listType = assertListType(getNullableType(type)); - let elementType = listType.ofType as GraphQLOutputType; - let prev = modifiedOutputType(elementType, required.subStatus); - var constructedType = new GraphQLList(prev); + const listType = assertListType(getNullableType(type)); + const elementType = listType.ofType as GraphQLOutputType; + const prev = modifiedOutputType(elementType, required.subStatus); + let constructedType = new GraphQLList(prev); if (isNonNullType(type)) { constructedType = new GraphQLNonNull(constructedType); diff --git a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts index 88112f9c66..7253633078 100644 --- a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts +++ b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts @@ -173,7 +173,7 @@ describe('Validate: Overlapping fields can be merged', () => { doesKnowCommand doesKnowCommand! } - `).to.deep.equal([ + `).toDeepEqual([ { message: 'Fields "doesKnowCommand" conflict because they return conflicting types "Boolean" and "Boolean!". Use different aliases on the fields to fetch both if this was intentional.', @@ -265,7 +265,7 @@ describe('Validate: Overlapping fields can be merged', () => { name } } - `).to.deep.equal([ + `).toDeepEqual([ { message: 'Fields "name" conflict because they return conflicting types "String!" and "String". Use different aliases on the fields to fetch both if this was intentional.', @@ -287,7 +287,7 @@ describe('Validate: Overlapping fields can be merged', () => { name? } } - `).to.deep.equal([ + `).toDeepEqual([ { message: 'Fields "name" conflict because they return conflicting types "String!" and "String". Use different aliases on the fields to fetch both if this was intentional.', @@ -813,7 +813,7 @@ describe('Validate: Overlapping fields can be merged', () => { } } `, - ).to.deep.equal([ + ).toDeepEqual([ { message: 'Fields "unrelatedField" conflict because they return conflicting types "String" and "String!". Use different aliases on the fields to fetch both if this was intentional.', @@ -840,7 +840,7 @@ describe('Validate: Overlapping fields can be merged', () => { } } `, - ).to.deep.equal([ + ).toDeepEqual([ { message: 'Fields "unrelatedField" conflict because they return conflicting types "String" and "String!". Use different aliases on the fields to fetch both if this was intentional.', @@ -1049,7 +1049,7 @@ describe('Validate: Overlapping fields can be merged', () => { } } `, - ).to.deep.equal([ + ).toDeepEqual([ { message: 'Fields "scalar" conflict because they return conflicting types "String" and "String!". Use different aliases on the fields to fetch both if this was intentional.', @@ -1076,7 +1076,7 @@ describe('Validate: Overlapping fields can be merged', () => { } } `, - ).to.deep.equal([ + ).toDeepEqual([ { message: 'Fields "scalar" conflict because they return conflicting types "String" and "String!". Use different aliases on the fields to fetch both if this was intentional.', @@ -1213,7 +1213,7 @@ describe('Validate: Overlapping fields can be merged', () => { } } `, - ).to.deep.equal([ + ).toDeepEqual([ { message: 'Fields "scalar" conflict because they return conflicting types "Int!" and "String". Use different aliases on the fields to fetch both if this was intentional.', @@ -1240,7 +1240,7 @@ describe('Validate: Overlapping fields can be merged', () => { } } `, - ).to.deep.equal([ + ).toDeepEqual([ { message: 'Fields "scalar" conflict because they return conflicting types "Int" and "String". Use different aliases on the fields to fetch both if this was intentional.', @@ -1267,7 +1267,7 @@ describe('Validate: Overlapping fields can be merged', () => { } } `, - ).to.deep.equal([ + ).toDeepEqual([ { message: 'Fields "scalar" conflict because they return conflicting types "Int!" and "String!". Use different aliases on the fields to fetch both if this was intentional.', @@ -1294,7 +1294,7 @@ describe('Validate: Overlapping fields can be merged', () => { } } `, - ).to.deep.equal([ + ).toDeepEqual([ { message: 'Fields "scalar" conflict because they return conflicting types "Int" and "String!". Use different aliases on the fields to fetch both if this was intentional.', @@ -1321,7 +1321,7 @@ describe('Validate: Overlapping fields can be merged', () => { } } `, - ).to.deep.equal([ + ).toDeepEqual([ { message: 'Fields "scalar" conflict because they return conflicting types "Int" and "String". Use different aliases on the fields to fetch both if this was intentional.', @@ -1348,7 +1348,7 @@ describe('Validate: Overlapping fields can be merged', () => { } } `, - ).to.deep.equal([ + ).toDeepEqual([ { message: 'Fields "scalar" conflict because they return conflicting types "Int" and "String". Use different aliases on the fields to fetch both if this was intentional.', @@ -1387,7 +1387,7 @@ describe('Validate: Overlapping fields can be merged', () => { } } `, - ).to.deep.equal([ + ).toDeepEqual([ { message: 'Fields "list" conflict because they return conflicting types "[Int!]!" and "[Int]". Use different aliases on the fields to fetch both if this was intentional.', @@ -1462,7 +1462,7 @@ describe('Validate: Overlapping fields can be merged', () => { } } `, - ).to.deep.equal([ + ).toDeepEqual([ { message: 'Fields "deepBox" conflict because subfields "unrelatedField" conflict because they return conflicting types "String" and "String!". Use different aliases on the fields to fetch both if this was intentional.', @@ -1624,7 +1624,7 @@ describe('Validate: Overlapping fields can be merged', () => { } } `, - ).to.deep.equal([ + ).toDeepEqual([ { locations: [ { diff --git a/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts b/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts index 3db47326fc..66fbb1fa81 100644 --- a/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts +++ b/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts @@ -2,9 +2,10 @@ import { describe, it } from 'mocha'; import { buildSchema } from '../../utilities/buildASTSchema'; -import { expectValidationErrorsWithSchema } from './harness'; import { RequiredStatusOnFieldMatchesDefinitionRule } from '../rules/RequiredStatusOnFieldMatchesDefinitionRule'; +import { expectValidationErrorsWithSchema } from './harness'; + function expectErrors(queryStr: string) { return expectValidationErrorsWithSchema( testSchema, @@ -14,7 +15,7 @@ function expectErrors(queryStr: string) { } function expectValid(queryStr: string) { - expectErrors(queryStr).to.deep.equal([]); + expectErrors(queryStr).toDeepEqual([]); } const testSchema = buildSchema(` @@ -47,7 +48,7 @@ describe('Validate: Field uses correct list depth', () => { notAList: nonList[!] mixedThreeDList[[!]!]! } - `).to.deep.equal([ + `).toDeepEqual([ { message: 'Syntax Error: Something is wrong with the nullability designator on list. The type for that field in the schema is [Int] Is the correct list depth being used?', diff --git a/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts b/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts index 9d856c1a6e..32e8e06ef1 100644 --- a/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts +++ b/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts @@ -597,8 +597,8 @@ function findConflict( // so there's no need to do anything here in the event that modifiedOutputType throws // an error. try { - var modifiedType1 = modifiedOutputType(type1, node1.required); - var modifiedType2 = modifiedOutputType(type2, node2.required); + const modifiedType1 = modifiedOutputType(type1, node1.required); + const modifiedType2 = modifiedOutputType(type2, node2.required); if (doTypesConflict(modifiedType1, modifiedType2)) { return [ @@ -612,7 +612,9 @@ function findConflict( [node2], ]; } - } catch {} + } catch { + /* Do nothing. See above comment. */ + } } // Collect and compare sub-fields. Use the same "visited fragment names" list From 8bb35bd1e1f2d094c19c4ecfe5b28dd5773e2781 Mon Sep 17 00:00:00 2001 From: twof Date: Mon, 22 Nov 2021 11:45:32 -0800 Subject: [PATCH 43/64] bring back kind and tokenkind enums --- src/execution/execute.ts | 6 +++--- src/index.ts | 2 ++ src/language/index.ts | 2 ++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/execution/execute.ts b/src/execution/execute.ts index 25f6850c9f..179c0bf9d9 100644 --- a/src/execution/execute.ts +++ b/src/execution/execute.ts @@ -432,7 +432,7 @@ function executeFieldsSerially( } /** - * Implements the "Executing Selection Sets" section of the spec + * Implements the "Executing selection sets" section of the spec * for fields that may be executed in parallel. */ function executeFields( @@ -475,7 +475,7 @@ function executeFields( } /** - * Implements the "Executing Fields" section of the spec + * Implements the "Executing fields" section of the spec * In particular, this function figures out the value that the field returns by * calling its resolve function, then calls completeValue to complete promises, * serialize scalars, or execute the sub-selection-set for objects. @@ -616,7 +616,7 @@ function handleFieldError( /** * Implements the instructions for completeValue as defined in the - * "Value Completion" section of the spec. + * "Value completion" section of the spec. * * If the field type is Non-Null, then this recursively completes the value * for the inner type. It throws a field error if that completion returns null, diff --git a/src/index.ts b/src/index.ts index b7aa4819c0..c3125ec4ea 100644 --- a/src/index.ts +++ b/src/index.ts @@ -236,6 +236,8 @@ export { export type { ParseOptions, SourceLocation, + TokenKindEnum, + KindEnum, DirectiveLocationEnum, /** Visitor utilities */ ASTVisitor, diff --git a/src/language/index.ts b/src/language/index.ts index 8c87399e0e..fc0583ec6f 100644 --- a/src/language/index.ts +++ b/src/language/index.ts @@ -6,8 +6,10 @@ export type { SourceLocation } from './location'; export { printLocation, printSourceLocation } from './printLocation'; export { Kind } from './kinds'; +export type { KindEnum } from './kinds'; export { TokenKind } from './tokenKind'; +export type { TokenKindEnum } from './tokenKind'; export { Lexer } from './lexer'; From 12105c92f7024b5d339a63c91646697420beb3c3 Mon Sep 17 00:00:00 2001 From: twof Date: Mon, 22 Nov 2021 11:51:11 -0800 Subject: [PATCH 44/64] lexer updated to hand ? --- src/language/__tests__/lexer-test.ts | 8 ++++++++ src/language/lexer.ts | 1 + 2 files changed, 9 insertions(+) diff --git a/src/language/__tests__/lexer-test.ts b/src/language/__tests__/lexer-test.ts index e7b247fd2a..89ef5a09cc 100644 --- a/src/language/__tests__/lexer-test.ts +++ b/src/language/__tests__/lexer-test.ts @@ -936,6 +936,13 @@ describe('Lexer', () => { value: undefined, }); + expect(lexOne('?')).to.contain({ + kind: TokenKind.QUESTION_MARK, + start: 0, + end: 1, + value: undefined, + }); + expect(lexOne('$')).to.contain({ kind: TokenKind.DOLLAR, start: 0, @@ -1181,6 +1188,7 @@ describe('isPunctuatorTokenKind', () => { it('returns true for punctuator tokens', () => { expect(isPunctuatorToken('!')).to.equal(true); + expect(isPunctuatorToken('?')).to.equal(true); expect(isPunctuatorToken('$')).to.equal(true); expect(isPunctuatorToken('&')).to.equal(true); expect(isPunctuatorToken('(')).to.equal(true); diff --git a/src/language/lexer.ts b/src/language/lexer.ts index 2fac1754cb..b87a8a83c0 100644 --- a/src/language/lexer.ts +++ b/src/language/lexer.ts @@ -91,6 +91,7 @@ export class Lexer { export function isPunctuatorTokenKind(kind: TokenKind): boolean { return ( kind === TokenKind.BANG || + kind === TokenKind.QUESTION_MARK || kind === TokenKind.DOLLAR || kind === TokenKind.AMP || kind === TokenKind.PAREN_L || From 3d0534ecd46dfbf336021886a2db3486b511d785 Mon Sep 17 00:00:00 2001 From: twof Date: Mon, 22 Nov 2021 11:55:50 -0800 Subject: [PATCH 45/64] ds store removed --- src/validation/.DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/validation/.DS_Store diff --git a/src/validation/.DS_Store b/src/validation/.DS_Store deleted file mode 100644 index 33c1e9e1ddb2f4a2ca1d8b38f1a668986b4a6edb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}T>S5Z-O8O(;SR3OxqA7Ob`uikA@U3mDOZN=!)5V9ZLBnnNk%tS{t~_&m<+ zZVIIpJc-yDnEhtwC(C{t_J=XX-C1G1{Rm&uBrp2?Pu^&@c6QrF+vpf~-lHhJA}D6L z8%%GocPT^~)^-qHC2{Fn`)496f+UNlvLK0KNV&aEvPhJ!m}OBeYdsY(OvCi8?tDHR zjC%HPJY4kb`S_#{_F%MFn8v~3(dmW%ls;$TP0`8W&y%vJv4(drHq7kRn`WuV9w1s* z))j=r05L!eYzqT=|1&zV`(pep71iNRGl_-&o%Xsi^fa>nJz@Etue*Dn+E=$0WM=|8$QQQTU Z0)86}Ku2Sx5Ii7s5s)-cLk#>X17GrMO-%p* From 22029e6f088c5c9b55b0c5469741bc1bb0414554 Mon Sep 17 00:00:00 2001 From: twof Date: Wed, 24 Nov 2021 12:14:58 -0800 Subject: [PATCH 46/64] parser tests passing --- src/language/__tests__/parser-test.ts | 134 +++++++++++++++----------- src/language/ast.ts | 67 ++++++++----- src/language/kinds.ts | 3 + src/language/parser.ts | 119 +++++++---------------- 4 files changed, 159 insertions(+), 164 deletions(-) diff --git a/src/language/__tests__/parser-test.ts b/src/language/__tests__/parser-test.ts index 4120ef216e..f292c529c3 100644 --- a/src/language/__tests__/parser-test.ts +++ b/src/language/__tests__/parser-test.ts @@ -252,7 +252,7 @@ describe('Parser', () => { optionalField?! } `), - ).to.throw('Syntax Error: Invalid nullability designator'); + ).to.throw('Syntax Error: Expected Name, found \"!\".'); expect(() => parse(` @@ -260,7 +260,7 @@ describe('Parser', () => { optionalField!? } `), - ).to.throw('Syntax Error: Invalid nullability designator'); + ).to.throw('Syntax Error: Expected Name, found \"?\".'); }); it('parses required with alias', () => { @@ -377,11 +377,18 @@ describe('Parser', () => { arguments: [], directives: [], required: { - status: RequiredStatus.UNSET, - subStatus: { - status: RequiredStatus.REQUIRED, - subStatus: undefined, - }, + kind: Kind.NULLABILITY, + elementStatus: undefined, + loc: { start: 9, end: 12 }, + child: { + kind: Kind.NULLABILITY, + child: undefined, + loc: { start: 10, end: 11 }, + elementStatus: { + kind: Kind.REQUIRED_DESIGNATOR, + loc: { start: 11, end: 11 } + } + } }, selectionSet: undefined, }, @@ -426,11 +433,18 @@ describe('Parser', () => { arguments: [], directives: [], required: { - status: RequiredStatus.UNSET, - subStatus: { - status: RequiredStatus.OPTIONAL, - subStatus: undefined, - }, + kind: Kind.NULLABILITY, + elementStatus: undefined, + loc: { start: 9, end: 12 }, + child: { + kind: Kind.NULLABILITY, + child: undefined, + loc: { start: 10, end: 11 }, + elementStatus: { + kind: Kind.OPTIONAL_DESIGNATOR, + loc: { start: 11, end: 11 } + } + } }, selectionSet: undefined, }, @@ -474,15 +488,17 @@ describe('Parser', () => { }, arguments: [], directives: [], + selectionSet: undefined, required: { - status: RequiredStatus.REQUIRED, - subStatus: { - status: RequiredStatus.UNSET, - subStatus: undefined, + kind: Kind.NULLABILITY, + elementStatus: { + kind: Kind.REQUIRED_DESIGNATOR, + loc: { start: 13, end: 12 } }, + loc: { start: 9, end: 12 }, + child: undefined }, - selectionSet: undefined, - }, + } ], }, }, @@ -524,11 +540,13 @@ describe('Parser', () => { arguments: [], directives: [], required: { - status: RequiredStatus.OPTIONAL, - subStatus: { - status: RequiredStatus.UNSET, - subStatus: undefined, + kind: Kind.NULLABILITY, + elementStatus: { + kind: Kind.OPTIONAL_DESIGNATOR, + loc: { start: 13, end: 12 } }, + loc: { start: 9, end: 12 }, + child: undefined }, selectionSet: undefined, }, @@ -573,14 +591,31 @@ describe('Parser', () => { arguments: [], directives: [], required: { - status: RequiredStatus.REQUIRED, - subStatus: { - status: RequiredStatus.UNSET, - subStatus: { - status: RequiredStatus.REQUIRED, - subStatus: { - status: RequiredStatus.OPTIONAL, - subStatus: undefined, + kind: Kind.NULLABILITY, + elementStatus: { + kind: Kind.REQUIRED_DESIGNATOR, + loc: { start: 19, end: 18 } + }, + loc: { start: 9, end: 18 }, + child: { + kind: Kind.NULLABILITY, + elementStatus: undefined, + loc: { start: 10, end: 16 }, + child: { + kind: Kind.NULLABILITY, + elementStatus: { + kind: Kind.REQUIRED_DESIGNATOR, + loc: { start: 15, end: 15 } + }, + loc: { start: 11, end: 15 }, + child: { + kind: Kind.NULLABILITY, + elementStatus: { + kind: Kind.OPTIONAL_DESIGNATOR, + loc: { start: 13, end: 13 } + }, + loc: { start: 12, end: 13 }, + child: undefined }, }, }, @@ -601,7 +636,7 @@ describe('Parser', () => { field[[] } `), - ).to.throw('Syntax Error: Unbalanced braces in nullability designator'); + ).to.throw('Syntax Error: Expected \"]\", found \"}\".'); expect(() => parse(` @@ -609,7 +644,7 @@ describe('Parser', () => { field[]] } `), - ).to.throw('Syntax Error: Unbalanced braces in nullability designator'); + ).to.throw('Syntax Error: Expected Name, found \"]\".'); expect(() => parse(` @@ -617,7 +652,7 @@ describe('Parser', () => { field] } `), - ).to.throw('Syntax Error: Unbalanced braces in nullability designator'); + ).to.throw('Syntax Error: Expected Name, found \"]\".'); expect(() => parse(` @@ -625,7 +660,7 @@ describe('Parser', () => { field[ } `), - ).to.throw('Syntax Error: Unbalanced braces in nullability designator'); + ).to.throw('Syntax Error: Expected \"]\", found \"}\".'); }); it('does not parse field with assorted invalid nullability designators', () => { @@ -635,7 +670,7 @@ describe('Parser', () => { field[][] } `), - ).to.throw('Syntax Error: Invalid nullability designator'); + ).to.throw('Syntax Error: Expected Name, found \"[\".'); expect(() => parse(` @@ -643,7 +678,7 @@ describe('Parser', () => { field[!!] } `), - ).to.throw('Syntax Error: Invalid nullability designator'); + ).to.throw('Syntax Error: Expected \"]\", found \"!\".'); expect(() => parse(` @@ -651,7 +686,7 @@ describe('Parser', () => { field[]?! } `), - ).to.throw('Syntax Error: Invalid nullability designator'); + ).to.throw('Syntax Error: Expected Name, found \"!\".'); }); it('creates ast', () => { @@ -705,10 +740,7 @@ describe('Parser', () => { }, ], directives: [], - required: { - status: RequiredStatus.UNSET, - subStatus: undefined, - }, + required: undefined, selectionSet: { kind: Kind.SELECTION_SET, loc: { start: 16, end: 38 }, @@ -724,10 +756,7 @@ describe('Parser', () => { }, arguments: [], directives: [], - required: { - status: RequiredStatus.UNSET, - subStatus: undefined, - }, + required: undefined, selectionSet: undefined, }, { @@ -741,10 +770,7 @@ describe('Parser', () => { }, arguments: [], directives: [], - required: { - status: RequiredStatus.UNSET, - subStatus: undefined, - }, + required: undefined, selectionSet: undefined, }, ], @@ -792,10 +818,7 @@ describe('Parser', () => { }, arguments: [], directives: [], - required: { - status: RequiredStatus.UNSET, - subStatus: undefined, - }, + required: undefined, selectionSet: { kind: Kind.SELECTION_SET, loc: { start: 15, end: 27 }, @@ -811,10 +834,7 @@ describe('Parser', () => { }, arguments: [], directives: [], - required: { - status: RequiredStatus.UNSET, - subStatus: undefined, - }, + required: undefined, selectionSet: undefined, }, ], diff --git a/src/language/ast.ts b/src/language/ast.ts index 4cf04c7652..ae52b4dfad 100644 --- a/src/language/ast.ts +++ b/src/language/ast.ts @@ -353,29 +353,29 @@ export interface SelectionSetNode { export type SelectionNode = FieldNode | FragmentSpreadNode | InlineFragmentNode; -export enum RequiredStatus { - REQUIRED = 'required', - OPTIONAL = 'optional', - UNSET = 'unset', -} - -export class ComplexRequiredStatus { - readonly status: RequiredStatus; - // Exists if status is on a List. - // This setup doesn't leave room for container types - // that have multiple fields like a Dictionary - // so it will need to be fixed when that comes up. - readonly subStatus?: ComplexRequiredStatus; - - constructor(status: RequiredStatus, subStatus?: ComplexRequiredStatus) { - this.status = status; - this.subStatus = subStatus; - } - - get [Symbol.toStringTag]() { - return 'ComplexRequiredStatus'; - } -} +// export enum RequiredStatus { +// REQUIRED = 'required', +// OPTIONAL = 'optional', +// UNSET = 'unset', +// } + +// export class ComplexRequiredStatus { +// readonly status: RequiredStatus; +// // Exists if status is on a List. +// // This setup doesn't leave room for container types +// // that have multiple fields like a Dictionary +// // so it will need to be fixed when that comes up. +// readonly subStatus?: ComplexRequiredStatus; + +// constructor(status: RequiredStatus, subStatus?: ComplexRequiredStatus) { +// this.status = status; +// this.subStatus = subStatus; +// } + +// get [Symbol.toStringTag]() { +// return 'ComplexRequiredStatus'; +// } +// } export interface FieldNode { readonly kind: Kind.FIELD; @@ -385,7 +385,26 @@ export interface FieldNode { readonly arguments?: ReadonlyArray; readonly directives?: ReadonlyArray; readonly selectionSet?: SelectionSetNode; - readonly required: ComplexRequiredStatus; + readonly required?: SupportArrayNode | NullabilityModifierNode; +} + +export interface RequiredModifierNode { + readonly kind: Kind.REQUIRED_DESIGNATOR; + readonly loc?: Location; +} + +export interface OptionalModifierNode { + readonly kind: Kind.OPTIONAL_DESIGNATOR; + readonly loc?: Location; +} + +export type NullabilityModifierNode = RequiredModifierNode | OptionalModifierNode; + +export interface SupportArrayNode { + readonly kind: Kind.NULLABILITY; + readonly loc?: Location; + readonly elementStatus?: NullabilityModifierNode; + readonly child?: SupportArrayNode } export interface ArgumentNode { diff --git a/src/language/kinds.ts b/src/language/kinds.ts index 39b2a8e675..b18f9b69d6 100644 --- a/src/language/kinds.ts +++ b/src/language/kinds.ts @@ -12,6 +12,9 @@ export enum Kind { SELECTION_SET = 'SelectionSet', FIELD = 'Field', ARGUMENT = 'Argument', + NULLABILITY = 'Nullability', + REQUIRED_DESIGNATOR = 'RequiredDesignator', + OPTIONAL_DESIGNATOR = 'OptionalDesignator', /** Fragments */ FRAGMENT_SPREAD = 'FragmentSpread', diff --git a/src/language/parser.ts b/src/language/parser.ts index 168ca17f51..0d1ce4f710 100644 --- a/src/language/parser.ts +++ b/src/language/parser.ts @@ -61,6 +61,10 @@ import type { UnionTypeExtensionNode, EnumTypeExtensionNode, InputObjectTypeExtensionNode, + SupportArrayNode, + NullabilityModifierNode, + OptionalModifierNode, + RequiredModifierNode, } from './ast'; import { @@ -435,8 +439,6 @@ export class Parser { name = nameOrAlias; } - const required = this.parseRequiredStatus(); - return this.node(start, { kind: Kind.FIELD, alias, @@ -446,7 +448,7 @@ export class Parser { selectionSet: this.peek(TokenKind.BRACE_L) ? this.parseSelectionSet() : undefined, - required, + required: this.parseRequiredStatus(), }); } @@ -463,81 +465,24 @@ export class Parser { * A designator on its own like with `field!` is found using the same subroutine that's used to * find the center designator mentioned above. */ - parseRequiredStatus(): ComplexRequiredStatus { - const stillDefiningNullabilityDesignator = (): boolean => { - const allowedTokens = [ - TokenKind.BRACKET_L, - TokenKind.BRACKET_R, - TokenKind.QUESTION_MARK, - TokenKind.BANG, - ]; - const reducer = (prv: boolean, current: TokenKind): boolean => - prv || this.peek(current); - return allowedTokens.reduce(reducer, false); - }; - - let listDepthCount = 0; - - let lastRequiredStatus: RequiredStatus = RequiredStatus.UNSET; - let outerComplexRequiredStatus: ComplexRequiredStatus | undefined; - - // The spec expects !, ?, or [ until there's a ] - while (stillDefiningNullabilityDesignator()) { - if (this.expectOptionalToken(TokenKind.BRACKET_L)) { - listDepthCount += 1; - } else if (this.peek(TokenKind.BRACKET_R)) { - break; - } else { - // throws on multiple designators in a row eg ?!! - if (outerComplexRequiredStatus) { - throw syntaxError( - this._lexer.source, - this._lexer.token.start, - 'Invalid nullability designator', - ); - } - lastRequiredStatus = this.parseSimpleRequiredStatus(); - outerComplexRequiredStatus = new ComplexRequiredStatus( - lastRequiredStatus, - outerComplexRequiredStatus, - ); - } - } - - // Once there's been a ], no more [ are allowed - while (stillDefiningNullabilityDesignator()) { - if (this.expectOptionalToken(TokenKind.BRACKET_R)) { - listDepthCount -= 1; - lastRequiredStatus = this.parseSimpleRequiredStatus(); - outerComplexRequiredStatus = new ComplexRequiredStatus( - lastRequiredStatus, - // handles unset elements on the innermost list - outerComplexRequiredStatus ?? - new ComplexRequiredStatus(RequiredStatus.UNSET), - ); - } else { - throw syntaxError( - this._lexer.source, - this._lexer.token.start, - 'Invalid nullability designator', - ); - } + parseRequiredStatus(): SupportArrayNode | undefined { + let start = this._lexer.token; + let child: SupportArrayNode | undefined; + + if (this.expectOptionalToken(TokenKind.BRACKET_L)) { + child = this.parseRequiredStatus(); + this.expectToken(TokenKind.BRACKET_R); } - // There are no more characters that could make up a nullability designator - // Indicates unbalanced braces eg [[] or []] - if (listDepthCount !== 0) { - throw syntaxError( - this._lexer.source, - this._lexer.token.start, - 'Unbalanced braces in nullability designator', - ); + let nullabilityStatus = this.parseNullabilityModifierNode(); + + if (nullabilityStatus || child) { + return this.node(start, { + kind: Kind.NULLABILITY, + elementStatus: nullabilityStatus, + child: child + }); } - - return ( - outerComplexRequiredStatus ?? - new ComplexRequiredStatus(lastRequiredStatus) - ); } /** @@ -546,16 +491,24 @@ export class Parser { * - ? * */ - parseSimpleRequiredStatus(): RequiredStatus { - let required: RequiredStatus; + parseNullabilityModifierNode(): NullabilityModifierNode | undefined { + return this.parseRequiredModifierNode() ?? this.parseOptionalModifierNode() + } + + parseRequiredModifierNode(): RequiredModifierNode | undefined { if (this.expectOptionalToken(TokenKind.BANG)) { - required = RequiredStatus.REQUIRED; - } else if (this.expectOptionalToken(TokenKind.QUESTION_MARK)) { - required = RequiredStatus.OPTIONAL; - } else { - required = RequiredStatus.UNSET; + return this.node(this._lexer.token, { + kind: Kind.REQUIRED_DESIGNATOR + }); + } + } + + parseOptionalModifierNode(): OptionalModifierNode | undefined { + if (this.expectOptionalToken(TokenKind.QUESTION_MARK)) { + return this.node(this._lexer.token, { + kind: Kind.OPTIONAL_DESIGNATOR + }); } - return required; } /** From 0ba98d436dbcbe22a54818d288bc797516625206 Mon Sep 17 00:00:00 2001 From: twof Date: Wed, 24 Nov 2021 12:16:10 -0800 Subject: [PATCH 47/64] additional cleanup --- src/language/ast.ts | 26 +------------------------- src/language/parser.ts | 7 ------- 2 files changed, 1 insertion(+), 32 deletions(-) diff --git a/src/language/ast.ts b/src/language/ast.ts index ae52b4dfad..9165cc4955 100644 --- a/src/language/ast.ts +++ b/src/language/ast.ts @@ -353,30 +353,6 @@ export interface SelectionSetNode { export type SelectionNode = FieldNode | FragmentSpreadNode | InlineFragmentNode; -// export enum RequiredStatus { -// REQUIRED = 'required', -// OPTIONAL = 'optional', -// UNSET = 'unset', -// } - -// export class ComplexRequiredStatus { -// readonly status: RequiredStatus; -// // Exists if status is on a List. -// // This setup doesn't leave room for container types -// // that have multiple fields like a Dictionary -// // so it will need to be fixed when that comes up. -// readonly subStatus?: ComplexRequiredStatus; - -// constructor(status: RequiredStatus, subStatus?: ComplexRequiredStatus) { -// this.status = status; -// this.subStatus = subStatus; -// } - -// get [Symbol.toStringTag]() { -// return 'ComplexRequiredStatus'; -// } -// } - export interface FieldNode { readonly kind: Kind.FIELD; readonly loc?: Location; @@ -385,7 +361,7 @@ export interface FieldNode { readonly arguments?: ReadonlyArray; readonly directives?: ReadonlyArray; readonly selectionSet?: SelectionSetNode; - readonly required?: SupportArrayNode | NullabilityModifierNode; + readonly required?: SupportArrayNode; } export interface RequiredModifierNode { diff --git a/src/language/parser.ts b/src/language/parser.ts index 0d1ce4f710..eec3011a99 100644 --- a/src/language/parser.ts +++ b/src/language/parser.ts @@ -457,13 +457,6 @@ export class Parser { * - ! * - ? * - * NOTES: - * parseRequiredStatus assumes that if you have a designator like [[[!]!]!]! , the tokens can be - * grouped like ([[[) (!) (]!) (]!) (]!) . The center designator is on its own, and the rest are - * attached to a right bracket. This thinking simplifies parsing. - * - * A designator on its own like with `field!` is found using the same subroutine that's used to - * find the center designator mentioned above. */ parseRequiredStatus(): SupportArrayNode | undefined { let start = this._lexer.token; From 806fded4246dba6ba8c2acc682015c26e16ac321 Mon Sep 17 00:00:00 2001 From: twof Date: Mon, 29 Nov 2021 15:53:29 -0800 Subject: [PATCH 48/64] reworked how lists are represented in the AST to better capture no-ops --- src/language/__tests__/parser-test.ts | 139 ++++++++++++++----------- src/language/__tests__/printer-test.ts | 6 +- src/language/ast.ts | 19 +++- src/language/kinds.ts | 2 +- src/language/parser.ts | 38 ++++--- src/language/printer.ts | 62 ++++++----- 6 files changed, 149 insertions(+), 117 deletions(-) diff --git a/src/language/__tests__/parser-test.ts b/src/language/__tests__/parser-test.ts index f292c529c3..05313797bb 100644 --- a/src/language/__tests__/parser-test.ts +++ b/src/language/__tests__/parser-test.ts @@ -11,7 +11,6 @@ import { Kind } from '../kinds'; import { Source } from '../source'; import { TokenKind } from '../tokenKind'; import { parse, parseValue, parseConstValue, parseType } from '../parser'; -import { RequiredStatus } from '../ast'; function expectSyntaxError(text: string) { return expectToThrowJSON(() => parse(text)); @@ -226,13 +225,50 @@ describe('Parser', () => { }); it('parses required field', () => { - expect(() => - parse(` + const result = parse(dedent` query { requiredField! } - `), - ).to.not.throw(); + `) + + expectJSON(result).toDeepEqual({ + kind: Kind.DOCUMENT, + loc: { start: 0, end: 26 }, + definitions: [ + { + kind: Kind.OPERATION_DEFINITION, + loc: { start: 0, end: 26 }, + operation: 'query', + name: undefined, + variableDefinitions: [], + directives: [], + selectionSet: { + kind: Kind.SELECTION_SET, + loc: { start: 6, end: 26 }, + selections: [ + { + kind: Kind.FIELD, + loc: { start: 10, end: 24 }, + alias: undefined, + name: { + kind: Kind.NAME, + loc: { start: 10, end: 23 }, + value: 'requiredField', + }, + arguments: [], + directives: [], + selectionSet: undefined, + required: { + kind: Kind.REQUIRED_DESIGNATOR, + element: undefined, + loc: { start: 25, end: 24 }, + }, + } + ], + }, + }, + ], + }); }); it('parses optional field', () => { @@ -377,17 +413,12 @@ describe('Parser', () => { arguments: [], directives: [], required: { - kind: Kind.NULLABILITY, - elementStatus: undefined, + kind: Kind.LIST_NULLABILITY, loc: { start: 9, end: 12 }, - child: { - kind: Kind.NULLABILITY, - child: undefined, - loc: { start: 10, end: 11 }, - elementStatus: { - kind: Kind.REQUIRED_DESIGNATOR, - loc: { start: 11, end: 11 } - } + elementStatus: { + kind: Kind.REQUIRED_DESIGNATOR, + loc: { start: 11, end: 11 }, + element: undefined } }, selectionSet: undefined, @@ -433,17 +464,12 @@ describe('Parser', () => { arguments: [], directives: [], required: { - kind: Kind.NULLABILITY, - elementStatus: undefined, + kind: Kind.LIST_NULLABILITY, loc: { start: 9, end: 12 }, - child: { - kind: Kind.NULLABILITY, - child: undefined, - loc: { start: 10, end: 11 }, - elementStatus: { - kind: Kind.OPTIONAL_DESIGNATOR, - loc: { start: 11, end: 11 } - } + elementStatus: { + kind: Kind.OPTIONAL_DESIGNATOR, + loc: { start: 11, end: 11 }, + element: undefined } }, selectionSet: undefined, @@ -490,13 +516,13 @@ describe('Parser', () => { directives: [], selectionSet: undefined, required: { - kind: Kind.NULLABILITY, - elementStatus: { - kind: Kind.REQUIRED_DESIGNATOR, - loc: { start: 13, end: 12 } + kind: Kind.REQUIRED_DESIGNATOR, + element: { + kind: Kind.LIST_NULLABILITY, + elementStatus: undefined, + loc: { start: 9, end: 11 } }, - loc: { start: 9, end: 12 }, - child: undefined + loc: { start: 13, end: 12 }, }, } ], @@ -540,13 +566,13 @@ describe('Parser', () => { arguments: [], directives: [], required: { - kind: Kind.NULLABILITY, - elementStatus: { - kind: Kind.OPTIONAL_DESIGNATOR, - loc: { start: 13, end: 12 } + kind: Kind.OPTIONAL_DESIGNATOR, + element: { + kind: Kind.LIST_NULLABILITY, + loc: { start: 9, end: 11 }, + elementStatus: undefined }, - loc: { start: 9, end: 12 }, - child: undefined + loc: { start: 13, end: 12 }, }, selectionSet: undefined, }, @@ -591,31 +617,26 @@ describe('Parser', () => { arguments: [], directives: [], required: { - kind: Kind.NULLABILITY, - elementStatus: { - kind: Kind.REQUIRED_DESIGNATOR, - loc: { start: 19, end: 18 } - }, - loc: { start: 9, end: 18 }, - child: { - kind: Kind.NULLABILITY, - elementStatus: undefined, - loc: { start: 10, end: 16 }, - child: { - kind: Kind.NULLABILITY, + kind: Kind.REQUIRED_DESIGNATOR, + loc: { start: 19, end: 18 }, + element: { + kind: Kind.LIST_NULLABILITY, + loc: { start: 9, end: 17 }, + elementStatus: { + kind: Kind.LIST_NULLABILITY, + loc: { start: 10, end: 16 }, elementStatus: { kind: Kind.REQUIRED_DESIGNATOR, - loc: { start: 15, end: 15 } - }, - loc: { start: 11, end: 15 }, - child: { - kind: Kind.NULLABILITY, - elementStatus: { - kind: Kind.OPTIONAL_DESIGNATOR, - loc: { start: 13, end: 13 } + loc: { start: 15, end: 15 }, + element: { + kind: Kind.LIST_NULLABILITY, + loc: { start: 11, end: 14 }, + elementStatus: { + kind: Kind.OPTIONAL_DESIGNATOR, + loc: { start: 13, end: 13 }, + element: undefined + } }, - loc: { start: 12, end: 13 }, - child: undefined }, }, }, diff --git a/src/language/__tests__/printer-test.ts b/src/language/__tests__/printer-test.ts index 699392b70f..f192aa510a 100644 --- a/src/language/__tests__/printer-test.ts +++ b/src/language/__tests__/printer-test.ts @@ -8,14 +8,12 @@ import { Kind } from '../kinds'; import { parse } from '../parser'; import { print } from '../printer'; -import { ComplexRequiredStatus, RequiredStatus } from '../ast'; - describe('Printer: Query document', () => { it('prints minimal ast', () => { const ast = { kind: Kind.FIELD, name: { kind: Kind.NAME, value: 'foo' }, - required: new ComplexRequiredStatus(RequiredStatus.UNSET), + required: undefined } as const; expect(print(ast)).to.equal('foo'); }); @@ -30,7 +28,7 @@ describe('Printer: Query document', () => { }); it('correctly prints non-query operations without name', () => { - const queryASTShorthanded = parse('query { id, name }'); + const queryASTShorthanded = parse('query { id[!], name[]! }'); expect(print(queryASTShorthanded)).to.equal(dedent` { id diff --git a/src/language/ast.ts b/src/language/ast.ts index 9165cc4955..547567d713 100644 --- a/src/language/ast.ts +++ b/src/language/ast.ts @@ -1,3 +1,4 @@ +import { ASTNode } from '.'; import type { Kind } from './kinds'; import type { Source } from './source'; @@ -180,7 +181,10 @@ export type ASTNode = | InterfaceTypeExtensionNode | UnionTypeExtensionNode | EnumTypeExtensionNode - | InputObjectTypeExtensionNode; + | InputObjectTypeExtensionNode + | RequiredModifierNode + | OptionalModifierNode + | SupportArrayNode; /** * Utility type listing all nodes indexed by their kind. @@ -207,7 +211,10 @@ export const QueryDocumentKeys: { VariableDefinition: ['variable', 'type', 'defaultValue', 'directives'], Variable: ['name'], SelectionSet: ['selections'], - Field: ['alias', 'name', 'arguments', 'directives', 'selectionSet'], + Field: ['alias', 'name', 'arguments', 'directives', 'selectionSet', 'required'], + Nullability: ['child', 'elementStatus'], + RequiredDesignator: [], + OptionalDesignator: [], Argument: ['name', 'value'], FragmentSpread: ['name', 'directives'], @@ -367,20 +374,22 @@ export interface FieldNode { export interface RequiredModifierNode { readonly kind: Kind.REQUIRED_DESIGNATOR; readonly loc?: Location; + readonly element?: SupportArrayNode; } export interface OptionalModifierNode { readonly kind: Kind.OPTIONAL_DESIGNATOR; readonly loc?: Location; + readonly element?: SupportArrayNode } +// modifiers can be !, ? or [] export type NullabilityModifierNode = RequiredModifierNode | OptionalModifierNode; export interface SupportArrayNode { - readonly kind: Kind.NULLABILITY; + readonly kind: Kind.LIST_NULLABILITY; readonly loc?: Location; - readonly elementStatus?: NullabilityModifierNode; - readonly child?: SupportArrayNode + readonly elementStatus?: NullabilityModifierNode | SupportArrayNode; } export interface ArgumentNode { diff --git a/src/language/kinds.ts b/src/language/kinds.ts index b18f9b69d6..3751ec1076 100644 --- a/src/language/kinds.ts +++ b/src/language/kinds.ts @@ -12,7 +12,7 @@ export enum Kind { SELECTION_SET = 'SelectionSet', FIELD = 'Field', ARGUMENT = 'Argument', - NULLABILITY = 'Nullability', + LIST_NULLABILITY = 'ListNullabilityDesignator', REQUIRED_DESIGNATOR = 'RequiredDesignator', OPTIONAL_DESIGNATOR = 'OptionalDesignator', diff --git a/src/language/parser.ts b/src/language/parser.ts index eec3011a99..5898628518 100644 --- a/src/language/parser.ts +++ b/src/language/parser.ts @@ -458,22 +458,28 @@ export class Parser { * - ? * */ - parseRequiredStatus(): SupportArrayNode | undefined { + parseRequiredStatus(): NullabilityModifierNode | SupportArrayNode | undefined { + let list = this.parseListNullability(); + let nullabilityStatus = this.parseNullabilityModifierNode(list); + + return nullabilityStatus ?? list; + } + + parseListNullability(): SupportArrayNode | undefined { let start = this._lexer.token; - let child: SupportArrayNode | undefined; - + let child: NullabilityModifierNode | SupportArrayNode | undefined; + let isList = false; + if (this.expectOptionalToken(TokenKind.BRACKET_L)) { child = this.parseRequiredStatus(); + isList = true; this.expectToken(TokenKind.BRACKET_R); } - let nullabilityStatus = this.parseNullabilityModifierNode(); - - if (nullabilityStatus || child) { + if (isList) { return this.node(start, { - kind: Kind.NULLABILITY, - elementStatus: nullabilityStatus, - child: child + kind: Kind.LIST_NULLABILITY, + elementStatus: child }); } } @@ -484,22 +490,24 @@ export class Parser { * - ? * */ - parseNullabilityModifierNode(): NullabilityModifierNode | undefined { - return this.parseRequiredModifierNode() ?? this.parseOptionalModifierNode() + parseNullabilityModifierNode(childElement?: SupportArrayNode): NullabilityModifierNode | undefined { + return this.parseRequiredModifierNode(childElement) ?? this.parseOptionalModifierNode(childElement) } - parseRequiredModifierNode(): RequiredModifierNode | undefined { + parseRequiredModifierNode(childElement?: SupportArrayNode): RequiredModifierNode | undefined { if (this.expectOptionalToken(TokenKind.BANG)) { return this.node(this._lexer.token, { - kind: Kind.REQUIRED_DESIGNATOR + kind: Kind.REQUIRED_DESIGNATOR, + element: childElement }); } } - parseOptionalModifierNode(): OptionalModifierNode | undefined { + parseOptionalModifierNode(childElement?: SupportArrayNode): OptionalModifierNode | undefined { if (this.expectOptionalToken(TokenKind.QUESTION_MARK)) { return this.node(this._lexer.token, { - kind: Kind.OPTIONAL_DESIGNATOR + kind: Kind.OPTIONAL_DESIGNATOR, + element: childElement }); } } diff --git a/src/language/printer.ts b/src/language/printer.ts index b89de0b6ae..6022cd5196 100644 --- a/src/language/printer.ts +++ b/src/language/printer.ts @@ -1,7 +1,6 @@ import type { Maybe } from '../jsutils/Maybe'; -import type { ASTNode, ComplexRequiredStatus } from './ast'; -import { RequiredStatus } from './ast'; +import type { ASTNode } from './ast'; import type { ASTReducer } from './visitor'; import { visit } from './visitor'; import { printBlockString } from './blockString'; @@ -64,39 +63,10 @@ const printDocASTReducer: ASTReducer = { selectionSet, required, }) { - const buildRequiredDesignator = ( - requiredStatus: ComplexRequiredStatus, - accumulator: string = '', - depth: number = 0, - ): string => { - let tempAccumulator = accumulator; - if (requiredStatus.subStatus) { - tempAccumulator = buildRequiredDesignator( - requiredStatus.subStatus, - tempAccumulator + '[', - depth + 1, - ); - } - - if (requiredStatus.status === RequiredStatus.REQUIRED) { - tempAccumulator += '!'; - } else if (requiredStatus.status === RequiredStatus.OPTIONAL) { - tempAccumulator += '?'; - } - if (depth > 0) { - tempAccumulator += ']'; - } - - return tempAccumulator; - }; - - const prefix = wrap('', alias, ': ') + name; - const requiredDesignator = buildRequiredDesignator( - required as unknown as ComplexRequiredStatus, - ); + const prefix = join([wrap('', alias, ': '), name, required], ''); let argsLine = - prefix + requiredDesignator + wrap('(', join(args, ', '), ')'); + prefix + wrap('(', join(args, ', '), ')'); if (argsLine.length > MAX_LINE_LENGTH) { argsLine = prefix + wrap('(\n', indent(join(args, '\n')), '\n)'); @@ -106,6 +76,32 @@ const printDocASTReducer: ASTReducer = { }, }, + RequiredDesignator: { + leave({}) { + return '!'; + } + }, + + OptionalDesignator: { + leave({}) { + return '?'; + } + }, + + Nullability: { + leave({ + elementStatus, + child + }) { + let required = elementStatus ?? ''; + if (child) { + required = '[' + child + ']' + required; + } + return required; + } + }, + + Argument: { leave: ({ name, value }) => name + ': ' + value }, // Fragments From 98ceaee0032dd216c11bbf91d024f59ff02f43f5 Mon Sep 17 00:00:00 2001 From: twof Date: Mon, 29 Nov 2021 16:08:36 -0800 Subject: [PATCH 49/64] printer tests passing --- src/language/__tests__/printer-test.ts | 2 +- src/language/ast.ts | 6 +++--- src/language/parser.ts | 4 ---- src/language/printer.ts | 21 ++++++++++----------- 4 files changed, 14 insertions(+), 19 deletions(-) diff --git a/src/language/__tests__/printer-test.ts b/src/language/__tests__/printer-test.ts index f192aa510a..04a91c5e37 100644 --- a/src/language/__tests__/printer-test.ts +++ b/src/language/__tests__/printer-test.ts @@ -28,7 +28,7 @@ describe('Printer: Query document', () => { }); it('correctly prints non-query operations without name', () => { - const queryASTShorthanded = parse('query { id[!], name[]! }'); + const queryASTShorthanded = parse('query { id, name }'); expect(print(queryASTShorthanded)).to.equal(dedent` { id diff --git a/src/language/ast.ts b/src/language/ast.ts index 547567d713..28b95a6ee4 100644 --- a/src/language/ast.ts +++ b/src/language/ast.ts @@ -212,9 +212,9 @@ export const QueryDocumentKeys: { Variable: ['name'], SelectionSet: ['selections'], Field: ['alias', 'name', 'arguments', 'directives', 'selectionSet', 'required'], - Nullability: ['child', 'elementStatus'], - RequiredDesignator: [], - OptionalDesignator: [], + ListNullabilityDesignator: ['elementStatus'], + RequiredDesignator: ['element'], + OptionalDesignator: ['element'], Argument: ['name', 'value'], FragmentSpread: ['name', 'directives'], diff --git a/src/language/parser.ts b/src/language/parser.ts index 5898628518..ca33eb05ce 100644 --- a/src/language/parser.ts +++ b/src/language/parser.ts @@ -468,15 +468,11 @@ export class Parser { parseListNullability(): SupportArrayNode | undefined { let start = this._lexer.token; let child: NullabilityModifierNode | SupportArrayNode | undefined; - let isList = false; if (this.expectOptionalToken(TokenKind.BRACKET_L)) { child = this.parseRequiredStatus(); - isList = true; this.expectToken(TokenKind.BRACKET_R); - } - if (isList) { return this.node(start, { kind: Kind.LIST_NULLABILITY, elementStatus: child diff --git a/src/language/printer.ts b/src/language/printer.ts index 6022cd5196..17bdde5f13 100644 --- a/src/language/printer.ts +++ b/src/language/printer.ts @@ -77,27 +77,26 @@ const printDocASTReducer: ASTReducer = { }, RequiredDesignator: { - leave({}) { - return '!'; + leave({ + element + }) { + return (element ?? '') + '!'; } }, OptionalDesignator: { - leave({}) { - return '?'; + leave({ + element + }) { + return (element ?? '') + '?'; } }, - Nullability: { + ListNullabilityDesignator: { leave({ elementStatus, - child }) { - let required = elementStatus ?? ''; - if (child) { - required = '[' + child + ']' + required; - } - return required; + return '[' + (elementStatus ?? '') + ']'; } }, From 316cd4b2c541455ecf806c2eabc8dda20210f940 Mon Sep 17 00:00:00 2001 From: twof Date: Tue, 30 Nov 2021 01:25:07 -0800 Subject: [PATCH 50/64] reworked applyRequiredStatus to use a visitor --- src/execution/__tests__/executor-test.ts | 42 ++++++---- src/language/__tests__/parser-test.ts | 14 ++-- src/language/ast.ts | 6 +- src/language/parser.ts | 2 +- src/language/printer.ts | 4 +- src/utilities/applyRequiredStatus.ts | 100 +++++++++++++++++++---- 6 files changed, 122 insertions(+), 46 deletions(-) diff --git a/src/execution/__tests__/executor-test.ts b/src/execution/__tests__/executor-test.ts index 577f3a6b05..0cd4a186ed 100644 --- a/src/execution/__tests__/executor-test.ts +++ b/src/execution/__tests__/executor-test.ts @@ -22,7 +22,7 @@ import { import { execute, executeSync } from '../execute'; import { modifiedOutputType } from '../../utilities/applyRequiredStatus'; -import { ComplexRequiredStatus, RequiredStatus } from '../../language/ast'; +import type { NullabilityModifierNode, SupportArrayNode } from '../../language/ast'; describe('Execute: Handles basic execution tasks', () => { it('throws if no document is provided', () => { @@ -1612,26 +1612,36 @@ describe('Execute: Handles basic execution tasks', () => { it('modifiedOutputType produces correct output types', () => { const type = new GraphQLList( - new GraphQLNonNull( - new GraphQLList(new GraphQLNonNull(new GraphQLList(GraphQLInt))), - ), + new GraphQLNonNull(new GraphQLList( + new GraphQLNonNull(new GraphQLList( + GraphQLInt + )) + )) ); - const requiredStatus = new ComplexRequiredStatus( - RequiredStatus.UNSET, - new ComplexRequiredStatus( - RequiredStatus.OPTIONAL, - new ComplexRequiredStatus( - RequiredStatus.UNSET, - new ComplexRequiredStatus(RequiredStatus.REQUIRED, undefined), - ), - ), - ); + const nullabilityNode: NullabilityModifierNode | SupportArrayNode = { + kind: Kind.LIST_NULLABILITY, + element: { + kind: Kind.OPTIONAL_DESIGNATOR, + element: { + kind: Kind.LIST_NULLABILITY, + element: { + kind: Kind.LIST_NULLABILITY, + element: { + kind: Kind.REQUIRED_DESIGNATOR, + element: undefined + } + } + } + } + }; - const outputType = modifiedOutputType(type, requiredStatus); + const outputType = modifiedOutputType(type, nullabilityNode); const expectedOutputType = new GraphQLList( new GraphQLList( - new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(GraphQLInt))), + new GraphQLNonNull(new GraphQLList( + new GraphQLNonNull(GraphQLInt) + )), ), ); diff --git a/src/language/__tests__/parser-test.ts b/src/language/__tests__/parser-test.ts index 05313797bb..35d9956c34 100644 --- a/src/language/__tests__/parser-test.ts +++ b/src/language/__tests__/parser-test.ts @@ -415,7 +415,7 @@ describe('Parser', () => { required: { kind: Kind.LIST_NULLABILITY, loc: { start: 9, end: 12 }, - elementStatus: { + element: { kind: Kind.REQUIRED_DESIGNATOR, loc: { start: 11, end: 11 }, element: undefined @@ -466,7 +466,7 @@ describe('Parser', () => { required: { kind: Kind.LIST_NULLABILITY, loc: { start: 9, end: 12 }, - elementStatus: { + element: { kind: Kind.OPTIONAL_DESIGNATOR, loc: { start: 11, end: 11 }, element: undefined @@ -519,7 +519,7 @@ describe('Parser', () => { kind: Kind.REQUIRED_DESIGNATOR, element: { kind: Kind.LIST_NULLABILITY, - elementStatus: undefined, + element: undefined, loc: { start: 9, end: 11 } }, loc: { start: 13, end: 12 }, @@ -570,7 +570,7 @@ describe('Parser', () => { element: { kind: Kind.LIST_NULLABILITY, loc: { start: 9, end: 11 }, - elementStatus: undefined + element: undefined }, loc: { start: 13, end: 12 }, }, @@ -622,16 +622,16 @@ describe('Parser', () => { element: { kind: Kind.LIST_NULLABILITY, loc: { start: 9, end: 17 }, - elementStatus: { + element: { kind: Kind.LIST_NULLABILITY, loc: { start: 10, end: 16 }, - elementStatus: { + element: { kind: Kind.REQUIRED_DESIGNATOR, loc: { start: 15, end: 15 }, element: { kind: Kind.LIST_NULLABILITY, loc: { start: 11, end: 14 }, - elementStatus: { + element: { kind: Kind.OPTIONAL_DESIGNATOR, loc: { start: 13, end: 13 }, element: undefined diff --git a/src/language/ast.ts b/src/language/ast.ts index 28b95a6ee4..7b69762579 100644 --- a/src/language/ast.ts +++ b/src/language/ast.ts @@ -212,7 +212,7 @@ export const QueryDocumentKeys: { Variable: ['name'], SelectionSet: ['selections'], Field: ['alias', 'name', 'arguments', 'directives', 'selectionSet', 'required'], - ListNullabilityDesignator: ['elementStatus'], + ListNullabilityDesignator: ['element'], RequiredDesignator: ['element'], OptionalDesignator: ['element'], Argument: ['name', 'value'], @@ -368,7 +368,7 @@ export interface FieldNode { readonly arguments?: ReadonlyArray; readonly directives?: ReadonlyArray; readonly selectionSet?: SelectionSetNode; - readonly required?: SupportArrayNode; + readonly required?: SupportArrayNode | NullabilityModifierNode; } export interface RequiredModifierNode { @@ -389,7 +389,7 @@ export type NullabilityModifierNode = RequiredModifierNode | OptionalModifierNod export interface SupportArrayNode { readonly kind: Kind.LIST_NULLABILITY; readonly loc?: Location; - readonly elementStatus?: NullabilityModifierNode | SupportArrayNode; + readonly element?: NullabilityModifierNode | SupportArrayNode; } export interface ArgumentNode { diff --git a/src/language/parser.ts b/src/language/parser.ts index ca33eb05ce..017830ab7f 100644 --- a/src/language/parser.ts +++ b/src/language/parser.ts @@ -475,7 +475,7 @@ export class Parser { return this.node(start, { kind: Kind.LIST_NULLABILITY, - elementStatus: child + element: child }); } } diff --git a/src/language/printer.ts b/src/language/printer.ts index 17bdde5f13..1eafb93ef8 100644 --- a/src/language/printer.ts +++ b/src/language/printer.ts @@ -94,9 +94,9 @@ const printDocASTReducer: ASTReducer = { ListNullabilityDesignator: { leave({ - elementStatus, + element, }) { - return '[' + (elementStatus ?? '') + ']'; + return '[' + (element ?? '') + ']'; } }, diff --git a/src/utilities/applyRequiredStatus.ts b/src/utilities/applyRequiredStatus.ts index 9974a74b86..c9dfff90a8 100644 --- a/src/utilities/applyRequiredStatus.ts +++ b/src/utilities/applyRequiredStatus.ts @@ -5,9 +5,14 @@ import { isNonNullType, assertListType, GraphQLList, + isListType } from '../type/definition'; -import type { ComplexRequiredStatus } from '../language/ast'; -import { RequiredStatus } from '../language/ast'; +import type { SupportArrayNode, OptionalModifierNode, RequiredModifierNode, NullabilityModifierNode } from '../language/ast'; +import { Kind } from '../language/kinds'; +import { ASTReducer, visit } from '../language/visitor'; +import { GraphQLBoolean } from '..'; + + /** * Implements the "Accounting For Client Controlled Nullability Designators" @@ -17,11 +22,11 @@ import { RequiredStatus } from '../language/ast'; */ function simpleModifiedOutputType( type: GraphQLOutputType, - required: RequiredStatus, + nullabilityNode: NullabilityModifierNode, ): GraphQLOutputType { - if (required === RequiredStatus.REQUIRED && !isNonNullType(type)) { + if (nullabilityNode.kind === Kind.REQUIRED_DESIGNATOR && !isNonNullType(type)) { return new GraphQLNonNull(type); - } else if (required === RequiredStatus.OPTIONAL) { + } else if (nullabilityNode.kind === Kind.OPTIONAL_DESIGNATOR) { return getNullableType(type); } return type; @@ -29,21 +34,82 @@ function simpleModifiedOutputType( export function modifiedOutputType( type: GraphQLOutputType, - required: ComplexRequiredStatus, + nullabilityNode?: SupportArrayNode | NullabilityModifierNode, ): GraphQLOutputType { - if (!required.subStatus) { - return simpleModifiedOutputType(type, required.status); - } - // If execution reaches this point, type is a list. - const listType = assertListType(getNullableType(type)); - const elementType = listType.ofType as GraphQLOutputType; - const prev = modifiedOutputType(elementType, required.subStatus); - let constructedType = new GraphQLList(prev); + let typeStack: [GraphQLOutputType] = [type]; - if (isNonNullType(type)) { - constructedType = new GraphQLNonNull(constructedType); + const applyStatusReducer: ASTReducer = { + RequiredDesignator: { + leave({ + element + }) { + if (element){ + return new GraphQLNonNull(element); + } else { + return new GraphQLNonNull(typeStack.pop()!); + } + }, + }, + OptionalDesignator: { + leave({ + element + }) { + if (element) { + return getNullableType(element); + } else { + return typeStack.pop()!; + } + } + }, + ListNullabilityDesignator: { + enter() { + let list = assertListType(getNullableType(typeStack.at(-1))); + let elementType = list.ofType as GraphQLOutputType; + typeStack.push(elementType); + }, + leave({ + element + }) { + let listType = typeStack.pop()!; + let isRequired = isNonNullType(listType); + if (element) { + return isRequired + ? new GraphQLNonNull(new GraphQLList(element)) + : new GraphQLList(element); + } else { + return isRequired + ? new GraphQLNonNull(new GraphQLList(listType)) + : new GraphQLList(listType); + } + } + } } - return simpleModifiedOutputType(constructedType, required.status); + if (nullabilityNode) { + return visit(nullabilityNode, applyStatusReducer); + } else { + return type; + } + + + // if (nullabilityNode.kind == Kind.LIST_NULLABILITY && isListType(type)) { + // // If execution reaches this point, type is a list. + // const listType = assertListType(getNullableType(type)); + // const elementType = listType.ofType as GraphQLOutputType; + // const prev = modifiedOutputType(elementType, nullabilityNode.element!); + // let constructedType = new GraphQLList(prev); + + // if (isNonNullType(type)) { + // constructedType = new GraphQLNonNull(constructedType); + // } + // return constructedType; + // } else if ( + // nullabilityNode.kind == Kind.REQUIRED_DESIGNATOR + // || nullabilityNode.kind == Kind.OPTIONAL_DESIGNATOR + // ) { + // return simpleModifiedOutputType(type, nullabilityNode as NullabilityModifierNode); + // } else { + // return type; + // } } From 2472046b2ecf8232c0a3b5253819e00310bbb0ec Mon Sep 17 00:00:00 2001 From: twof Date: Tue, 30 Nov 2021 01:58:13 -0800 Subject: [PATCH 51/64] minor cleanup --- src/utilities/applyRequiredStatus.ts | 43 ++-------------------------- 1 file changed, 2 insertions(+), 41 deletions(-) diff --git a/src/utilities/applyRequiredStatus.ts b/src/utilities/applyRequiredStatus.ts index c9dfff90a8..b2327b6296 100644 --- a/src/utilities/applyRequiredStatus.ts +++ b/src/utilities/applyRequiredStatus.ts @@ -4,15 +4,10 @@ import { GraphQLNonNull, isNonNullType, assertListType, - GraphQLList, - isListType + GraphQLList } from '../type/definition'; -import type { SupportArrayNode, OptionalModifierNode, RequiredModifierNode, NullabilityModifierNode } from '../language/ast'; -import { Kind } from '../language/kinds'; +import type { SupportArrayNode, NullabilityModifierNode } from '../language/ast'; import { ASTReducer, visit } from '../language/visitor'; -import { GraphQLBoolean } from '..'; - - /** * Implements the "Accounting For Client Controlled Nullability Designators" @@ -20,23 +15,10 @@ import { GraphQLBoolean } from '..'; * type of a field by taking into account both the nullability listed in the * schema, and the nullability providing by an operation. */ -function simpleModifiedOutputType( - type: GraphQLOutputType, - nullabilityNode: NullabilityModifierNode, -): GraphQLOutputType { - if (nullabilityNode.kind === Kind.REQUIRED_DESIGNATOR && !isNonNullType(type)) { - return new GraphQLNonNull(type); - } else if (nullabilityNode.kind === Kind.OPTIONAL_DESIGNATOR) { - return getNullableType(type); - } - return type; -} - export function modifiedOutputType( type: GraphQLOutputType, nullabilityNode?: SupportArrayNode | NullabilityModifierNode, ): GraphQLOutputType { - let typeStack: [GraphQLOutputType] = [type]; const applyStatusReducer: ASTReducer = { @@ -91,25 +73,4 @@ export function modifiedOutputType( } else { return type; } - - - // if (nullabilityNode.kind == Kind.LIST_NULLABILITY && isListType(type)) { - // // If execution reaches this point, type is a list. - // const listType = assertListType(getNullableType(type)); - // const elementType = listType.ofType as GraphQLOutputType; - // const prev = modifiedOutputType(elementType, nullabilityNode.element!); - // let constructedType = new GraphQLList(prev); - - // if (isNonNullType(type)) { - // constructedType = new GraphQLNonNull(constructedType); - // } - // return constructedType; - // } else if ( - // nullabilityNode.kind == Kind.REQUIRED_DESIGNATOR - // || nullabilityNode.kind == Kind.OPTIONAL_DESIGNATOR - // ) { - // return simpleModifiedOutputType(type, nullabilityNode as NullabilityModifierNode); - // } else { - // return type; - // } } From c1e1812472374d42d4a07812904c404efae8d8be Mon Sep 17 00:00:00 2001 From: twof Date: Tue, 30 Nov 2021 02:07:36 -0800 Subject: [PATCH 52/64] fixed some of the overlapping fields tests --- src/utilities/applyRequiredStatus.ts | 4 ++-- src/validation/rules/OverlappingFieldsCanBeMergedRule.ts | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/utilities/applyRequiredStatus.ts b/src/utilities/applyRequiredStatus.ts index b2327b6296..5d7b22ada3 100644 --- a/src/utilities/applyRequiredStatus.ts +++ b/src/utilities/applyRequiredStatus.ts @@ -29,7 +29,7 @@ export function modifiedOutputType( if (element){ return new GraphQLNonNull(element); } else { - return new GraphQLNonNull(typeStack.pop()!); + return new GraphQLNonNull(getNullableType(typeStack.pop()!)); } }, }, @@ -40,7 +40,7 @@ export function modifiedOutputType( if (element) { return getNullableType(element); } else { - return typeStack.pop()!; + return getNullableType(typeStack.pop()!); } } }, diff --git a/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts b/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts index 32e8e06ef1..c7b0a3e073 100644 --- a/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts +++ b/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts @@ -612,7 +612,8 @@ function findConflict( [node2], ]; } - } catch { + } catch (error) { + console.log(error); /* Do nothing. See above comment. */ } } From cb96767bdb12d2e187a963afab613938b0ea7b54 Mon Sep 17 00:00:00 2001 From: twof Date: Tue, 30 Nov 2021 02:28:05 -0800 Subject: [PATCH 53/64] required depth validation fixex --- src/utilities/applyRequiredStatus.ts | 2 +- .../rules/RequiredStatusOnFieldMatchesDefinitionRule.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utilities/applyRequiredStatus.ts b/src/utilities/applyRequiredStatus.ts index 5d7b22ada3..18d9a21ac9 100644 --- a/src/utilities/applyRequiredStatus.ts +++ b/src/utilities/applyRequiredStatus.ts @@ -27,7 +27,7 @@ export function modifiedOutputType( element }) { if (element){ - return new GraphQLNonNull(element); + return new GraphQLNonNull(getNullableType(element)); } else { return new GraphQLNonNull(getNullableType(typeStack.pop()!)); } diff --git a/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts b/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts index 0831f6defd..0a98c66bc2 100644 --- a/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts +++ b/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts @@ -28,7 +28,7 @@ export function RequiredStatusOnFieldMatchesDefinitionRule( >; try { modifiedOutputType(fieldDef.type, node.required); - } catch { + } catch (error) { context.reportError( new GraphQLError( `Syntax Error: Something is wrong with the nullability designator on ${ From ed2973a6c31d42630078476ed5eb879b809b989c Mon Sep 17 00:00:00 2001 From: twof Date: Tue, 30 Nov 2021 02:31:42 -0800 Subject: [PATCH 54/64] cleanup leftover references to deleted types --- src/language/parser.ts | 4 +--- src/utilities/__tests__/TypeInfo-test.ts | 3 +-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/language/parser.ts b/src/language/parser.ts index 017830ab7f..c3cd1102e3 100644 --- a/src/language/parser.ts +++ b/src/language/parser.ts @@ -69,9 +69,7 @@ import type { import { Location, - OperationTypeNode, - ComplexRequiredStatus, - RequiredStatus, + OperationTypeNode } from './ast'; import { Kind } from './kinds'; diff --git a/src/utilities/__tests__/TypeInfo-test.ts b/src/utilities/__tests__/TypeInfo-test.ts index f04dc28f69..0442799214 100644 --- a/src/utilities/__tests__/TypeInfo-test.ts +++ b/src/utilities/__tests__/TypeInfo-test.ts @@ -12,7 +12,6 @@ import { getNamedType, isCompositeType } from '../../type/definition'; import { buildSchema } from '../buildASTSchema'; import { TypeInfo, visitWithTypeInfo } from '../TypeInfo'; -import { ComplexRequiredStatus, RequiredStatus } from '../../language/ast'; const testSchema = buildSchema(` interface Pet { @@ -269,7 +268,7 @@ describe('visitWithTypeInfo', () => { { kind: 'Field', name: { kind: 'Name', value: '__typename' }, - required: new ComplexRequiredStatus(RequiredStatus.UNSET), + required: undefined }, ], }, From 546bf3e34a183b7e49c4a494c683cb6ddd2ac7a0 Mon Sep 17 00:00:00 2001 From: twof Date: Tue, 30 Nov 2021 02:41:39 -0800 Subject: [PATCH 55/64] complete test coverage --- src/utilities/applyRequiredStatus.ts | 4 ++-- .../OverlappingFieldsCanBeMergedRule-test.ts | 15 +++++++++++++++ .../rules/OverlappingFieldsCanBeMergedRule.ts | 3 +-- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/utilities/applyRequiredStatus.ts b/src/utilities/applyRequiredStatus.ts index 18d9a21ac9..b21cef3b1e 100644 --- a/src/utilities/applyRequiredStatus.ts +++ b/src/utilities/applyRequiredStatus.ts @@ -61,8 +61,8 @@ export function modifiedOutputType( : new GraphQLList(element); } else { return isRequired - ? new GraphQLNonNull(new GraphQLList(listType)) - : new GraphQLList(listType); + ? new GraphQLNonNull(new GraphQLList(listType)) + : new GraphQLList(listType); } } } diff --git a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts index 7253633078..15544842dd 100644 --- a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts +++ b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts @@ -684,6 +684,7 @@ describe('Validate: Overlapping fields can be merged', () => { type Lists { list: [Int] + requiredList: [Int!] mixedThreeDList: [[[Int]!]!] } @@ -1412,6 +1413,20 @@ describe('Validate: Overlapping fields can be merged', () => { `, ); }); + + it('matching matching required list fields merge', () => { + expectValidWithSchema( + schema, + ` + { + lists { + requiredList[] + requiredList[] + } + } + `, + ); + }); }); it('compatible return shapes on different return types', () => { diff --git a/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts b/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts index c7b0a3e073..32e8e06ef1 100644 --- a/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts +++ b/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts @@ -612,8 +612,7 @@ function findConflict( [node2], ]; } - } catch (error) { - console.log(error); + } catch { /* Do nothing. See above comment. */ } } From 4c4cbf6f3f19173a40a9636a725c9f965c7abc94 Mon Sep 17 00:00:00 2001 From: twof Date: Tue, 30 Nov 2021 03:36:11 -0800 Subject: [PATCH 56/64] all tests passing --- src/language/__tests__/visitor-test.ts | 50 ++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/language/__tests__/visitor-test.ts b/src/language/__tests__/visitor-test.ts index ab502f3217..bc34fe964c 100644 --- a/src/language/__tests__/visitor-test.ts +++ b/src/language/__tests__/visitor-test.ts @@ -657,64 +657,114 @@ describe('Visitor', () => { ['enter', 'Field', 1, undefined], ['enter', 'Name', 'name', 'Field'], ['leave', 'Name', 'name', 'Field'], + ['enter', 'RequiredDesignator', 'required', "Field"], + ['leave', 'RequiredDesignator', 'required', "Field"], ['leave', 'Field', 1, undefined], ['enter', 'Field', 2, undefined], ['enter', 'Name', 'alias', 'Field'], ['leave', 'Name', 'alias', 'Field'], ['enter', 'Name', 'name', 'Field'], ['leave', 'Name', 'name', 'Field'], + ['enter', 'RequiredDesignator', 'required', "Field"], + ['leave', 'RequiredDesignator', 'required', "Field"], ['leave', 'Field', 2, undefined], ['enter', 'Field', 3, undefined], ['enter', 'Name', 'name', 'Field'], ['leave', 'Name', 'name', 'Field'], + ['enter', 'OptionalDesignator', 'required', "Field"], + ['leave', 'OptionalDesignator', 'required', "Field"], ['leave', 'Field', 3, undefined], ['enter', 'Field', 4, undefined], ['enter', 'Name', 'alias', 'Field'], ['leave', 'Name', 'alias', 'Field'], ['enter', 'Name', 'name', 'Field'], ['leave', 'Name', 'name', 'Field'], + ['enter', 'OptionalDesignator', 'required', "Field"], + ['leave', 'OptionalDesignator', 'required', "Field"], ['leave', 'Field', 4, undefined], ['enter', 'Field', 5, undefined], ['enter', 'Name', 'alias', 'Field'], ['leave', 'Name', 'alias', 'Field'], ['enter', 'Name', 'name', 'Field'], ['leave', 'Name', 'name', 'Field'], + ['enter', 'RequiredDesignator', 'required', "Field"], + ['enter', 'ListNullabilityDesignator', 'element', "RequiredDesignator"], + ['leave', 'ListNullabilityDesignator', 'element', "RequiredDesignator"], + ['leave', 'RequiredDesignator', 'required', "Field"], ['leave', 'Field', 5, undefined], ['enter', 'Field', 6, undefined], ['enter', 'Name', 'alias', 'Field'], ['leave', 'Name', 'alias', 'Field'], ['enter', 'Name', 'name', 'Field'], ['leave', 'Name', 'name', 'Field'], + ['enter', 'ListNullabilityDesignator', 'required', "Field"], + ['enter', 'RequiredDesignator', 'element', "ListNullabilityDesignator"], + ['leave', 'RequiredDesignator', 'element', "ListNullabilityDesignator"], + ['leave', 'ListNullabilityDesignator', 'required', "Field"], ['leave', 'Field', 6, undefined], ['enter', 'Field', 7, undefined], ['enter', 'Name', 'alias', 'Field'], ['leave', 'Name', 'alias', 'Field'], ['enter', 'Name', 'name', 'Field'], ['leave', 'Name', 'name', 'Field'], + ['enter', 'RequiredDesignator', 'required', "Field"], + ['enter', 'ListNullabilityDesignator', 'element', "RequiredDesignator"], + ['enter', 'RequiredDesignator', 'element', "ListNullabilityDesignator"], + ['leave', 'RequiredDesignator', 'element', "ListNullabilityDesignator"], + ['leave', 'ListNullabilityDesignator', 'element', "RequiredDesignator"], + ['leave', 'RequiredDesignator', 'required', "Field"], ['leave', 'Field', 7, undefined], ['enter', 'Field', 8, undefined], ['enter', 'Name', 'alias', 'Field'], ['leave', 'Name', 'alias', 'Field'], ['enter', 'Name', 'name', 'Field'], ['leave', 'Name', 'name', 'Field'], + ['enter', 'OptionalDesignator', 'required', "Field"], + ['enter', 'ListNullabilityDesignator', 'element', "OptionalDesignator"], + ['leave', 'ListNullabilityDesignator', 'element', "OptionalDesignator"], + ['leave', 'OptionalDesignator', 'required', "Field"], ['leave', 'Field', 8, undefined], ['enter', 'Field', 9, undefined], ['enter', 'Name', 'alias', 'Field'], ['leave', 'Name', 'alias', 'Field'], ['enter', 'Name', 'name', 'Field'], ['leave', 'Name', 'name', 'Field'], + ['enter', 'ListNullabilityDesignator', 'required', "Field"], + ['enter', 'OptionalDesignator', 'element', "ListNullabilityDesignator"], + ['leave', 'OptionalDesignator', 'element', "ListNullabilityDesignator"], + ['leave', 'ListNullabilityDesignator', 'required', "Field"], ['leave', 'Field', 9, undefined], ['enter', 'Field', 10, undefined], ['enter', 'Name', 'alias', 'Field'], ['leave', 'Name', 'alias', 'Field'], ['enter', 'Name', 'name', 'Field'], ['leave', 'Name', 'name', 'Field'], + ['enter', 'OptionalDesignator', 'required', "Field"], + ['enter', 'ListNullabilityDesignator', 'element', "OptionalDesignator"], + ['enter', 'OptionalDesignator', 'element', "ListNullabilityDesignator"], + ['leave', 'OptionalDesignator', 'element', "ListNullabilityDesignator"], + ['leave', 'ListNullabilityDesignator', 'element', "OptionalDesignator"], + ['leave', 'OptionalDesignator', 'required', "Field"], ['leave', 'Field', 10, undefined], ['enter', 'Field', 11, undefined], ['enter', 'Name', 'alias', 'Field'], ['leave', 'Name', 'alias', 'Field'], ['enter', 'Name', 'name', 'Field'], ['leave', 'Name', 'name', 'Field'], + ['enter', 'RequiredDesignator', 'required', "Field"], + ['enter', 'ListNullabilityDesignator', 'element', "RequiredDesignator"], + ['enter', 'RequiredDesignator', 'element', "ListNullabilityDesignator"], + ['enter', 'ListNullabilityDesignator', 'element', "RequiredDesignator"], + ['enter', 'RequiredDesignator', 'element', "ListNullabilityDesignator"], + ['enter', 'ListNullabilityDesignator', 'element', "RequiredDesignator"], + ['enter', 'RequiredDesignator', 'element', "ListNullabilityDesignator"], + ['leave', 'RequiredDesignator', 'element', "ListNullabilityDesignator"], + ['leave', 'ListNullabilityDesignator', 'element', "RequiredDesignator"], + ['leave', 'RequiredDesignator', 'element', "ListNullabilityDesignator"], + ['leave', 'ListNullabilityDesignator', 'element', "RequiredDesignator"], + ['leave', 'RequiredDesignator', 'element', "ListNullabilityDesignator"], + ['leave', 'ListNullabilityDesignator', 'element', "RequiredDesignator"], + ['leave', 'RequiredDesignator', 'required', "Field"], ['leave', 'Field', 11, undefined], ['leave', 'SelectionSet', 'selectionSet', 'InlineFragment'], ['leave', 'InlineFragment', 1, undefined], From 002c99969274322d6f91d57270d75c3fb214ce9a Mon Sep 17 00:00:00 2001 From: twof Date: Tue, 30 Nov 2021 04:16:49 -0800 Subject: [PATCH 57/64] npm test passing --- src/execution/__tests__/executor-test.ts | 27 +++--- src/language/__tests__/parser-test.ts | 40 ++++----- src/language/__tests__/printer-test.ts | 2 +- src/language/__tests__/visitor-test.ts | 100 +++++++++++------------ src/language/ast.ts | 16 +++- src/language/parser.ts | 42 ++++++---- src/language/printer.ts | 22 ++--- src/utilities/__tests__/TypeInfo-test.ts | 2 +- src/utilities/applyRequiredStatus.ts | 85 +++++++++++-------- 9 files changed, 181 insertions(+), 155 deletions(-) diff --git a/src/execution/__tests__/executor-test.ts b/src/execution/__tests__/executor-test.ts index 0cd4a186ed..c9367f75e8 100644 --- a/src/execution/__tests__/executor-test.ts +++ b/src/execution/__tests__/executor-test.ts @@ -22,7 +22,10 @@ import { import { execute, executeSync } from '../execute'; import { modifiedOutputType } from '../../utilities/applyRequiredStatus'; -import type { NullabilityModifierNode, SupportArrayNode } from '../../language/ast'; +import type { + NullabilityModifierNode, + SupportArrayNode, +} from '../../language/ast'; describe('Execute: Handles basic execution tasks', () => { it('throws if no document is provided', () => { @@ -1612,11 +1615,9 @@ describe('Execute: Handles basic execution tasks', () => { it('modifiedOutputType produces correct output types', () => { const type = new GraphQLList( - new GraphQLNonNull(new GraphQLList( - new GraphQLNonNull(new GraphQLList( - GraphQLInt - )) - )) + new GraphQLNonNull( + new GraphQLList(new GraphQLNonNull(new GraphQLList(GraphQLInt))), + ), ); const nullabilityNode: NullabilityModifierNode | SupportArrayNode = { @@ -1629,19 +1630,17 @@ describe('Execute: Handles basic execution tasks', () => { kind: Kind.LIST_NULLABILITY, element: { kind: Kind.REQUIRED_DESIGNATOR, - element: undefined - } - } - } - } + element: undefined, + }, + }, + }, + }, }; const outputType = modifiedOutputType(type, nullabilityNode); const expectedOutputType = new GraphQLList( new GraphQLList( - new GraphQLNonNull(new GraphQLList( - new GraphQLNonNull(GraphQLInt) - )), + new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(GraphQLInt))), ), ); diff --git a/src/language/__tests__/parser-test.ts b/src/language/__tests__/parser-test.ts index 35d9956c34..ea1f8c1eaf 100644 --- a/src/language/__tests__/parser-test.ts +++ b/src/language/__tests__/parser-test.ts @@ -229,7 +229,7 @@ describe('Parser', () => { query { requiredField! } - `) + `); expectJSON(result).toDeepEqual({ kind: Kind.DOCUMENT, @@ -263,7 +263,7 @@ describe('Parser', () => { element: undefined, loc: { start: 25, end: 24 }, }, - } + }, ], }, }, @@ -288,7 +288,7 @@ describe('Parser', () => { optionalField?! } `), - ).to.throw('Syntax Error: Expected Name, found \"!\".'); + ).to.throw('Syntax Error: Expected Name, found "!".'); expect(() => parse(` @@ -296,7 +296,7 @@ describe('Parser', () => { optionalField!? } `), - ).to.throw('Syntax Error: Expected Name, found \"?\".'); + ).to.throw('Syntax Error: Expected Name, found "?".'); }); it('parses required with alias', () => { @@ -418,8 +418,8 @@ describe('Parser', () => { element: { kind: Kind.REQUIRED_DESIGNATOR, loc: { start: 11, end: 11 }, - element: undefined - } + element: undefined, + }, }, selectionSet: undefined, }, @@ -469,8 +469,8 @@ describe('Parser', () => { element: { kind: Kind.OPTIONAL_DESIGNATOR, loc: { start: 11, end: 11 }, - element: undefined - } + element: undefined, + }, }, selectionSet: undefined, }, @@ -520,11 +520,11 @@ describe('Parser', () => { element: { kind: Kind.LIST_NULLABILITY, element: undefined, - loc: { start: 9, end: 11 } + loc: { start: 9, end: 11 }, }, loc: { start: 13, end: 12 }, }, - } + }, ], }, }, @@ -570,7 +570,7 @@ describe('Parser', () => { element: { kind: Kind.LIST_NULLABILITY, loc: { start: 9, end: 11 }, - element: undefined + element: undefined, }, loc: { start: 13, end: 12 }, }, @@ -634,8 +634,8 @@ describe('Parser', () => { element: { kind: Kind.OPTIONAL_DESIGNATOR, loc: { start: 13, end: 13 }, - element: undefined - } + element: undefined, + }, }, }, }, @@ -657,7 +657,7 @@ describe('Parser', () => { field[[] } `), - ).to.throw('Syntax Error: Expected \"]\", found \"}\".'); + ).to.throw('Syntax Error: Expected "]", found "}".'); expect(() => parse(` @@ -665,7 +665,7 @@ describe('Parser', () => { field[]] } `), - ).to.throw('Syntax Error: Expected Name, found \"]\".'); + ).to.throw('Syntax Error: Expected Name, found "]".'); expect(() => parse(` @@ -673,7 +673,7 @@ describe('Parser', () => { field] } `), - ).to.throw('Syntax Error: Expected Name, found \"]\".'); + ).to.throw('Syntax Error: Expected Name, found "]".'); expect(() => parse(` @@ -681,7 +681,7 @@ describe('Parser', () => { field[ } `), - ).to.throw('Syntax Error: Expected \"]\", found \"}\".'); + ).to.throw('Syntax Error: Expected "]", found "}".'); }); it('does not parse field with assorted invalid nullability designators', () => { @@ -691,7 +691,7 @@ describe('Parser', () => { field[][] } `), - ).to.throw('Syntax Error: Expected Name, found \"[\".'); + ).to.throw('Syntax Error: Expected Name, found "[".'); expect(() => parse(` @@ -699,7 +699,7 @@ describe('Parser', () => { field[!!] } `), - ).to.throw('Syntax Error: Expected \"]\", found \"!\".'); + ).to.throw('Syntax Error: Expected "]", found "!".'); expect(() => parse(` @@ -707,7 +707,7 @@ describe('Parser', () => { field[]?! } `), - ).to.throw('Syntax Error: Expected Name, found \"!\".'); + ).to.throw('Syntax Error: Expected Name, found "!".'); }); it('creates ast', () => { diff --git a/src/language/__tests__/printer-test.ts b/src/language/__tests__/printer-test.ts index 04a91c5e37..39068b77e1 100644 --- a/src/language/__tests__/printer-test.ts +++ b/src/language/__tests__/printer-test.ts @@ -13,7 +13,7 @@ describe('Printer: Query document', () => { const ast = { kind: Kind.FIELD, name: { kind: Kind.NAME, value: 'foo' }, - required: undefined + required: undefined, } as const; expect(print(ast)).to.equal('foo'); }); diff --git a/src/language/__tests__/visitor-test.ts b/src/language/__tests__/visitor-test.ts index bc34fe964c..7d0ca2d441 100644 --- a/src/language/__tests__/visitor-test.ts +++ b/src/language/__tests__/visitor-test.ts @@ -657,114 +657,114 @@ describe('Visitor', () => { ['enter', 'Field', 1, undefined], ['enter', 'Name', 'name', 'Field'], ['leave', 'Name', 'name', 'Field'], - ['enter', 'RequiredDesignator', 'required', "Field"], - ['leave', 'RequiredDesignator', 'required', "Field"], + ['enter', 'RequiredDesignator', 'required', 'Field'], + ['leave', 'RequiredDesignator', 'required', 'Field'], ['leave', 'Field', 1, undefined], ['enter', 'Field', 2, undefined], ['enter', 'Name', 'alias', 'Field'], ['leave', 'Name', 'alias', 'Field'], ['enter', 'Name', 'name', 'Field'], ['leave', 'Name', 'name', 'Field'], - ['enter', 'RequiredDesignator', 'required', "Field"], - ['leave', 'RequiredDesignator', 'required', "Field"], + ['enter', 'RequiredDesignator', 'required', 'Field'], + ['leave', 'RequiredDesignator', 'required', 'Field'], ['leave', 'Field', 2, undefined], ['enter', 'Field', 3, undefined], ['enter', 'Name', 'name', 'Field'], ['leave', 'Name', 'name', 'Field'], - ['enter', 'OptionalDesignator', 'required', "Field"], - ['leave', 'OptionalDesignator', 'required', "Field"], + ['enter', 'OptionalDesignator', 'required', 'Field'], + ['leave', 'OptionalDesignator', 'required', 'Field'], ['leave', 'Field', 3, undefined], ['enter', 'Field', 4, undefined], ['enter', 'Name', 'alias', 'Field'], ['leave', 'Name', 'alias', 'Field'], ['enter', 'Name', 'name', 'Field'], ['leave', 'Name', 'name', 'Field'], - ['enter', 'OptionalDesignator', 'required', "Field"], - ['leave', 'OptionalDesignator', 'required', "Field"], + ['enter', 'OptionalDesignator', 'required', 'Field'], + ['leave', 'OptionalDesignator', 'required', 'Field'], ['leave', 'Field', 4, undefined], ['enter', 'Field', 5, undefined], ['enter', 'Name', 'alias', 'Field'], ['leave', 'Name', 'alias', 'Field'], ['enter', 'Name', 'name', 'Field'], ['leave', 'Name', 'name', 'Field'], - ['enter', 'RequiredDesignator', 'required', "Field"], - ['enter', 'ListNullabilityDesignator', 'element', "RequiredDesignator"], - ['leave', 'ListNullabilityDesignator', 'element', "RequiredDesignator"], - ['leave', 'RequiredDesignator', 'required', "Field"], + ['enter', 'RequiredDesignator', 'required', 'Field'], + ['enter', 'ListNullabilityDesignator', 'element', 'RequiredDesignator'], + ['leave', 'ListNullabilityDesignator', 'element', 'RequiredDesignator'], + ['leave', 'RequiredDesignator', 'required', 'Field'], ['leave', 'Field', 5, undefined], ['enter', 'Field', 6, undefined], ['enter', 'Name', 'alias', 'Field'], ['leave', 'Name', 'alias', 'Field'], ['enter', 'Name', 'name', 'Field'], ['leave', 'Name', 'name', 'Field'], - ['enter', 'ListNullabilityDesignator', 'required', "Field"], - ['enter', 'RequiredDesignator', 'element', "ListNullabilityDesignator"], - ['leave', 'RequiredDesignator', 'element', "ListNullabilityDesignator"], - ['leave', 'ListNullabilityDesignator', 'required', "Field"], + ['enter', 'ListNullabilityDesignator', 'required', 'Field'], + ['enter', 'RequiredDesignator', 'element', 'ListNullabilityDesignator'], + ['leave', 'RequiredDesignator', 'element', 'ListNullabilityDesignator'], + ['leave', 'ListNullabilityDesignator', 'required', 'Field'], ['leave', 'Field', 6, undefined], ['enter', 'Field', 7, undefined], ['enter', 'Name', 'alias', 'Field'], ['leave', 'Name', 'alias', 'Field'], ['enter', 'Name', 'name', 'Field'], ['leave', 'Name', 'name', 'Field'], - ['enter', 'RequiredDesignator', 'required', "Field"], - ['enter', 'ListNullabilityDesignator', 'element', "RequiredDesignator"], - ['enter', 'RequiredDesignator', 'element', "ListNullabilityDesignator"], - ['leave', 'RequiredDesignator', 'element', "ListNullabilityDesignator"], - ['leave', 'ListNullabilityDesignator', 'element', "RequiredDesignator"], - ['leave', 'RequiredDesignator', 'required', "Field"], + ['enter', 'RequiredDesignator', 'required', 'Field'], + ['enter', 'ListNullabilityDesignator', 'element', 'RequiredDesignator'], + ['enter', 'RequiredDesignator', 'element', 'ListNullabilityDesignator'], + ['leave', 'RequiredDesignator', 'element', 'ListNullabilityDesignator'], + ['leave', 'ListNullabilityDesignator', 'element', 'RequiredDesignator'], + ['leave', 'RequiredDesignator', 'required', 'Field'], ['leave', 'Field', 7, undefined], ['enter', 'Field', 8, undefined], ['enter', 'Name', 'alias', 'Field'], ['leave', 'Name', 'alias', 'Field'], ['enter', 'Name', 'name', 'Field'], ['leave', 'Name', 'name', 'Field'], - ['enter', 'OptionalDesignator', 'required', "Field"], - ['enter', 'ListNullabilityDesignator', 'element', "OptionalDesignator"], - ['leave', 'ListNullabilityDesignator', 'element', "OptionalDesignator"], - ['leave', 'OptionalDesignator', 'required', "Field"], + ['enter', 'OptionalDesignator', 'required', 'Field'], + ['enter', 'ListNullabilityDesignator', 'element', 'OptionalDesignator'], + ['leave', 'ListNullabilityDesignator', 'element', 'OptionalDesignator'], + ['leave', 'OptionalDesignator', 'required', 'Field'], ['leave', 'Field', 8, undefined], ['enter', 'Field', 9, undefined], ['enter', 'Name', 'alias', 'Field'], ['leave', 'Name', 'alias', 'Field'], ['enter', 'Name', 'name', 'Field'], ['leave', 'Name', 'name', 'Field'], - ['enter', 'ListNullabilityDesignator', 'required', "Field"], - ['enter', 'OptionalDesignator', 'element', "ListNullabilityDesignator"], - ['leave', 'OptionalDesignator', 'element', "ListNullabilityDesignator"], - ['leave', 'ListNullabilityDesignator', 'required', "Field"], + ['enter', 'ListNullabilityDesignator', 'required', 'Field'], + ['enter', 'OptionalDesignator', 'element', 'ListNullabilityDesignator'], + ['leave', 'OptionalDesignator', 'element', 'ListNullabilityDesignator'], + ['leave', 'ListNullabilityDesignator', 'required', 'Field'], ['leave', 'Field', 9, undefined], ['enter', 'Field', 10, undefined], ['enter', 'Name', 'alias', 'Field'], ['leave', 'Name', 'alias', 'Field'], ['enter', 'Name', 'name', 'Field'], ['leave', 'Name', 'name', 'Field'], - ['enter', 'OptionalDesignator', 'required', "Field"], - ['enter', 'ListNullabilityDesignator', 'element', "OptionalDesignator"], - ['enter', 'OptionalDesignator', 'element', "ListNullabilityDesignator"], - ['leave', 'OptionalDesignator', 'element', "ListNullabilityDesignator"], - ['leave', 'ListNullabilityDesignator', 'element', "OptionalDesignator"], - ['leave', 'OptionalDesignator', 'required', "Field"], + ['enter', 'OptionalDesignator', 'required', 'Field'], + ['enter', 'ListNullabilityDesignator', 'element', 'OptionalDesignator'], + ['enter', 'OptionalDesignator', 'element', 'ListNullabilityDesignator'], + ['leave', 'OptionalDesignator', 'element', 'ListNullabilityDesignator'], + ['leave', 'ListNullabilityDesignator', 'element', 'OptionalDesignator'], + ['leave', 'OptionalDesignator', 'required', 'Field'], ['leave', 'Field', 10, undefined], ['enter', 'Field', 11, undefined], ['enter', 'Name', 'alias', 'Field'], ['leave', 'Name', 'alias', 'Field'], ['enter', 'Name', 'name', 'Field'], ['leave', 'Name', 'name', 'Field'], - ['enter', 'RequiredDesignator', 'required', "Field"], - ['enter', 'ListNullabilityDesignator', 'element', "RequiredDesignator"], - ['enter', 'RequiredDesignator', 'element', "ListNullabilityDesignator"], - ['enter', 'ListNullabilityDesignator', 'element', "RequiredDesignator"], - ['enter', 'RequiredDesignator', 'element', "ListNullabilityDesignator"], - ['enter', 'ListNullabilityDesignator', 'element', "RequiredDesignator"], - ['enter', 'RequiredDesignator', 'element', "ListNullabilityDesignator"], - ['leave', 'RequiredDesignator', 'element', "ListNullabilityDesignator"], - ['leave', 'ListNullabilityDesignator', 'element', "RequiredDesignator"], - ['leave', 'RequiredDesignator', 'element', "ListNullabilityDesignator"], - ['leave', 'ListNullabilityDesignator', 'element', "RequiredDesignator"], - ['leave', 'RequiredDesignator', 'element', "ListNullabilityDesignator"], - ['leave', 'ListNullabilityDesignator', 'element', "RequiredDesignator"], - ['leave', 'RequiredDesignator', 'required', "Field"], + ['enter', 'RequiredDesignator', 'required', 'Field'], + ['enter', 'ListNullabilityDesignator', 'element', 'RequiredDesignator'], + ['enter', 'RequiredDesignator', 'element', 'ListNullabilityDesignator'], + ['enter', 'ListNullabilityDesignator', 'element', 'RequiredDesignator'], + ['enter', 'RequiredDesignator', 'element', 'ListNullabilityDesignator'], + ['enter', 'ListNullabilityDesignator', 'element', 'RequiredDesignator'], + ['enter', 'RequiredDesignator', 'element', 'ListNullabilityDesignator'], + ['leave', 'RequiredDesignator', 'element', 'ListNullabilityDesignator'], + ['leave', 'ListNullabilityDesignator', 'element', 'RequiredDesignator'], + ['leave', 'RequiredDesignator', 'element', 'ListNullabilityDesignator'], + ['leave', 'ListNullabilityDesignator', 'element', 'RequiredDesignator'], + ['leave', 'RequiredDesignator', 'element', 'ListNullabilityDesignator'], + ['leave', 'ListNullabilityDesignator', 'element', 'RequiredDesignator'], + ['leave', 'RequiredDesignator', 'required', 'Field'], ['leave', 'Field', 11, undefined], ['leave', 'SelectionSet', 'selectionSet', 'InlineFragment'], ['leave', 'InlineFragment', 1, undefined], diff --git a/src/language/ast.ts b/src/language/ast.ts index 7b69762579..635e802d6f 100644 --- a/src/language/ast.ts +++ b/src/language/ast.ts @@ -1,4 +1,3 @@ -import { ASTNode } from '.'; import type { Kind } from './kinds'; import type { Source } from './source'; @@ -211,7 +210,14 @@ export const QueryDocumentKeys: { VariableDefinition: ['variable', 'type', 'defaultValue', 'directives'], Variable: ['name'], SelectionSet: ['selections'], - Field: ['alias', 'name', 'arguments', 'directives', 'selectionSet', 'required'], + Field: [ + 'alias', + 'name', + 'arguments', + 'directives', + 'selectionSet', + 'required', + ], ListNullabilityDesignator: ['element'], RequiredDesignator: ['element'], OptionalDesignator: ['element'], @@ -380,11 +386,13 @@ export interface RequiredModifierNode { export interface OptionalModifierNode { readonly kind: Kind.OPTIONAL_DESIGNATOR; readonly loc?: Location; - readonly element?: SupportArrayNode + readonly element?: SupportArrayNode; } // modifiers can be !, ? or [] -export type NullabilityModifierNode = RequiredModifierNode | OptionalModifierNode; +export type NullabilityModifierNode = + | RequiredModifierNode + | OptionalModifierNode; export interface SupportArrayNode { readonly kind: Kind.LIST_NULLABILITY; diff --git a/src/language/parser.ts b/src/language/parser.ts index c3cd1102e3..1b66712aa2 100644 --- a/src/language/parser.ts +++ b/src/language/parser.ts @@ -67,10 +67,7 @@ import type { RequiredModifierNode, } from './ast'; -import { - Location, - OperationTypeNode -} from './ast'; +import { Location, OperationTypeNode } from './ast'; import { Kind } from './kinds'; import { Source, isSource } from './source'; @@ -456,24 +453,26 @@ export class Parser { * - ? * */ - parseRequiredStatus(): NullabilityModifierNode | SupportArrayNode | undefined { - let list = this.parseListNullability(); - let nullabilityStatus = this.parseNullabilityModifierNode(list); + parseRequiredStatus(): + | NullabilityModifierNode + | SupportArrayNode + | undefined { + const list = this.parseListNullability(); + const nullabilityStatus = this.parseNullabilityModifierNode(list); return nullabilityStatus ?? list; } parseListNullability(): SupportArrayNode | undefined { - let start = this._lexer.token; - let child: NullabilityModifierNode | SupportArrayNode | undefined; + const start = this._lexer.token; if (this.expectOptionalToken(TokenKind.BRACKET_L)) { - child = this.parseRequiredStatus(); + const child = this.parseRequiredStatus(); this.expectToken(TokenKind.BRACKET_R); return this.node(start, { kind: Kind.LIST_NULLABILITY, - element: child + element: child, }); } } @@ -484,24 +483,33 @@ export class Parser { * - ? * */ - parseNullabilityModifierNode(childElement?: SupportArrayNode): NullabilityModifierNode | undefined { - return this.parseRequiredModifierNode(childElement) ?? this.parseOptionalModifierNode(childElement) + parseNullabilityModifierNode( + childElement?: SupportArrayNode, + ): NullabilityModifierNode | undefined { + return ( + this.parseRequiredModifierNode(childElement) ?? + this.parseOptionalModifierNode(childElement) + ); } - parseRequiredModifierNode(childElement?: SupportArrayNode): RequiredModifierNode | undefined { + parseRequiredModifierNode( + childElement?: SupportArrayNode, + ): RequiredModifierNode | undefined { if (this.expectOptionalToken(TokenKind.BANG)) { return this.node(this._lexer.token, { kind: Kind.REQUIRED_DESIGNATOR, - element: childElement + element: childElement, }); } } - parseOptionalModifierNode(childElement?: SupportArrayNode): OptionalModifierNode | undefined { + parseOptionalModifierNode( + childElement?: SupportArrayNode, + ): OptionalModifierNode | undefined { if (this.expectOptionalToken(TokenKind.QUESTION_MARK)) { return this.node(this._lexer.token, { kind: Kind.OPTIONAL_DESIGNATOR, - element: childElement + element: childElement, }); } } diff --git a/src/language/printer.ts b/src/language/printer.ts index 1eafb93ef8..fff2caf7a5 100644 --- a/src/language/printer.ts +++ b/src/language/printer.ts @@ -65,8 +65,7 @@ const printDocASTReducer: ASTReducer = { }) { const prefix = join([wrap('', alias, ': '), name, required], ''); - let argsLine = - prefix + wrap('(', join(args, ', '), ')'); + let argsLine = prefix + wrap('(', join(args, ', '), ')'); if (argsLine.length > MAX_LINE_LENGTH) { argsLine = prefix + wrap('(\n', indent(join(args, '\n')), '\n)'); @@ -77,29 +76,22 @@ const printDocASTReducer: ASTReducer = { }, RequiredDesignator: { - leave({ - element - }) { + leave({ element }) { return (element ?? '') + '!'; - } + }, }, OptionalDesignator: { - leave({ - element - }) { + leave({ element }) { return (element ?? '') + '?'; - } + }, }, ListNullabilityDesignator: { - leave({ - element, - }) { + leave({ element }) { return '[' + (element ?? '') + ']'; - } + }, }, - Argument: { leave: ({ name, value }) => name + ': ' + value }, diff --git a/src/utilities/__tests__/TypeInfo-test.ts b/src/utilities/__tests__/TypeInfo-test.ts index 0442799214..fd54bf7dc7 100644 --- a/src/utilities/__tests__/TypeInfo-test.ts +++ b/src/utilities/__tests__/TypeInfo-test.ts @@ -268,7 +268,7 @@ describe('visitWithTypeInfo', () => { { kind: 'Field', name: { kind: 'Name', value: '__typename' }, - required: undefined + required: undefined, }, ], }, diff --git a/src/utilities/applyRequiredStatus.ts b/src/utilities/applyRequiredStatus.ts index b21cef3b1e..db4030e169 100644 --- a/src/utilities/applyRequiredStatus.ts +++ b/src/utilities/applyRequiredStatus.ts @@ -4,10 +4,15 @@ import { GraphQLNonNull, isNonNullType, assertListType, - GraphQLList + GraphQLList, } from '../type/definition'; -import type { SupportArrayNode, NullabilityModifierNode } from '../language/ast'; -import { ASTReducer, visit } from '../language/visitor'; +import type { + SupportArrayNode, + NullabilityModifierNode, +} from '../language/ast'; +import type { ASTReducer } from '../language/visitor'; +import { visit } from '../language/visitor'; +import { GraphQLError } from '../error/GraphQLError'; /** * Implements the "Accounting For Client Controlled Nullability Designators" @@ -19,58 +24,72 @@ export function modifiedOutputType( type: GraphQLOutputType, nullabilityNode?: SupportArrayNode | NullabilityModifierNode, ): GraphQLOutputType { - let typeStack: [GraphQLOutputType] = [type]; + const typeStack: [GraphQLOutputType] = [type]; const applyStatusReducer: ASTReducer = { RequiredDesignator: { - leave({ - element - }) { - if (element){ + leave({ element }) { + if (element) { return new GraphQLNonNull(getNullableType(element)); - } else { - return new GraphQLNonNull(getNullableType(typeStack.pop()!)); } + const nextType = typeStack.pop(); + + if (!nextType) { + throw new GraphQLError( + 'List nullability designator is too deep.', + nullabilityNode, + ); + } + return new GraphQLNonNull(getNullableType(nextType)); }, }, OptionalDesignator: { - leave({ - element - }) { + leave({ element }) { if (element) { return getNullableType(element); - } else { - return getNullableType(typeStack.pop()!); } - } + const nextType = typeStack.pop(); + if (!nextType) { + throw new GraphQLError( + 'List nullability designator is too deep.', + nullabilityNode, + ); + } + + return getNullableType(nextType); + }, }, ListNullabilityDesignator: { enter() { - let list = assertListType(getNullableType(typeStack.at(-1))); - let elementType = list.ofType as GraphQLOutputType; + const list = assertListType(getNullableType(typeStack.at(-1))); + const elementType = list.ofType as GraphQLOutputType; typeStack.push(elementType); }, - leave({ - element - }) { - let listType = typeStack.pop()!; - let isRequired = isNonNullType(listType); + leave({ element }) { + const listType = typeStack.pop(); + if (!listType) { + throw new GraphQLError( + 'List nullability designator is too deep.', + nullabilityNode, + ); + } + const isRequired = isNonNullType(listType); if (element) { - return isRequired + return isRequired ? new GraphQLNonNull(new GraphQLList(element)) : new GraphQLList(element); - } else { - return isRequired - ? new GraphQLNonNull(new GraphQLList(listType)) - : new GraphQLList(listType); } - } - } - } + + return isRequired + ? new GraphQLNonNull(new GraphQLList(listType)) + : new GraphQLList(listType); + }, + }, + }; if (nullabilityNode) { return visit(nullabilityNode, applyStatusReducer); - } else { - return type; } + + return type; } From 2e3989cf83d74ab12f6dba2409ad68c101c55af4 Mon Sep 17 00:00:00 2001 From: twof Date: Thu, 2 Dec 2021 01:01:11 -0800 Subject: [PATCH 58/64] requiring list depth to match type --- src/execution/__tests__/executor-test.ts | 81 ++++++++++++++----- src/utilities/applyRequiredStatus.ts | 50 ++++++++---- ...StatusOnFieldMatchesDefinitionRule-test.ts | 29 +++++-- ...uiredStatusOnFieldMatchesDefinitionRule.ts | 18 +---- 4 files changed, 124 insertions(+), 54 deletions(-) diff --git a/src/execution/__tests__/executor-test.ts b/src/execution/__tests__/executor-test.ts index c9367f75e8..261f09e58e 100644 --- a/src/execution/__tests__/executor-test.ts +++ b/src/execution/__tests__/executor-test.ts @@ -1613,36 +1613,81 @@ describe('Execute: Handles basic execution tasks', () => { }); }); - it('modifiedOutputType produces correct output types', () => { - const type = new GraphQLList( - new GraphQLNonNull( - new GraphQLList(new GraphQLNonNull(new GraphQLList(GraphQLInt))), - ), - ); + it('modifiedOutputType produces correct output types with no overrides', () => { + // [[[!]]!]! + const type = new GraphQLNonNull(new GraphQLList( + new GraphQLNonNull(new GraphQLList( + new GraphQLList( + new GraphQLNonNull(GraphQLInt) + ), + )), + )); + // [[[]]] const nullabilityNode: NullabilityModifierNode | SupportArrayNode = { kind: Kind.LIST_NULLABILITY, element: { - kind: Kind.OPTIONAL_DESIGNATOR, + kind: Kind.LIST_NULLABILITY, element: { kind: Kind.LIST_NULLABILITY, - element: { + element: undefined, + }, + } + }; + + const outputType = modifiedOutputType(type, nullabilityNode); + // [[[!]]!]! + const expectedOutputType = new GraphQLNonNull(new GraphQLList( + new GraphQLNonNull(new GraphQLList( + new GraphQLList( + new GraphQLNonNull(GraphQLInt) + ), + )), + )); + + expect(outputType).to.deep.equal(expectedOutputType); + }); + + it('modifiedOutputType produces correct output types with overrides', () => { + // [[[!]]!]! + const type = new GraphQLNonNull(new GraphQLList( + new GraphQLNonNull(new GraphQLList( + new GraphQLList( + new GraphQLNonNull(GraphQLInt) + ), + )), + )); + + // [[[]]] + const nullabilityNode: NullabilityModifierNode | SupportArrayNode = { + // kind: Kind.REQUIRED_DESIGNATOR, + // element: { + kind: Kind.LIST_NULLABILITY, + element: { + // kind: Kind.REQUIRED_DESIGNATOR, + // element: { kind: Kind.LIST_NULLABILITY, element: { - kind: Kind.REQUIRED_DESIGNATOR, - element: undefined, + // kind: Kind.REQUIRED_DESIGNATOR, + // element: { + kind: Kind.LIST_NULLABILITY, + element: undefined, + // } }, - }, - }, - }, + // }, + } + // }, }; const outputType = modifiedOutputType(type, nullabilityNode); - const expectedOutputType = new GraphQLList( - new GraphQLList( - new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(GraphQLInt))), - ), - ); + // [[[!]]!]! + const expectedOutputType = new GraphQLNonNull(new GraphQLList( + new GraphQLNonNull(new GraphQLList( + new GraphQLList( + new GraphQLNonNull(GraphQLInt) + ), + )), + )); expect(outputType).to.deep.equal(expectedOutputType); }); diff --git a/src/utilities/applyRequiredStatus.ts b/src/utilities/applyRequiredStatus.ts index db4030e169..56799ad128 100644 --- a/src/utilities/applyRequiredStatus.ts +++ b/src/utilities/applyRequiredStatus.ts @@ -1,4 +1,4 @@ -import type { GraphQLOutputType } from '../type/definition'; +import { GraphQLOutputType, isListType } from '../type/definition'; import { getNullableType, GraphQLNonNull, @@ -6,10 +6,7 @@ import { assertListType, GraphQLList, } from '../type/definition'; -import type { - SupportArrayNode, - NullabilityModifierNode, -} from '../language/ast'; +import type { SupportArrayNode, NullabilityModifierNode } from '../language/ast'; import type { ASTReducer } from '../language/visitor'; import { visit } from '../language/visitor'; import { GraphQLError } from '../error/GraphQLError'; @@ -32,14 +29,17 @@ export function modifiedOutputType( if (element) { return new GraphQLNonNull(getNullableType(element)); } + + // We're working with the inner-most type const nextType = typeStack.pop(); if (!nextType) { throw new GraphQLError( - 'List nullability designator is too deep.', + 'List nullability modifier is too deep.', nullabilityNode, ); } + return new GraphQLNonNull(getNullableType(nextType)); }, }, @@ -48,10 +48,13 @@ export function modifiedOutputType( if (element) { return getNullableType(element); } + + // We're working with the inner-most type const nextType = typeStack.pop(); + if (!nextType) { throw new GraphQLError( - 'List nullability designator is too deep.', + 'List nullability modifier is too deep.', nullabilityNode, ); } @@ -61,15 +64,26 @@ export function modifiedOutputType( }, ListNullabilityDesignator: { enter() { - const list = assertListType(getNullableType(typeStack.at(-1))); - const elementType = list.ofType as GraphQLOutputType; - typeStack.push(elementType); + try { + const list = assertListType(getNullableType(typeStack.at(-1))); + const elementType = list.ofType as GraphQLOutputType; + typeStack.push(elementType); + } catch (error) { + // assertListType will throw an error if we try to dig into the type and it's not a list + throw new GraphQLError( + `${error} Was the list nullability modifier's depth more than the field types?`, + nullabilityNode + ); + } }, leave({ element }) { - const listType = typeStack.pop(); + let listType = typeStack.pop(); + // Skip to the inner-most list + if (!isListType(getNullableType(listType))) listType = typeStack.pop(); + if (!listType) { throw new GraphQLError( - 'List nullability designator is too deep.', + 'List nullability modifier is too deep.', nullabilityNode, ); } @@ -80,14 +94,22 @@ export function modifiedOutputType( : new GraphQLList(element); } + // We're working with the inner-most list return isRequired - ? new GraphQLNonNull(new GraphQLList(listType)) - : new GraphQLList(listType); + ? new GraphQLNonNull(listType) + : listType; }, }, }; if (nullabilityNode) { + // modifiers must be exactly the same depth as the field type + if (typeStack.length > 0) { + throw new GraphQLError( + 'List nullability modifier is too shallow.', + nullabilityNode, + ); + } return visit(nullabilityNode, applyStatusReducer); } diff --git a/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts b/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts index 66fbb1fa81..98fef9094f 100644 --- a/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts +++ b/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts @@ -22,7 +22,7 @@ const testSchema = buildSchema(` type Lists { nonList: Int list: [Int] - mixedThreeDList: [[[Int]!]!] + mixedThreeDList: [[[Int]]] } type Query { @@ -40,24 +40,39 @@ describe('Validate: Field uses correct list depth', () => { } `); }); + // notAList: nonList[!] + // mixedThreeDList[[!]!]! it('reports errors when list depth is too high', () => { expectErrors(` fragment listFragment on Lists { - list[[]] notAList: nonList[!] - mixedThreeDList[[!]!]! + list[[]] } `).toDeepEqual([ { message: - 'Syntax Error: Something is wrong with the nullability designator on list. The type for that field in the schema is [Int] Is the correct list depth being used?', - locations: [{ line: 3, column: 9 }], + "Error: Expected Int to be a GraphQL List type. Was the list nullability modifier's depth more than the field types?", + locations: [{ line: 3, column: 26 }], + }, + { + message: + "Error: Expected Int to be a GraphQL List type. Was the list nullability modifier's depth more than the field types?", + locations: [{ line: 4, column: 13 }], }, + ]); + }); +//mixedThreeDList[[[!]!]!]! + it('reports errors when list depth is too low', () => { + expectErrors(` + fragment listFragment on Lists { + mixedThreeDList[[]!]! + } + `).toDeepEqual([ { message: - 'Syntax Error: Something is wrong with the nullability designator on notAList. The type for that field in the schema is Int Is the correct list depth being used?', - locations: [{ line: 4, column: 9 }], + 'List nullability modifier is too shallow.', + locations: [{ line: 4, column: 7 }], }, ]); }); diff --git a/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts b/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts index 0a98c66bc2..b88ff8ca76 100644 --- a/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts +++ b/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts @@ -21,24 +21,12 @@ export function RequiredStatusOnFieldMatchesDefinitionRule( ): ASTVisitor { return { Field(node: FieldNode) { - if (context.getFieldDef()) { - const fieldDef = context.getFieldDef() as GraphQLField< - unknown, - unknown - >; + const fieldDef = context.getFieldDef(); + if (fieldDef) { try { modifiedOutputType(fieldDef.type, node.required); } catch (error) { - context.reportError( - new GraphQLError( - `Syntax Error: Something is wrong with the nullability designator on ${ - node.alias?.value ?? node.name.value - }. The type for that field in the schema is ${ - fieldDef.type - } Is the correct list depth being used?`, - node, - ), - ); + context.reportError(error); } } }, From 7715d26ebaa69112bfe89372b355acb7dc823f0d Mon Sep 17 00:00:00 2001 From: twof Date: Thu, 2 Dec 2021 01:21:53 -0800 Subject: [PATCH 59/64] npm test passes --- src/execution/__tests__/executor-test.ts | 72 +++++++++---------- src/utilities/applyRequiredStatus.ts | 27 ++++--- ...StatusOnFieldMatchesDefinitionRule-test.ts | 7 +- ...uiredStatusOnFieldMatchesDefinitionRule.ts | 4 -- 4 files changed, 54 insertions(+), 56 deletions(-) diff --git a/src/execution/__tests__/executor-test.ts b/src/execution/__tests__/executor-test.ts index 261f09e58e..5732007861 100644 --- a/src/execution/__tests__/executor-test.ts +++ b/src/execution/__tests__/executor-test.ts @@ -1615,13 +1615,13 @@ describe('Execute: Handles basic execution tasks', () => { it('modifiedOutputType produces correct output types with no overrides', () => { // [[[!]]!]! - const type = new GraphQLNonNull(new GraphQLList( - new GraphQLNonNull(new GraphQLList( - new GraphQLList( - new GraphQLNonNull(GraphQLInt) + const type = new GraphQLNonNull( + new GraphQLList( + new GraphQLNonNull( + new GraphQLList(new GraphQLList(new GraphQLNonNull(GraphQLInt))), ), - )), - )); + ), + ); // [[[]]] const nullabilityNode: NullabilityModifierNode | SupportArrayNode = { @@ -1632,62 +1632,62 @@ describe('Execute: Handles basic execution tasks', () => { kind: Kind.LIST_NULLABILITY, element: undefined, }, - } + }, }; const outputType = modifiedOutputType(type, nullabilityNode); // [[[!]]!]! - const expectedOutputType = new GraphQLNonNull(new GraphQLList( - new GraphQLNonNull(new GraphQLList( - new GraphQLList( - new GraphQLNonNull(GraphQLInt) + const expectedOutputType = new GraphQLNonNull( + new GraphQLList( + new GraphQLNonNull( + new GraphQLList(new GraphQLList(new GraphQLNonNull(GraphQLInt))), ), - )), - )); + ), + ); expect(outputType).to.deep.equal(expectedOutputType); }); it('modifiedOutputType produces correct output types with overrides', () => { // [[[!]]!]! - const type = new GraphQLNonNull(new GraphQLList( - new GraphQLNonNull(new GraphQLList( - new GraphQLList( - new GraphQLNonNull(GraphQLInt) + const type = new GraphQLNonNull( + new GraphQLList( + new GraphQLNonNull( + new GraphQLList(new GraphQLList(new GraphQLNonNull(GraphQLInt))), ), - )), - )); + ), + ); // [[[]]] const nullabilityNode: NullabilityModifierNode | SupportArrayNode = { // kind: Kind.REQUIRED_DESIGNATOR, // element: { + kind: Kind.LIST_NULLABILITY, + element: { + // kind: Kind.REQUIRED_DESIGNATOR, + // element: { kind: Kind.LIST_NULLABILITY, element: { // kind: Kind.REQUIRED_DESIGNATOR, - // element: { - kind: Kind.LIST_NULLABILITY, - element: { - // kind: Kind.REQUIRED_DESIGNATOR, - // element: { - kind: Kind.LIST_NULLABILITY, - element: undefined, - // } - }, - // }, - } + // element: { + kind: Kind.LIST_NULLABILITY, + element: undefined, + // } + }, + // }, + }, // }, }; const outputType = modifiedOutputType(type, nullabilityNode); // [[[!]]!]! - const expectedOutputType = new GraphQLNonNull(new GraphQLList( - new GraphQLNonNull(new GraphQLList( - new GraphQLList( - new GraphQLNonNull(GraphQLInt) + const expectedOutputType = new GraphQLNonNull( + new GraphQLList( + new GraphQLNonNull( + new GraphQLList(new GraphQLList(new GraphQLNonNull(GraphQLInt))), ), - )), - )); + ), + ); expect(outputType).to.deep.equal(expectedOutputType); }); diff --git a/src/utilities/applyRequiredStatus.ts b/src/utilities/applyRequiredStatus.ts index 56799ad128..fb8201e7a2 100644 --- a/src/utilities/applyRequiredStatus.ts +++ b/src/utilities/applyRequiredStatus.ts @@ -1,12 +1,16 @@ -import { GraphQLOutputType, isListType } from '../type/definition'; +import type { GraphQLOutputType } from '../type/definition'; import { getNullableType, GraphQLNonNull, isNonNullType, assertListType, GraphQLList, + isListType, } from '../type/definition'; -import type { SupportArrayNode, NullabilityModifierNode } from '../language/ast'; +import type { + SupportArrayNode, + NullabilityModifierNode, +} from '../language/ast'; import type { ASTReducer } from '../language/visitor'; import { visit } from '../language/visitor'; import { GraphQLError } from '../error/GraphQLError'; @@ -39,7 +43,7 @@ export function modifiedOutputType( nullabilityNode, ); } - + return new GraphQLNonNull(getNullableType(nextType)); }, }, @@ -51,7 +55,7 @@ export function modifiedOutputType( // We're working with the inner-most type const nextType = typeStack.pop(); - + if (!nextType) { throw new GraphQLError( 'List nullability modifier is too deep.', @@ -72,15 +76,17 @@ export function modifiedOutputType( // assertListType will throw an error if we try to dig into the type and it's not a list throw new GraphQLError( `${error} Was the list nullability modifier's depth more than the field types?`, - nullabilityNode + nullabilityNode, ); } }, leave({ element }) { let listType = typeStack.pop(); // Skip to the inner-most list - if (!isListType(getNullableType(listType))) listType = typeStack.pop(); - + if (!isListType(getNullableType(listType))) { + listType = typeStack.pop(); + } + if (!listType) { throw new GraphQLError( 'List nullability modifier is too deep.', @@ -95,14 +101,13 @@ export function modifiedOutputType( } // We're working with the inner-most list - return isRequired - ? new GraphQLNonNull(listType) - : listType; + return isRequired ? new GraphQLNonNull(listType) : listType; }, }, }; if (nullabilityNode) { + const modified = visit(nullabilityNode, applyStatusReducer); // modifiers must be exactly the same depth as the field type if (typeStack.length > 0) { throw new GraphQLError( @@ -110,7 +115,7 @@ export function modifiedOutputType( nullabilityNode, ); } - return visit(nullabilityNode, applyStatusReducer); + return modified; } return type; diff --git a/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts b/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts index 98fef9094f..548a030d75 100644 --- a/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts +++ b/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts @@ -40,8 +40,6 @@ describe('Validate: Field uses correct list depth', () => { } `); }); - // notAList: nonList[!] - // mixedThreeDList[[!]!]! it('reports errors when list depth is too high', () => { expectErrors(` @@ -62,7 +60,7 @@ describe('Validate: Field uses correct list depth', () => { }, ]); }); -//mixedThreeDList[[[!]!]!]! + it('reports errors when list depth is too low', () => { expectErrors(` fragment listFragment on Lists { @@ -70,8 +68,7 @@ describe('Validate: Field uses correct list depth', () => { } `).toDeepEqual([ { - message: - 'List nullability modifier is too shallow.', + message: 'List nullability modifier is too shallow.', locations: [{ line: 4, column: 7 }], }, ]); diff --git a/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts b/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts index b88ff8ca76..a047b78613 100644 --- a/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts +++ b/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts @@ -1,10 +1,6 @@ -import { GraphQLError } from '../../error/GraphQLError'; - import type { FieldNode } from '../../language/ast'; import type { ASTVisitor } from '../../language/visitor'; -import type { GraphQLField } from '../../type/definition'; - import type { ValidationContext } from '../ValidationContext'; import { modifiedOutputType } from '../../utilities/applyRequiredStatus'; From d490d5ba8d07aa387e46a17637c3a9f427e2bf77 Mon Sep 17 00:00:00 2001 From: twof Date: Mon, 6 Dec 2021 21:37:20 -0800 Subject: [PATCH 60/64] remove node16-only api --- src/utilities/applyRequiredStatus.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utilities/applyRequiredStatus.ts b/src/utilities/applyRequiredStatus.ts index fb8201e7a2..58c317d759 100644 --- a/src/utilities/applyRequiredStatus.ts +++ b/src/utilities/applyRequiredStatus.ts @@ -69,7 +69,7 @@ export function modifiedOutputType( ListNullabilityDesignator: { enter() { try { - const list = assertListType(getNullableType(typeStack.at(-1))); + const list = assertListType(getNullableType(typeStack[typeStack.length - 1])); const elementType = list.ofType as GraphQLOutputType; typeStack.push(elementType); } catch (error) { From 6e67e6b2e619374a00953ae66fbce33721017187 Mon Sep 17 00:00:00 2001 From: twof Date: Mon, 6 Dec 2021 22:35:38 -0800 Subject: [PATCH 61/64] failing test-case found --- src/utilities/applyRequiredStatus.ts | 45 +++++++------------ ...StatusOnFieldMatchesDefinitionRule-test.ts | 15 ++++--- 2 files changed, 25 insertions(+), 35 deletions(-) diff --git a/src/utilities/applyRequiredStatus.ts b/src/utilities/applyRequiredStatus.ts index 58c317d759..8952f81f50 100644 --- a/src/utilities/applyRequiredStatus.ts +++ b/src/utilities/applyRequiredStatus.ts @@ -27,6 +27,14 @@ export function modifiedOutputType( ): GraphQLOutputType { const typeStack: [GraphQLOutputType] = [type]; + while (isListType(getNullableType(typeStack[typeStack.length - 1]))) { + const list = assertListType( + getNullableType(typeStack[typeStack.length - 1]), + ); + const elementType = list.ofType as GraphQLOutputType; + typeStack.push(elementType); + } + const applyStatusReducer: ASTReducer = { RequiredDesignator: { leave({ element }) { @@ -37,14 +45,9 @@ export function modifiedOutputType( // We're working with the inner-most type const nextType = typeStack.pop(); - if (!nextType) { - throw new GraphQLError( - 'List nullability modifier is too deep.', - nullabilityNode, - ); - } - - return new GraphQLNonNull(getNullableType(nextType)); + // There's no way for nextType to be null if both type and nullabilityNode are valid + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return new GraphQLNonNull(getNullableType(nextType!)); }, }, OptionalDesignator: { @@ -56,30 +59,12 @@ export function modifiedOutputType( // We're working with the inner-most type const nextType = typeStack.pop(); - if (!nextType) { - throw new GraphQLError( - 'List nullability modifier is too deep.', - nullabilityNode, - ); - } - - return getNullableType(nextType); + // There's no way for nextType to be null if both type and nullabilityNode are valid + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return getNullableType(nextType!); }, }, ListNullabilityDesignator: { - enter() { - try { - const list = assertListType(getNullableType(typeStack[typeStack.length - 1])); - const elementType = list.ofType as GraphQLOutputType; - typeStack.push(elementType); - } catch (error) { - // assertListType will throw an error if we try to dig into the type and it's not a list - throw new GraphQLError( - `${error} Was the list nullability modifier's depth more than the field types?`, - nullabilityNode, - ); - } - }, leave({ element }) { let listType = typeStack.pop(); // Skip to the inner-most list @@ -101,7 +86,7 @@ export function modifiedOutputType( } // We're working with the inner-most list - return isRequired ? new GraphQLNonNull(listType) : listType; + return listType; }, }, }; diff --git a/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts b/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts index 548a030d75..f76b96d339 100644 --- a/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts +++ b/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts @@ -22,6 +22,7 @@ const testSchema = buildSchema(` type Lists { nonList: Int list: [Int] + requiredList: [Int]! mixedThreeDList: [[[Int]]] } @@ -37,6 +38,7 @@ describe('Validate: Field uses correct list depth', () => { list[!] nonList! mixedThreeDList[[[!]!]!]! + requiredList[] } `); }); @@ -49,13 +51,11 @@ describe('Validate: Field uses correct list depth', () => { } `).toDeepEqual([ { - message: - "Error: Expected Int to be a GraphQL List type. Was the list nullability modifier's depth more than the field types?", + message: 'List nullability modifier is too deep.', locations: [{ line: 3, column: 26 }], }, { - message: - "Error: Expected Int to be a GraphQL List type. Was the list nullability modifier's depth more than the field types?", + message: 'List nullability modifier is too deep.', locations: [{ line: 4, column: 13 }], }, ]); @@ -64,12 +64,17 @@ describe('Validate: Field uses correct list depth', () => { it('reports errors when list depth is too low', () => { expectErrors(` fragment listFragment on Lists { + list! mixedThreeDList[[]!]! } `).toDeepEqual([ { message: 'List nullability modifier is too shallow.', - locations: [{ line: 4, column: 7 }], + locations: [{ line: 4, column: 9 }], + }, + { + message: 'List nullability modifier is too shallow.', + locations: [{ line: 5, column: 7 }], }, ]); }); From cc351f40b7bb202d28376a3e89120a46575e70e3 Mon Sep 17 00:00:00 2001 From: twof Date: Mon, 20 Dec 2021 16:54:24 -0800 Subject: [PATCH 62/64] rework RequiredStatusOnFieldMatchesDefinitionRule so it's not needlessly calling modifiedOutputType --- ...uiredStatusOnFieldMatchesDefinitionRule.ts | 56 +++++++++++++++++-- 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts b/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts index a047b78613..9c84d451c0 100644 --- a/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts +++ b/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts @@ -1,8 +1,9 @@ -import type { FieldNode } from '../../language/ast'; -import type { ASTVisitor } from '../../language/visitor'; +import type { FieldNode, NullabilityModifierNode, SupportArrayNode } from '../../language/ast'; +import { ASTReducer, ASTVisitor, visit } from '../../language/visitor'; import type { ValidationContext } from '../ValidationContext'; import { modifiedOutputType } from '../../utilities/applyRequiredStatus'; +import { assertListType, getNullableType, GraphQLError, GraphQLOutputType, isListType } from '../..'; /** * List element nullability designators need to use a depth that is the same as or less than the @@ -19,12 +20,55 @@ export function RequiredStatusOnFieldMatchesDefinitionRule( Field(node: FieldNode) { const fieldDef = context.getFieldDef(); if (fieldDef) { - try { - modifiedOutputType(fieldDef.type, node.required); - } catch (error) { - context.reportError(error); + const typeDepth = getTypeDepth(fieldDef.type) + const designatorDepth = getDesignatorDepth(node.required) + + if (typeDepth > designatorDepth) { + context.reportError(new GraphQLError( + 'List nullability modifier is too shallow.', + node.required, + )); + } else if (typeDepth < designatorDepth) { + context.reportError(new GraphQLError( + 'List nullability modifier is too deep.', + node.required, + )); } } }, }; + + function getTypeDepth(type: GraphQLOutputType): number { + let currentType = type; + let depthCount = 0; + while (isListType(getNullableType(currentType))) { + const list = assertListType(getNullableType(currentType)); + const elementType = list.ofType as GraphQLOutputType; + currentType = elementType + depthCount += 1; + } + return depthCount + } + + function getDesignatorDepth( + designator: SupportArrayNode | NullabilityModifierNode | undefined + ): number { + const getDepth: ASTReducer = { + RequiredDesignator: { + leave({element}) { return element ?? 0 } + }, + + OptionalDesignator: { + leave({element}) { return element ?? 0 } + }, + + ListNullabilityDesignator: { + leave({element}) { + return (element ?? 0) + 1 + } + } + }; + + return designator !== undefined ? visit(designator, getDepth) : 0; + } } From 68701d3337754d13e5e72ece78ca44bbb29f74c4 Mon Sep 17 00:00:00 2001 From: twof Date: Mon, 20 Dec 2021 20:18:47 -0800 Subject: [PATCH 63/64] prettier --- ...uiredStatusOnFieldMatchesDefinitionRule.ts | 60 ++++++++++++------- 1 file changed, 39 insertions(+), 21 deletions(-) diff --git a/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts b/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts index 9c84d451c0..481b559bdf 100644 --- a/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts +++ b/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts @@ -1,9 +1,19 @@ -import type { FieldNode, NullabilityModifierNode, SupportArrayNode } from '../../language/ast'; +import type { + FieldNode, + NullabilityModifierNode, + SupportArrayNode, +} from '../../language/ast'; import { ASTReducer, ASTVisitor, visit } from '../../language/visitor'; import type { ValidationContext } from '../ValidationContext'; import { modifiedOutputType } from '../../utilities/applyRequiredStatus'; -import { assertListType, getNullableType, GraphQLError, GraphQLOutputType, isListType } from '../..'; +import { + assertListType, + getNullableType, + GraphQLError, + GraphQLOutputType, + isListType, +} from '../..'; /** * List element nullability designators need to use a depth that is the same as or less than the @@ -20,19 +30,23 @@ export function RequiredStatusOnFieldMatchesDefinitionRule( Field(node: FieldNode) { const fieldDef = context.getFieldDef(); if (fieldDef) { - const typeDepth = getTypeDepth(fieldDef.type) - const designatorDepth = getDesignatorDepth(node.required) + const typeDepth = getTypeDepth(fieldDef.type); + const designatorDepth = getDesignatorDepth(node.required); if (typeDepth > designatorDepth) { - context.reportError(new GraphQLError( - 'List nullability modifier is too shallow.', - node.required, - )); + context.reportError( + new GraphQLError( + 'List nullability modifier is too shallow.', + node.required, + ), + ); } else if (typeDepth < designatorDepth) { - context.reportError(new GraphQLError( - 'List nullability modifier is too deep.', - node.required, - )); + context.reportError( + new GraphQLError( + 'List nullability modifier is too deep.', + node.required, + ), + ); } } }, @@ -44,29 +58,33 @@ export function RequiredStatusOnFieldMatchesDefinitionRule( while (isListType(getNullableType(currentType))) { const list = assertListType(getNullableType(currentType)); const elementType = list.ofType as GraphQLOutputType; - currentType = elementType + currentType = elementType; depthCount += 1; } - return depthCount + return depthCount; } function getDesignatorDepth( - designator: SupportArrayNode | NullabilityModifierNode | undefined + designator: SupportArrayNode | NullabilityModifierNode | undefined, ): number { const getDepth: ASTReducer = { RequiredDesignator: { - leave({element}) { return element ?? 0 } + leave({ element }) { + return element ?? 0; + }, }, OptionalDesignator: { - leave({element}) { return element ?? 0 } + leave({ element }) { + return element ?? 0; + }, }, ListNullabilityDesignator: { - leave({element}) { - return (element ?? 0) + 1 - } - } + leave({ element }) { + return (element ?? 0) + 1; + }, + }, }; return designator !== undefined ? visit(designator, getDepth) : 0; From d15a5978fb74111b9424453283c6010e8795c2d9 Mon Sep 17 00:00:00 2001 From: twof Date: Tue, 21 Dec 2021 00:34:49 -0800 Subject: [PATCH 64/64] all tests passing and 100% coverage after validation rule update --- ...StatusOnFieldMatchesDefinitionRule-test.ts | 2 ++ ...uiredStatusOnFieldMatchesDefinitionRule.ts | 21 +++++++++++-------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts b/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts index f76b96d339..8e43ea296a 100644 --- a/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts +++ b/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts @@ -37,8 +37,10 @@ describe('Validate: Field uses correct list depth', () => { fragment listFragment on Lists { list[!] nonList! + nonList? mixedThreeDList[[[!]!]!]! requiredList[] + unmodifiedList: list } `); }); diff --git a/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts b/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts index 481b559bdf..896ba83528 100644 --- a/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts +++ b/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts @@ -3,17 +3,19 @@ import type { NullabilityModifierNode, SupportArrayNode, } from '../../language/ast'; -import { ASTReducer, ASTVisitor, visit } from '../../language/visitor'; + +import type { ASTReducer, ASTVisitor } from '../../language/visitor'; +import { visit } from '../../language/visitor'; import type { ValidationContext } from '../ValidationContext'; -import { modifiedOutputType } from '../../utilities/applyRequiredStatus'; +import type { GraphQLOutputType } from '../../type/definition'; import { assertListType, getNullableType, - GraphQLError, - GraphQLOutputType, isListType, -} from '../..'; +} from '../../type/definition'; + +import { GraphQLError } from '../../error/GraphQLError'; /** * List element nullability designators need to use a depth that is the same as or less than the @@ -29,9 +31,10 @@ export function RequiredStatusOnFieldMatchesDefinitionRule( return { Field(node: FieldNode) { const fieldDef = context.getFieldDef(); - if (fieldDef) { + const requiredNode = node.required; + if (fieldDef && requiredNode) { const typeDepth = getTypeDepth(fieldDef.type); - const designatorDepth = getDesignatorDepth(node.required); + const designatorDepth = getDesignatorDepth(requiredNode); if (typeDepth > designatorDepth) { context.reportError( @@ -65,7 +68,7 @@ export function RequiredStatusOnFieldMatchesDefinitionRule( } function getDesignatorDepth( - designator: SupportArrayNode | NullabilityModifierNode | undefined, + designator: SupportArrayNode | NullabilityModifierNode, ): number { const getDepth: ASTReducer = { RequiredDesignator: { @@ -87,6 +90,6 @@ export function RequiredStatusOnFieldMatchesDefinitionRule( }, }; - return designator !== undefined ? visit(designator, getDepth) : 0; + return visit(designator, getDepth); } }

Y_@#zWV>q+@=&24NZAuEc|60bN@ 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%0Aj}+ATh3OO^8_%+1eidmYzcKrYzNjag=q~CjMl@M zIHf#hf%%wgXBDZxlo&4Dcy`m&W6Qp@x&YxkrFZIevBCp+u2C;7=Q1{9jaj)R$bY)l z^SnzoGBc+c3Y<}KW(0njb^!igri=wubCi5I5@z`7iGzJsER&pipoCq!LVH&j9hMg! z^Tf1vo1kP?rrYThXlma@IsD6c$~C&_#oWxvcD?JZSfdnKQZbl>v_jx_!}33ZiP$MW zlOrQj!=VV#?$Fa0WByz;&66<u|Livb>5Gz_EX#$I9Dt@;Lecp2jlX4 zf*rjLvvRy=@Dcdz>-@a54UQQ380Gy;CH?stWcT33j7Q{4ONEp06d=kK2u`S@Gcl2c zqLC&76O`{7cbV`HKt*6=J_2naEv`X$TL3fp-zfc+uuf#EyqyYpGI=n~D>vQ$U>&wg zqu%+1&r{5uEci^R`+O<6Op&?i;0l8nuw zu2Y3kT55t zA(xM%*rFDo-I3MJlCdow?FdW>MBK8=yB^A&-^9rUn<;;^(_=&1;GN zSpW7GvUkB76SRKo*?&R+`TjZOUk&=){n7ssxUEt8$hw>rGa=LZE%8J%>{<`q=QQW! zpd*wBQXPi)=P^W4YvFk25uBra6!gaRX12#RHOb1G2k5<>j=}Nnu7X+}z6Yws(<_vP z?≀M3spx|3E{dD$~DWSzN(R`GR~`Q8=yt$mZOoyU)A0>rB+Va3>$xGfG;Kr{kN8 zVZ`7U#mW7ju-WtuaE(rRfBU|1Ub4&)GR^UtMRta{&o?k zC~@Nf2jb%Sb;<$irH0aK?dbHls%&H{9XUWClwJFq!^76SRjZfruU9DuU1fD0W=&g? z12LR!=6b5qIABcUQXtA$dx_3%7n4kBd_Aa(818e##SDHoDF~rExHzg;A8t;_1q#F( z_5uIdefYt4z=0jwO~~!kViY`172893Qm6Acy@r#;Rmf5I?-2?`l|Rcvf%I_B`cKnd zAQ(^0(7G>R$!fiXm8?&XEBhJMtZ+L4o=F4MaNyy1*!j*~uu5?32~4wyN#nY)YMGX= z$Rn|N>yJW#+DRl4uP71p!|IU~!|E0MYIa##5`}ou+a@GKM_xcDB}NDL&)R z;A0(;+`DoS@Q+R~0*`TK} zlQh{we!qu^058eV&7C(uqmEtJxDms_FmpXvd zWD3>L4)B&?-r~9M?3P0lPyZnVC|nPkl!e^uYQ5qqXgp|0BGLm@ErH!4q=^L;Jk)F?Wi%+r6hWhP?qLc zi;SixW&_7-EbOwStH9$vsFOev)ha-88?T-0UOSvicdf5{(5Y4R*&G#Ll*9OjYfRi6 z`=W;?>9vu&>M1S3|#Woq+vQ(GGbx7ZXYX9A~K4S5F%@=0?N+){OxTIoJTl>cBm5&7Y7s@?rX3tm)HOcn7QZB$_ zs^?zVf`N>t0AiB}H$H-YilfK!$WQ+U!tfa!Oz0Gp{=s*FT36jZjP9&tcB0^^Kw)v8 zw>d;Rx76Ld**Cj;U;g3We8V|FaB}cs-9)xr^}c@IU~}!8%iat z3;OIy?hP5y^7ll7vVK1PQeMON=H-5nn51oB0U6A|`b!d%hz3~y(t5DEli+Vqr0RB6;@_`MHouF5)WnWa%nnavr>3ffA z{^Z5%7KObThWn6U?}0|%lgBKx0x&=Q$R}~iiO&fQM$D(qh3coVxM2{V7GCjtm& z7TKBawU>q-gL)VaxN&DmqogEf*&Op&=aVu&#}n8khhfe=21}>gqLfDl`p�$=?WF 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пx`o&Vo0`u|~6(AUUb_FxX&I4_J}p8QPu$iAHw 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 literal 0 HcmV?d00001 diff --git a/src/__testUtils__/kitchenSinkQuery.ts b/src/__testUtils__/kitchenSinkQuery.ts index 9ed9a7e983..9002a679bb 100644 --- a/src/__testUtils__/kitchenSinkQuery.ts +++ b/src/__testUtils__/kitchenSinkQuery.ts @@ -10,6 +10,10 @@ query queryName($foo: ComplexType, $site: Site = MOBILE) @onQuery { ...frag @onFragmentSpread } } + field3! + requiredField4: field4! + field5? + optionalField6: field6? } ... @skip(unless: $foo) { id diff --git a/src/execution/__tests__/executor-test.ts b/src/execution/__tests__/executor-test.ts index fa59d32fd0..5086ee4263 100644 --- a/src/execution/__tests__/executor-test.ts +++ b/src/execution/__tests__/executor-test.ts @@ -1269,4 +1269,155 @@ describe('Execute: Handles basic execution tasks', () => { expect(result).to.deep.equal({ data: { foo: { bar: 'bar' } } }); expect(possibleTypes).to.deep.equal([fooObject]); }); + + it('bubbles null up to nearest nullable parent', () => { + const schema = new GraphQLSchema({ + query: new GraphQLObjectType({ + name: 'Query', + fields: { + food: { + type: new GraphQLObjectType({ + name: 'Food', + fields: { + name: { type: GraphQLString }, + calories: { type: GraphQLInt }, + }, + }), + resolve() { + return { + name: null, + calories: 10, + }; + }, + }, + }, + }), + }); + + const plainDocument = parse(` + query { + food { + name + calories + } + } + `); + const plainResult = executeSync({ schema, document: plainDocument }); + + expect(plainResult).to.deep.equal({ + data: { food: { name: null, calories: 10 } }, + }); + + const singleNonNullOnNullValueDocument = parse(` + query { + food { + name! + calories + } + } + `); + const singleNonNullOnNullValueResult = executeSync({ + schema, + document: singleNonNullOnNullValueDocument, + }); + + expect(singleNonNullOnNullValueResult).to.deep.equal({ + data: { food: null }, + errors: [ + { + locations: [{ column: 11, line: 4 }], + message: 'Cannot return null for non-nullable field Food.name.', + path: ['food', 'name'], + }, + ], + }); + + const bothNonNullOnNullValueDocument = parse(` + query { + food { + name! + calories! + } + } + `); + const bothNonNullOnNullValueResult = executeSync({ + schema, + document: bothNonNullOnNullValueDocument, + }); + + expect(bothNonNullOnNullValueResult).to.deep.equal({ + data: { food: null }, + errors: [ + { + locations: [{ column: 11, line: 4 }], + message: 'Cannot return null for non-nullable field Food.name.', + path: ['food', 'name'], + }, + ], + }); + + const singleNonNullOnNonNullValueDocument = parse(` + query { + food { + calories! + } + } + `); + const singleNonNullOnNonNullValueResult = executeSync({ + schema, + document: singleNonNullOnNonNullValueDocument, + }); + + expect(singleNonNullOnNonNullValueResult).to.deep.equal({ + data: { food: { calories: 10 } }, + }); + + const nonNullAliasOnNullValueDocument = parse(` + query { + food { + theNameOfTheFood: name! + } + } + `); + const nonNullAliasOnNullValueResult = executeSync({ + schema, + document: nonNullAliasOnNullValueDocument, + }); + + expect(nonNullAliasOnNullValueResult).to.deep.equal({ + data: { food: null }, + errors: [ + { + locations: [{ column: 11, line: 4 }], + message: 'Cannot return null for non-nullable field Food.name.', + path: ['food', 'theNameOfTheFood'], + }, + ], + }); + + const nonNullInFragmentDocument = parse(` + query { + food { + ... on Food { + name! + } + } + } + `); + const nonNullInFragmentResult = executeSync({ + schema, + document: nonNullInFragmentDocument, + }); + + expect(nonNullInFragmentResult).to.deep.equal({ + data: { food: null }, + errors: [ + { + locations: [{ column: 13, line: 5 }], + message: 'Cannot return null for non-nullable field Food.name.', + path: ['food', 'name'], + }, + ], + }); + }); }); diff --git a/src/execution/execute.ts b/src/execution/execute.ts index 585e2bbed7..35bf3b5b6d 100644 --- a/src/execution/execute.ts +++ b/src/execution/execute.ts @@ -52,6 +52,8 @@ import { isNonNullType, } from '../type/definition'; +import { modifiedOutputType } from '../utilities/applyRequiredStatus'; + import { getVariableValues, getArgumentValues } from './values'; import { collectFields, @@ -489,7 +491,7 @@ function executeField( return; } - const returnType = fieldDef.type; + const returnType = modifiedOutputType(fieldDef.type, fieldNodes[0].required); const resolveFn = fieldDef.resolve ?? exeContext.fieldResolver; const info = buildResolveInfo( diff --git a/src/index.ts b/src/index.ts index 844ecaf5a2..6510434b24 100644 --- a/src/index.ts +++ b/src/index.ts @@ -231,6 +231,7 @@ export { isTypeDefinitionNode, isTypeSystemExtensionNode, isTypeExtensionNode, + RequiredStatus, } from './language/index'; export type { @@ -305,6 +306,7 @@ export type { UnionTypeExtensionNode, EnumTypeExtensionNode, InputObjectTypeExtensionNode, + RequiredStatus, } from './language/index'; /** Execute GraphQL queries. */ @@ -451,6 +453,7 @@ export { DangerousChangeType, findBreakingChanges, findDangerousChanges, + modifiedOutputType, } from './utilities/index'; export type { diff --git a/src/language/__tests__/lexer-test.ts b/src/language/__tests__/lexer-test.ts index 021e2b0b34..2e7c653fc3 100644 --- a/src/language/__tests__/lexer-test.ts +++ b/src/language/__tests__/lexer-test.ts @@ -168,16 +168,16 @@ describe('Lexer', () => { it('errors respect whitespace', () => { let caughtError; try { - lexOne(['', '', ' ?', ''].join('\n')); + lexOne(['', '', ' ~', ''].join('\n')); } catch (error) { caughtError = error; } expect(String(caughtError)).to.equal(dedent` - Syntax Error: Unexpected character: "?". + Syntax Error: Unexpected character: "~". GraphQL request:3:5 2 | - 3 | ? + 3 | ~ | ^ 4 | `); @@ -186,18 +186,18 @@ describe('Lexer', () => { it('updates line numbers in error for file context', () => { let caughtError; try { - const str = ['', '', ' ?', ''].join('\n'); + const str = ['', '', ' ~', ''].join('\n'); const source = new Source(str, 'foo.js', { line: 11, column: 12 }); new Lexer(source).advance(); } catch (error) { caughtError = error; } expect(String(caughtError)).to.equal(dedent` - Syntax Error: Unexpected character: "?". + Syntax Error: Unexpected character: "~". foo.js:13:6 12 | - 13 | ? + 13 | ~ | ^ 14 | `); @@ -206,16 +206,16 @@ describe('Lexer', () => { it('updates column numbers in error for file context', () => { let caughtError; try { - const source = new Source('?', 'foo.js', { line: 1, column: 5 }); + const source = new Source('~', 'foo.js', { line: 1, column: 5 }); new Lexer(source).advance(); } catch (error) { caughtError = error; } expect(String(caughtError)).to.equal(dedent` - Syntax Error: Unexpected character: "?". + Syntax Error: Unexpected character: "~". foo.js:1:5 - 1 | ? + 1 | ~ | ^ `); }); @@ -1027,8 +1027,8 @@ describe('Lexer', () => { locations: [{ line: 1, column: 1 }], }); - expectSyntaxError('?').to.deep.equal({ - message: 'Syntax Error: Unexpected character: "?".', + expectSyntaxError('~').to.deep.equal({ + message: 'Syntax Error: Unexpected character: "~".', locations: [{ line: 1, column: 1 }], }); diff --git a/src/language/__tests__/parser-test.ts b/src/language/__tests__/parser-test.ts index 10b8c6f2ba..58b5438bd9 100644 --- a/src/language/__tests__/parser-test.ts +++ b/src/language/__tests__/parser-test.ts @@ -224,6 +224,66 @@ describe('Parser', () => { ).to.not.throw(); }); + it('parses required field', () => { + expect(() => + parse(` + query { + requiredField! + } + `), + ).to.not.throw(); + }); + + it('parses optional field', () => { + expect(() => + parse(` + query { + optionalField? + } + `), + ).to.not.throw(); + }); + + it('parses required with alias', () => { + expect(() => + parse(` + query { + requiredField: field! + } + `), + ).to.not.throw(); + }); + + it('does not parse aliased field with bang on left of colon', () => { + expect(() => + parse(` + query { + requiredField!: field + } + `), + ).to.throw(); + }); + + it('does not parse aliased field with bang on left and right of colon', () => { + expect(() => + parse(` + query { + requiredField!: field! + } + `), + ).to.throw(); + }); + + it('parses required within fragment', () => { + expect(() => + parse(` + fragment MyFragment on Query { + field! + } + `), + ).to.not.throw(); + }); + it('creates ast', () => { const result = parse(dedent` { @@ -245,6 +305,7 @@ describe('Parser', () => { name: undefined, variableDefinitions: [], directives: [], + required: 'unset', selectionSet: { kind: Kind.SELECTION_SET, loc: { start: 0, end: 40 }, @@ -275,6 +336,7 @@ describe('Parser', () => { }, ], directives: [], + required: 'unset', selectionSet: { kind: Kind.SELECTION_SET, loc: { start: 16, end: 38 }, @@ -335,6 +397,7 @@ describe('Parser', () => { name: undefined, variableDefinitions: [], directives: [], + required: 'unset', selectionSet: { kind: Kind.SELECTION_SET, loc: { start: 6, end: 29 }, @@ -350,6 +413,7 @@ describe('Parser', () => { }, arguments: [], directives: [], + required: 'unset', selectionSet: { kind: Kind.SELECTION_SET, loc: { start: 15, end: 27 }, diff --git a/src/language/__tests__/printer-test.ts b/src/language/__tests__/printer-test.ts index 9c2fcf9c5f..c8dae54e3f 100644 --- a/src/language/__tests__/printer-test.ts +++ b/src/language/__tests__/printer-test.ts @@ -13,6 +13,7 @@ describe('Printer: Query document', () => { const ast = { kind: Kind.FIELD, name: { kind: Kind.NAME, value: 'foo' }, + required: 'unset', } as const; expect(print(ast)).to.equal('foo'); }); @@ -165,6 +166,10 @@ describe('Printer: Query document', () => { ...frag @onFragmentSpread } } + field3! + requiredField4: field4! + field5? + optionalField6: field6? } ... @skip(unless: $foo) { id diff --git a/src/language/__tests__/visitor-test.ts b/src/language/__tests__/visitor-test.ts index 903b80d959..0dd5639238 100644 --- a/src/language/__tests__/visitor-test.ts +++ b/src/language/__tests__/visitor-test.ts @@ -654,6 +654,26 @@ describe('Visitor', () => { ['leave', 'Field', 1, undefined], ['leave', 'SelectionSet', 'selectionSet', 'Field'], ['leave', 'Field', 0, undefined], + ['enter', 'Field', 1, undefined], + ['enter', 'Name', 'name', 'Field'], + ['leave', 'Name', 'name', 'Field'], + ['leave', 'Field', 1, undefined], + ['enter', 'Field', 2, undefined], + ['enter', 'Name', 'alias', 'Field'], + ['leave', 'Name', 'alias', 'Field'], + ['enter', 'Name', 'name', 'Field'], + ['leave', 'Name', 'name', 'Field'], + ['leave', 'Field', 2, undefined], + ['enter', 'Field', 3, undefined], + ['enter', 'Name', 'name', 'Field'], + ['leave', 'Name', 'name', 'Field'], + ['leave', 'Field', 3, undefined], + ['enter', 'Field', 4, undefined], + ['enter', 'Name', 'alias', 'Field'], + ['leave', 'Name', 'alias', 'Field'], + ['enter', 'Name', 'name', 'Field'], + ['leave', 'Name', 'name', 'Field'], + ['leave', 'Field', 4, undefined], ['leave', 'SelectionSet', 'selectionSet', 'InlineFragment'], ['leave', 'InlineFragment', 1, undefined], ['enter', 'InlineFragment', 2, undefined], diff --git a/src/language/ast.ts b/src/language/ast.ts index 0b30366df0..35eb39ec8e 100644 --- a/src/language/ast.ts +++ b/src/language/ast.ts @@ -352,6 +352,8 @@ export interface SelectionSetNode { export type SelectionNode = FieldNode | FragmentSpreadNode | InlineFragmentNode; +export type RequiredStatus = 'required' | 'optional' | 'unset'; + export interface FieldNode { readonly kind: Kind.FIELD; readonly loc?: Location; @@ -360,6 +362,7 @@ export interface FieldNode { readonly arguments?: ReadonlyArray; readonly directives?: ReadonlyArray; readonly selectionSet?: SelectionSetNode; + readonly required: RequiredStatus; } export interface ArgumentNode { diff --git a/src/language/lexer.ts b/src/language/lexer.ts index 2053dd04d5..dddfb831be 100644 --- a/src/language/lexer.ts +++ b/src/language/lexer.ts @@ -281,6 +281,8 @@ function readNextToken(lexer: Lexer, start: number): Token { return createToken(lexer, TokenKind.PIPE, position, position + 1); case 0x007d: // } return createToken(lexer, TokenKind.BRACE_R, position, position + 1); + case 0x003f: // ? + return createToken(lexer, TokenKind.QUESTION_MARK, position, poistion + 1); // StringValue case 0x0022: // " if ( diff --git a/src/language/parser.ts b/src/language/parser.ts index 1b0bc75f92..bffd22738f 100644 --- a/src/language/parser.ts +++ b/src/language/parser.ts @@ -59,6 +59,7 @@ import type { UnionTypeExtensionNode, EnumTypeExtensionNode, InputObjectTypeExtensionNode, + RequiredStatus, } from './ast'; import { Kind } from './kinds'; import { Location, OperationTypeNode } from './ast'; @@ -419,6 +420,7 @@ export class Parser { const nameOrAlias = this.parseName(); let alias; let name; + if (this.expectOptionalToken(TokenKind.COLON)) { alias = nameOrAlias; name = this.parseName(); @@ -426,6 +428,15 @@ export class Parser { name = nameOrAlias; } + let required: RequiredStatus; + if (this.expectOptionalToken(TokenKind.BANG)) { + required = 'required'; + } else if (this.expectOptionalToken(TokenKind.QUESTION_MARK)) { + required = 'optional'; + } else { + required = 'unset'; + } + return this.node(start, { kind: Kind.FIELD, alias, @@ -435,6 +446,7 @@ export class Parser { selectionSet: this.peek(TokenKind.BRACE_L) ? this.parseSelectionSet() : undefined, + required, }); } diff --git a/src/language/printer.ts b/src/language/printer.ts index b6df7d80f9..ec8bfa814d 100644 --- a/src/language/printer.ts +++ b/src/language/printer.ts @@ -55,8 +55,21 @@ const printDocASTReducer: ASTReducer = { SelectionSet: { leave: ({ selections }) => block(selections) }, Field: { - leave({ alias, name, arguments: args, directives, selectionSet }) { - const prefix = wrap('', alias, ': ') + name; + leave({ + alias, + name, + arguments: args, + directives, + selectionSet, + required, + }) { + let prefix = wrap('', alias, ': ') + name; + if (required === 'required') { + prefix += '!'; + } else if (required === 'optional') { + prefix += '?'; + } + let argsLine = prefix + wrap('(', join(args, ', '), ')'); if (argsLine.length > MAX_LINE_LENGTH) { diff --git a/src/language/tokenKind.ts b/src/language/tokenKind.ts index 4878d697b0..b8d79af142 100644 --- a/src/language/tokenKind.ts +++ b/src/language/tokenKind.ts @@ -25,6 +25,7 @@ export enum TokenKind { STRING = 'String', BLOCK_STRING = 'BlockString', COMMENT = 'Comment', + QUESTION_MARK = '?', } /** diff --git a/src/utilities/applyRequiredStatus.ts b/src/utilities/applyRequiredStatus.ts new file mode 100644 index 0000000000..ab74fb27fb --- /dev/null +++ b/src/utilities/applyRequiredStatus.ts @@ -0,0 +1,19 @@ +import type { RequiredStatus } from '../language/ast'; +import type { GraphQLOutputType } from '../type/definition'; +import { + getNullableType, + GraphQLNonNull, + isNonNullType, +} from '../type/definition'; + +export function modifiedOutputType( + type: GraphQLOutputType, + required: RequiredStatus, +): GraphQLOutputType { + if (required === 'required' && !isNonNullType(type)) { + return new GraphQLNonNull(type); + } else if (required === 'optional') { + return getNullableType(type); + } + return type; +} \ No newline at end of file diff --git a/src/utilities/index.ts b/src/utilities/index.ts index a1411f508e..e19d00aa19 100644 --- a/src/utilities/index.ts +++ b/src/utilities/index.ts @@ -106,3 +106,5 @@ export type { BreakingChange, DangerousChange } from './findBreakingChanges'; /** Wrapper type that contains DocumentNode and types that can be deduced from it. */ export type { TypedQueryDocumentNode } from './typedQueryDocumentNode'; + +export { modifiedOutputType } from './applyRequiredStatus'; \ No newline at end of file diff --git a/src/validation/.DS_Store b/src/validation/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..33c1e9e1ddb2f4a2ca1d8b38f1a668986b4a6edb GIT binary patch literal 6148 zcmeHK%}T>S5Z-O8O(;SR3OxqA7Ob`uikA@U3mDOZN=!)5V9ZLBnnNk%tS{t~_&m<+ zZVIIpJc-yDnEhtwC(C{t_J=XX-C1G1{Rm&uBrp2?Pu^&@c6QrF+vpf~-lHhJA}D6L z8%%GocPT^~)^-qHC2{Fn`)496f+UNlvLK0KNV&aEvPhJ!m}OBeYdsY(OvCi8?tDHR zjC%HPJY4kb`S_#{_F%MFn8v~3(dmW%ls;$TP0`8W&y%vJv4(drHq7kRn`WuV9w1s* z))j=r05L!eYzqT=|1&zV`(pep71iNRGl_-&o%Xsi^fa>nJz@Etue*Dn+E=$0WM=|8$QQQTU Z0)86}Ku2Sx5Ii7s5s)-cLk#>X17GrMO-%p* literal 0 HcmV?d00001 diff --git a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts index f9f4456b5e..8f2d51681b 100644 --- a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts +++ b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts @@ -167,6 +167,24 @@ describe('Validate: Overlapping fields can be merged', () => { ]); }); + it('different nullability', () => { + expectErrors(` + fragment conflictingArgs on Dog { + doesKnowCommand + doesKnowCommand! + } + `).to.deep.equal([ + { + message: + 'Fields "doesKnowCommand" conflict because they return conflicting types "Boolean" and "Boolean!". Use different aliases on the fields to fetch both if this was intentional.', + locations: [ + { line: 3, column: 9 }, + { line: 4, column: 9 }, + ], + }, + ]); + }); + it('different args, second missing an argument', () => { expectErrors(` fragment conflictingArgs on Dog { @@ -236,6 +254,28 @@ describe('Validate: Overlapping fields can be merged', () => { `); }); + it('disallows different nullability status even if the types are mutual exclusive', () => { + expectErrors(` + fragment conflictingNullability on Pet { + ... on Dog { + name! + } + ... on Cat { + name + } + } + `).to.deep.equal([ + { + message: + 'Fields "name" conflict because they return conflicting types "String!" and "String". Use different aliases on the fields to fetch both if this was intentional.', + locations: [ + { line: 4, column: 11 }, + { line: 7, column: 11 }, + ], + }, + ]); + }); + it('encounters conflict in fragments', () => { expectErrors(` { @@ -613,6 +653,139 @@ describe('Validate: Overlapping fields can be merged', () => { ]); }); + describe('nullable field on types which potentially overlap', () => { + it('matching nullability status', () => { + // This is invalid since an object could potentially be both the Object + // type IntBox and the interface type NonNullStringBox1. While that + // condition does not exist in the current schema, the schema could + // expand in the future to allow this. Thus it is invalid. + expectValidWithSchema( + schema, + ` + { + someBox { + ...on SomeBox { + unrelatedField! + } + ...on IntBox { + unrelatedField! + } + } + } + `, + ); + }); + + it('conflicting nullability status', () => { + // This is invalid since an object could potentially be both the Object + // type IntBox and the interface type NonNullStringBox1. While that + // condition does not exist in the current schema, the schema could + // expand in the future to allow this. Thus it is invalid. + expectErrorsWithSchema( + schema, + ` + { + someBox { + ...on SomeBox { + unrelatedField + } + ...on IntBox { + unrelatedField! + } + } + } + `, + ).to.deep.equal([ + { + message: + 'Fields "unrelatedField" conflict because they return conflicting types "String" and "String!". Use different aliases on the fields to fetch both if this was intentional.', + locations: [ + { line: 5, column: 19 }, + { line: 8, column: 19 }, + ], + }, + ]); + }); + + it('conflicting nullability status with aliases', () => { + // This is invalid since an object could potentially be both the Object + // type IntBox and the interface type NonNullStringBox1. While that + // condition does not exist in the current schema, the schema could + // expand in the future to allow this. Thus it is invalid. + expectValidWithSchema( + schema, + ` + { + someBox { + ...on SomeBox { + nullable: unrelatedField + } + ...on IntBox { + nonNullable: unrelatedField! + } + } + } + `, + ); + }); + }); + + describe('non-nullable field on types which potentially overlap', () => { + it('matching nullability status', () => { + expectValidWithSchema( + schema, + ` + { + someBox { + ...on NonNullStringBox1 { + scalar! + } + ...on NonNullStringBox1Impl { + scalar! + } + } + } + `, + ); + }); + + it('conflicting nullability status', () => { + expectValidWithSchema( + schema, + ` + { + someBox { + ...on NonNullStringBox1 { + scalar! + } + ...on NonNullStringBox1Impl { + scalar + } + } + } + `, + ); + }); + + it('conflicting nullability status with aliases', () => { + expectValidWithSchema( + schema, + ` + { + someBox { + ...on NonNullStringBox1 { + nonNullable: scalar! + } + ...on NonNullStringBox1Impl { + nullable: scalar + } + } + } + `, + ); + }); + }); + it('compatible return shapes on different return types', () => { // In this case `deepBox` returns `SomeBox` in the first usage, and // `StringBox` in the second usage. These return types are not the same! @@ -638,6 +811,43 @@ describe('Validate: Overlapping fields can be merged', () => { ); }); + it('nested conflicting nullability status which potentially overlap', () => { + // This is invalid since an object could potentially be both the Object + // type IntBox and the interface type NonNullStringBox1. While that + // condition does not exist in the current schema, the schema could + // expand in the future to allow this. Thus it is invalid. + expectErrorsWithSchema( + schema, + ` + { + someBox { + ... on SomeBox { + deepBox { + unrelatedField + } + } + ... on StringBox { + deepBox { + unrelatedField! + } + } + } + } + `, + ).to.deep.equal([ + { + message: + 'Fields "deepBox" conflict because subfields "unrelatedField" conflict because they return conflicting types "String" and "String!". Use different aliases on the fields to fetch both if this was intentional.', + locations: [ + { line: 5, column: 17 }, + { line: 6, column: 19 }, + { line: 10, column: 17 }, + { line: 11, column: 19 }, + ], + }, + ]); + }); + it('disallows differing return types despite no overlap', () => { expectErrorsWithSchema( schema, @@ -753,6 +963,57 @@ describe('Validate: Overlapping fields can be merged', () => { ]); }); + it('allows the nullability status based on ! operator', () => { + expectValidWithSchema( + schema, + ` + { + someBox { + ... on NonNullStringBox1 { + scalar + } + ... on StringBox { + scalar! + } + } + } + `, + ); + }); + + it('disallows conflicting nullability statuses based on ! operator', () => { + expectErrorsWithSchema( + schema, + ` + { + someBox { + ... on IntBox { + scalar + } + ... on StringBox { + scalar! + } + } + } + `, + ).to.deep.equal([ + { + locations: [ + { + column: 17, + line: 5, + }, + { + column: 17, + line: 8, + }, + ], + message: + 'Fields "scalar" conflict because they return conflicting types "Int" and "String!". Use different aliases on the fields to fetch both if this was intentional.', + }, + ]); + }); + it('disallows differing return type list despite no overlap', () => { expectErrorsWithSchema( schema, diff --git a/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts b/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts index e76b32f97c..b400b61111 100644 --- a/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts +++ b/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts @@ -19,6 +19,7 @@ import type { GraphQLOutputType, GraphQLField, } from '../../type/definition'; + import { getNamedType, isNonNullType, @@ -33,6 +34,7 @@ import { typeFromAST } from '../../utilities/typeFromAST'; import type { Maybe } from '../../jsutils/Maybe'; import type { ValidationContext } from '../ValidationContext'; +import { modifiedOutputType } from '../../utilities/applyRequiredStatus'; function reasonMessage(reason: ConflictReasonMessage): string { if (Array.isArray(reason)) { @@ -590,17 +592,22 @@ function findConflict( const type1 = def1?.type; const type2 = def2?.type; - if (type1 && type2 && doTypesConflict(type1, type2)) { - return [ - [ - responseName, - `they return conflicting types "${inspect(type1)}" and "${inspect( - type2, - )}"`, - ], - [node1], - [node2], - ]; + if (type1 && type2) { + const modifiedType1 = modifiedOutputType(type1, node1.required); + const modifiedType2 = modifiedOutputType(type2, node2.required); + + if (doTypesConflict(modifiedType1, modifiedType2)) { + return [ + [ + responseName, + `they return conflicting types "${inspect( + modifiedType1, + )}" and "${inspect(modifiedType2)}"`, + ], + [node1], + [node2], + ]; + } } // Collect and compare sub-fields. Use the same "visited fragment names" list From a0c01d3e99d57859d071694873b0a26b8dd5a8f1 Mon Sep 17 00:00:00 2001 From: Alex Reilly Date: Mon, 13 Sep 2021 19:14:51 -0700 Subject: [PATCH 02/64] tests running --- src/index.ts | 1 - src/language/index.ts | 1 + src/language/lexer.ts | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index 6510434b24..215ca3c6e8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -231,7 +231,6 @@ export { isTypeDefinitionNode, isTypeSystemExtensionNode, isTypeExtensionNode, - RequiredStatus, } from './language/index'; export type { diff --git a/src/language/index.ts b/src/language/index.ts index fc0583ec6f..6095a0f76e 100644 --- a/src/language/index.ts +++ b/src/language/index.ts @@ -90,6 +90,7 @@ export type { UnionTypeExtensionNode, EnumTypeExtensionNode, InputObjectTypeExtensionNode, + RequiredStatus, } from './ast'; export { diff --git a/src/language/lexer.ts b/src/language/lexer.ts index dddfb831be..a050a52e78 100644 --- a/src/language/lexer.ts +++ b/src/language/lexer.ts @@ -282,7 +282,7 @@ function readNextToken(lexer: Lexer, start: number): Token { case 0x007d: // } return createToken(lexer, TokenKind.BRACE_R, position, position + 1); case 0x003f: // ? - return createToken(lexer, TokenKind.QUESTION_MARK, position, poistion + 1); + return createToken(lexer, TokenKind.QUESTION_MARK, position, position + 1); // StringValue case 0x0022: // " if ( From d17767dd924fc5fb01a16b49a3d9fc9c7b8ae323 Mon Sep 17 00:00:00 2001 From: Alex Reilly Date: Mon, 13 Sep 2021 19:29:38 -0700 Subject: [PATCH 03/64] fixed a couple tests --- src/language/__tests__/lexer-test.ts | 6 +++--- src/language/__tests__/parser-test.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/language/__tests__/lexer-test.ts b/src/language/__tests__/lexer-test.ts index 2e7c653fc3..e7b247fd2a 100644 --- a/src/language/__tests__/lexer-test.ts +++ b/src/language/__tests__/lexer-test.ts @@ -175,10 +175,10 @@ describe('Lexer', () => { expect(String(caughtError)).to.equal(dedent` Syntax Error: Unexpected character: "~". - GraphQL request:3:5 + GraphQL request:3:2 2 | - 3 | ~ - | ^ + 3 | ~ + | ^ 4 | `); }); diff --git a/src/language/__tests__/parser-test.ts b/src/language/__tests__/parser-test.ts index 58b5438bd9..6c61d2316f 100644 --- a/src/language/__tests__/parser-test.ts +++ b/src/language/__tests__/parser-test.ts @@ -397,7 +397,6 @@ describe('Parser', () => { name: undefined, variableDefinitions: [], directives: [], - required: 'unset', selectionSet: { kind: Kind.SELECTION_SET, loc: { start: 6, end: 29 }, @@ -429,6 +428,7 @@ describe('Parser', () => { }, arguments: [], directives: [], + required: 'unset', selectionSet: undefined, }, ], From c44ef34ac2dffc52cbef918de0a53c5bffbd40c4 Mon Sep 17 00:00:00 2001 From: Alex Reilly Date: Mon, 13 Sep 2021 19:35:38 -0700 Subject: [PATCH 04/64] all tests passing --- src/language/__tests__/parser-test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/language/__tests__/parser-test.ts b/src/language/__tests__/parser-test.ts index 6c61d2316f..df2c27acfd 100644 --- a/src/language/__tests__/parser-test.ts +++ b/src/language/__tests__/parser-test.ts @@ -305,7 +305,6 @@ describe('Parser', () => { name: undefined, variableDefinitions: [], directives: [], - required: 'unset', selectionSet: { kind: Kind.SELECTION_SET, loc: { start: 0, end: 40 }, @@ -352,6 +351,7 @@ describe('Parser', () => { }, arguments: [], directives: [], + required: 'unset', selectionSet: undefined, }, { @@ -365,6 +365,7 @@ describe('Parser', () => { }, arguments: [], directives: [], + required: 'unset', selectionSet: undefined, }, ], From 0155fff5a678560fce376b21ad531628dc8c8743 Mon Sep 17 00:00:00 2001 From: Alex Reilly Date: Mon, 13 Sep 2021 21:03:45 -0700 Subject: [PATCH 05/64] a few additional tests to cover optional cases --- .vscode/launch.json | 14 ++++++++++ package-lock.json | 15 ++++++++++ src/language/__tests__/parser-test.ts | 40 +++++++++++++++++++++++++++ 3 files changed, 69 insertions(+) create mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000000..05441b52e4 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,14 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Mocha Tests", + "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha", + "args": ["src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts"], + "internalConsoleOptions": "openOnSessionStart", + "skipFiles": ["/**"] + } + ] +} diff --git a/package-lock.json b/package-lock.json index 83efee6395..34e17715d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3893,6 +3893,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/espree": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", @@ -10170,6 +10179,12 @@ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true }, + "esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "dev": true + }, "espree": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", diff --git a/src/language/__tests__/parser-test.ts b/src/language/__tests__/parser-test.ts index df2c27acfd..e64d17f2ea 100644 --- a/src/language/__tests__/parser-test.ts +++ b/src/language/__tests__/parser-test.ts @@ -254,6 +254,16 @@ describe('Parser', () => { ).to.not.throw(); }); + it('parses optional with alias', () => { + expect(() => + parse(` + query { + requiredField: field? + } + `), + ).to.not.throw(); + }); + it('does not parse aliased field with bang on left of colon', () => { expect(() => parse(` @@ -264,6 +274,16 @@ describe('Parser', () => { ).to.throw(); }); + it('does not parse aliased field with question mark on left of colon', () => { + expect(() => + parse(` + query { + requiredField?: field + } + `), + ).to.throw(); + }); + it('does not parse aliased field with bang on left and right of colon', () => { expect(() => parse(` @@ -274,6 +294,16 @@ describe('Parser', () => { ).to.throw(); }); + it('does not parse aliased field with question mark on left and right of colon', () => { + expect(() => + parse(` + query { + requiredField?: field? + } + `), + ).to.throw(); + }); + it('parses required within fragment', () => { expect(() => parse(` @@ -284,6 +314,16 @@ describe('Parser', () => { ).to.not.throw(); }); + it('parses optional within fragment', () => { + expect(() => + parse(` + fragment MyFragment on Query { + field? + } + `), + ).to.not.throw(); + }); + it('creates ast', () => { const result = parse(dedent` { From c64a6d830dbacbe4386ca0de0b93ce3119bb6f46 Mon Sep 17 00:00:00 2001 From: Alex Reilly Date: Tue, 14 Sep 2021 23:37:02 -0700 Subject: [PATCH 06/64] additional tests --- .../OverlappingFieldsCanBeMergedRule-test.ts | 291 ++++++++++++++++-- 1 file changed, 258 insertions(+), 33 deletions(-) diff --git a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts index 8f2d51681b..d144ab8c09 100644 --- a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts +++ b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts @@ -254,26 +254,92 @@ describe('Validate: Overlapping fields can be merged', () => { `); }); - it('disallows different nullability status even if the types are mutual exclusive', () => { - expectErrors(` - fragment conflictingNullability on Pet { - ... on Dog { - name! + describe('disallows different nullability status even if the types are mutually exclusive', () => { + it('for required and unset', () => { + expectErrors(` + fragment conflictingNullability on Pet { + ... on Dog { + name! + } + ... on Cat { + name + } } - ... on Cat { - name + `).to.deep.equal([ + { + message: + 'Fields "name" conflict because they return conflicting types "String!" and "String". Use different aliases on the fields to fetch both if this was intentional.', + locations: [ + { line: 4, column: 13 }, + { line: 7, column: 13 }, + ], + }, + ]); + }); + + it('for required and optional', () => { + expectErrors(` + fragment conflictingNullability on Pet { + ... on Dog { + name! + } + ... on Cat { + name? + } } - } - `).to.deep.equal([ - { - message: - 'Fields "name" conflict because they return conflicting types "String!" and "String". Use different aliases on the fields to fetch both if this was intentional.', - locations: [ - { line: 4, column: 11 }, - { line: 7, column: 11 }, - ], - }, - ]); + `).to.deep.equal([ + { + message: + 'Fields "name" conflict because they return conflicting types "String!" and "String". Use different aliases on the fields to fetch both if this was intentional.', + locations: [ + { line: 4, column: 13 }, + { line: 7, column: 13 }, + ], + }, + ]); + }); + }); + + describe('allows same nullability on mutually exclusive types', () => { + it('for optional and unset', () => { + // this should be valid because name is nullable by default + expectValid(` + fragment conflictingNullability on Pet { + ... on Dog { + name? + } + ... on Cat { + name + } + } + `); + }); + + it('for optional and optional', () => { + expectValid(` + fragment conflictingNullability on Pet { + ... on Dog { + name? + } + ... on Cat { + name? + } + } + `); + }); + + it('for unset and unset', () => { + expectValid(` + fragment conflictingNullability on Pet { + ... on Dog { + name + } + ... on Cat { + name + } + } + `); + }); }); it('encounters conflict in fragments', () => { @@ -654,11 +720,7 @@ describe('Validate: Overlapping fields can be merged', () => { }); describe('nullable field on types which potentially overlap', () => { - it('matching nullability status', () => { - // This is invalid since an object could potentially be both the Object - // type IntBox and the interface type NonNullStringBox1. While that - // condition does not exist in the current schema, the schema could - // expand in the future to allow this. Thus it is invalid. + it('matching required status', () => { expectValidWithSchema( schema, ` @@ -676,11 +738,61 @@ describe('Validate: Overlapping fields can be merged', () => { ); }); - it('conflicting nullability status', () => { - // This is invalid since an object could potentially be both the Object - // type IntBox and the interface type NonNullStringBox1. While that - // condition does not exist in the current schema, the schema could - // expand in the future to allow this. Thus it is invalid. + it('matching optional status', () => { + expectValidWithSchema( + schema, + ` + { + someBox { + ...on SomeBox { + unrelatedField? + } + ...on IntBox { + unrelatedField? + } + } + } + `, + ); + }); + + it('matching unset status', () => { + expectValidWithSchema( + schema, + ` + { + someBox { + ...on SomeBox { + unrelatedField + } + ...on IntBox { + unrelatedField + } + } + } + `, + ); + }); + + it('matching optional and unset (optional) status', () => { + expectValidWithSchema( + schema, + ` + { + someBox { + ...on SomeBox { + unrelatedField? + } + ...on IntBox { + unrelatedField + } + } + } + `, + ); + }); + + it('conflicting required and unset (optional) status', () => { expectErrorsWithSchema( schema, ` @@ -707,11 +819,34 @@ describe('Validate: Overlapping fields can be merged', () => { ]); }); - it('conflicting nullability status with aliases', () => { - // This is invalid since an object could potentially be both the Object - // type IntBox and the interface type NonNullStringBox1. While that - // condition does not exist in the current schema, the schema could - // expand in the future to allow this. Thus it is invalid. + it('conflicting required and optional status', () => { + expectErrorsWithSchema( + schema, + ` + { + someBox { + ...on SomeBox { + unrelatedField? + } + ...on IntBox { + unrelatedField! + } + } + } + `, + ).to.deep.equal([ + { + message: + 'Fields "unrelatedField" conflict because they return conflicting types "String" and "String!". Use different aliases on the fields to fetch both if this was intentional.', + locations: [ + { line: 5, column: 19 }, + { line: 8, column: 19 }, + ], + }, + ]); + }); + + it('conflicting required and unset (optional) status with aliases', () => { expectValidWithSchema( schema, ` @@ -728,6 +863,96 @@ describe('Validate: Overlapping fields can be merged', () => { `, ); }); + + it('conflicting required and optional status with aliases', () => { + expectValidWithSchema( + schema, + ` + { + someBox { + ...on SomeBox { + nullable: unrelatedField! + } + ...on IntBox { + nonNullable: unrelatedField? + } + } + } + `, + ); + }); + + it('matching optional and unset (optional) status with aliases', () => { + expectValidWithSchema( + schema, + ` + { + someBox { + ...on SomeBox { + unset: unrelatedField + } + ...on IntBox { + nonNullable: unrelatedField? + } + } + } + `, + ); + }); + + it('matching required and required status with aliases', () => { + expectValidWithSchema( + schema, + ` + { + someBox { + ...on SomeBox { + otherNonnullable: unrelatedField! + } + ...on IntBox { + nonNullable: unrelatedField! + } + } + } + `, + ); + }); + + it('matching optional and optional status with aliases', () => { + expectValidWithSchema( + schema, + ` + { + someBox { + ...on SomeBox { + nullable: unrelatedField? + } + ...on IntBox { + otherNullable: unrelatedField? + } + } + } + `, + ); + }); + + it('matching unset and unset status with aliases', () => { + expectValidWithSchema( + schema, + ` + { + someBox { + ...on SomeBox { + unset: unrelatedField + } + ...on IntBox { + otherUnset: unrelatedField + } + } + } + `, + ); + }); }); describe('non-nullable field on types which potentially overlap', () => { From 44679b49812cdde394efbf3fc60fb36eabdc1802 Mon Sep 17 00:00:00 2001 From: Alex Reilly Date: Thu, 16 Sep 2021 00:48:09 -0700 Subject: [PATCH 07/64] cleaned up execution tests --- src/execution/__tests__/executor-test.ts | 259 ++++++++++-------- .../OverlappingFieldsCanBeMergedRule-test.ts | 94 ++++++- 2 files changed, 243 insertions(+), 110 deletions(-) diff --git a/src/execution/__tests__/executor-test.ts b/src/execution/__tests__/executor-test.ts index 5086ee4263..22df100fda 100644 --- a/src/execution/__tests__/executor-test.ts +++ b/src/execution/__tests__/executor-test.ts @@ -1270,7 +1270,7 @@ describe('Execute: Handles basic execution tasks', () => { expect(possibleTypes).to.deep.equal([fooObject]); }); - it('bubbles null up to nearest nullable parent', () => { + describe('deals with ! and ?', () => { const schema = new GraphQLSchema({ query: new GraphQLObjectType({ name: 'Query', @@ -1294,130 +1294,173 @@ describe('Execute: Handles basic execution tasks', () => { }), }); - const plainDocument = parse(` - query { - food { - name - calories + it('smoketest', () => { + const plainDocument = parse(` + query { + food { + name + calories + } } - } - `); - const plainResult = executeSync({ schema, document: plainDocument }); + `); + const plainResult = executeSync({ schema, document: plainDocument }); - expect(plainResult).to.deep.equal({ - data: { food: { name: null, calories: 10 } }, + expect(plainResult).to.deep.equal({ + data: { food: { name: null, calories: 10 } }, + }); }); - const singleNonNullOnNullValueDocument = parse(` - query { - food { - name! - calories + it('null bubbles up when field that returns null is required', () => { + const singleNonNullOnNullValueDocument = parse(` + query { + food { + name! + calories + } } - } - `); - const singleNonNullOnNullValueResult = executeSync({ - schema, - document: singleNonNullOnNullValueDocument, - }); - - expect(singleNonNullOnNullValueResult).to.deep.equal({ - data: { food: null }, - errors: [ - { - locations: [{ column: 11, line: 4 }], - message: 'Cannot return null for non-nullable field Food.name.', - path: ['food', 'name'], - }, - ], + `); + const singleNonNullOnNullValueResult = executeSync({ + schema, + document: singleNonNullOnNullValueDocument, + }); + + expect(singleNonNullOnNullValueResult).to.deep.equal({ + data: { food: null }, + errors: [ + { + locations: [{ column: 13, line: 4 }], + message: 'Cannot return null for non-nullable field Food.name.', + path: ['food', 'name'], + }, + ], + }); }); - const bothNonNullOnNullValueDocument = parse(` - query { - food { - name! - calories! + it('null bubbles up when field that returns null and field that does not are both required', () => { + const bothNonNullOnNullValueDocument = parse(` + query { + food { + name! + calories! + } } - } - `); - const bothNonNullOnNullValueResult = executeSync({ - schema, - document: bothNonNullOnNullValueDocument, - }); - - expect(bothNonNullOnNullValueResult).to.deep.equal({ - data: { food: null }, - errors: [ - { - locations: [{ column: 11, line: 4 }], - message: 'Cannot return null for non-nullable field Food.name.', - path: ['food', 'name'], - }, - ], - }); - - const singleNonNullOnNonNullValueDocument = parse(` - query { - food { - calories! + `); + const bothNonNullOnNullValueResult = executeSync({ + schema, + document: bothNonNullOnNullValueDocument, + }); + + expect(bothNonNullOnNullValueResult).to.deep.equal({ + data: { food: null }, + errors: [ + { + locations: [{ column: 13, line: 4 }], + message: 'Cannot return null for non-nullable field Food.name.', + path: ['food', 'name'], + }, + ], + }); + }); + + it('null bubbles up when field that returns null is required', () => { + const singleNonNullOnNonNullValueDocument = parse(` + query { + food { + calories! + } } - } - `); - const singleNonNullOnNonNullValueResult = executeSync({ - schema, - document: singleNonNullOnNonNullValueDocument, - }); - - expect(singleNonNullOnNonNullValueResult).to.deep.equal({ - data: { food: { calories: 10 } }, - }); - - const nonNullAliasOnNullValueDocument = parse(` - query { - food { - theNameOfTheFood: name! + `); + const singleNonNullOnNonNullValueResult = executeSync({ + schema, + document: singleNonNullOnNonNullValueDocument, + }); + + expect(singleNonNullOnNonNullValueResult).to.deep.equal({ + data: { food: { calories: 10 } }, + }); + }); + + it('null bubbles up when field that returns null is aliased and required', () => { + const nonNullAliasOnNullValueDocument = parse(` + query { + food { + theNameOfTheFood: name! + } } - } - `); - const nonNullAliasOnNullValueResult = executeSync({ - schema, - document: nonNullAliasOnNullValueDocument, + `); + const nonNullAliasOnNullValueResult = executeSync({ + schema, + document: nonNullAliasOnNullValueDocument, + }); + + expect(nonNullAliasOnNullValueResult).to.deep.equal({ + data: { food: null }, + errors: [ + { + locations: [{ column: 13, line: 4 }], + message: 'Cannot return null for non-nullable field Food.name.', + path: ['food', 'theNameOfTheFood'], + }, + ], + }); }); - expect(nonNullAliasOnNullValueResult).to.deep.equal({ - data: { food: null }, - errors: [ - { - locations: [{ column: 11, line: 4 }], - message: 'Cannot return null for non-nullable field Food.name.', - path: ['food', 'theNameOfTheFood'], - }, - ], + it('null bubbles up when field that returns null is required and inside an inline fragment', () => { + const nonNullInFragmentDocument = parse(` + query { + food { + ... on Food { + name! + } + } + } + `); + const nonNullInFragmentResult = executeSync({ + schema, + document: nonNullInFragmentDocument, + }); + + expect(nonNullInFragmentResult).to.deep.equal({ + data: { food: null }, + errors: [ + { + locations: [{ column: 15, line: 5 }], + message: 'Cannot return null for non-nullable field Food.name.', + path: ['food', 'name'], + }, + ], + }); }); - const nonNullInFragmentDocument = parse(` - query { - food { - ... on Food { + it('null bubbles up when field that returns null is required, but other aliased value is unaffected', () => { + const aliasedNullAndNonNull = parse(` + query { + nonNullable: food { name! + calories! } - } - } - `); - const nonNullInFragmentResult = executeSync({ - schema, - document: nonNullInFragmentDocument, - }); - expect(nonNullInFragmentResult).to.deep.equal({ - data: { food: null }, - errors: [ - { - locations: [{ column: 13, line: 5 }], - message: 'Cannot return null for non-nullable field Food.name.', - path: ['food', 'name'], - }, - ], + nullable: food { + name + calories! + } + } + `); + const aliasedNullAndNonNullResult = executeSync({ + schema, + document: aliasedNullAndNonNull, + }); + + expect(aliasedNullAndNonNullResult).to.deep.equal({ + data: { nonNullable: null, nullable: { calories: 10, name: null } }, + errors: [ + { + locations: [{ column: 13, line: 4 }], + message: 'Cannot return null for non-nullable field Food.name.', + path: ['nonNullable', 'name'], + }, + ], + }); }); }); }); diff --git a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts index d144ab8c09..eb3d67ed17 100644 --- a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts +++ b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts @@ -956,7 +956,7 @@ describe('Validate: Overlapping fields can be merged', () => { }); describe('non-nullable field on types which potentially overlap', () => { - it('matching nullability status', () => { + it('matching required status', () => { expectValidWithSchema( schema, ` @@ -974,7 +974,7 @@ describe('Validate: Overlapping fields can be merged', () => { ); }); - it('conflicting nullability status', () => { + it('matching required and unset (required) nullability status', () => { expectValidWithSchema( schema, ` @@ -991,6 +991,96 @@ describe('Validate: Overlapping fields can be merged', () => { `, ); }); + + it('matching optional and optional nullability status', () => { + expectValidWithSchema( + schema, + ` + { + someBox { + ...on NonNullStringBox1 { + scalar? + } + ...on NonNullStringBox1Impl { + scalar? + } + } + } + `, + ); + }); + + it('matching unset and unset nullability status', () => { + expectValidWithSchema( + schema, + ` + { + someBox { + ...on NonNullStringBox1 { + scalar + } + ...on NonNullStringBox1Impl { + scalar + } + } + } + `, + ); + }); + + it('conflicting optional and required nullability status', () => { + expectErrorsWithSchema( + schema, + ` + { + someBox { + ...on NonNullStringBox1 { + scalar? + } + ...on NonNullStringBox1Impl { + scalar! + } + } + } + `, + ).to.deep.equal([ + { + message: + 'Fields "scalar" conflict because they return conflicting types "String" and "String!". Use different aliases on the fields to fetch both if this was intentional.', + locations: [ + { line: 5, column: 19 }, + { line: 8, column: 19 }, + ], + }, + ]); + }); + + it('conflicting optional and unset (required) nullability status', () => { + expectErrorsWithSchema( + schema, + ` + { + someBox { + ...on NonNullStringBox1 { + scalar? + } + ...on NonNullStringBox1Impl { + scalar + } + } + } + `, + ).to.deep.equal([ + { + message: + 'Fields "scalar" conflict because they return conflicting types "String" and "String!". Use different aliases on the fields to fetch both if this was intentional.', + locations: [ + { line: 5, column: 19 }, + { line: 8, column: 19 }, + ], + }, + ]); + }); it('conflicting nullability status with aliases', () => { expectValidWithSchema( From eb1561b56ee77b0721a323276fcab05ac510a95c Mon Sep 17 00:00:00 2001 From: Alex Reilly Date: Sun, 19 Sep 2021 14:22:10 -0700 Subject: [PATCH 08/64] add exclusive types tests --- .../OverlappingFieldsCanBeMergedRule-test.ts | 164 ++++++++++++++++++ 1 file changed, 164 insertions(+) diff --git a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts index eb3d67ed17..7e3318a841 100644 --- a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts +++ b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts @@ -1101,6 +1101,170 @@ describe('Validate: Overlapping fields can be merged', () => { }); }); + describe('Exclusive types without aliases', () => { + it('conflicting optional and required nullability status', () =>{ + expectErrorsWithSchema( + schema, + ` + { + someBox { + ... on IntBox { + scalar! + } + ... on StringBox { + scalar? + } + } + } + ` + ).to.deep.equal([ + { + message: + 'Fields "scalar" conflict because they return conflicting types "Int!" and "String". Use different aliases on the fields to fetch both if this was intentional.', + locations: [ + { line: 5, column: 19 }, + { line: 8, column: 19 }, + ], + }, + ]); + }); + + it('matching optional and optional nullability status', () =>{ + expectErrorsWithSchema( + schema, + ` + { + someBox { + ... on IntBox { + scalar? + } + ... on StringBox { + scalar? + } + } + } + ` + ).to.deep.equal([ + { + message: + 'Fields "scalar" conflict because they return conflicting types "Int" and "String". Use different aliases on the fields to fetch both if this was intentional.', + locations: [ + { line: 5, column: 19 }, + { line: 8, column: 19 }, + ], + }, + ]); + }); + + it('matching required and required nullability status', () =>{ + expectErrorsWithSchema( + schema, + ` + { + someBox { + ... on IntBox { + scalar! + } + ... on StringBox { + scalar! + } + } + } + ` + ).to.deep.equal([ + { + message: + 'Fields "scalar" conflict because they return conflicting types "Int!" and "String!". Use different aliases on the fields to fetch both if this was intentional.', + locations: [ + { line: 5, column: 19 }, + { line: 8, column: 19 }, + ], + }, + ]); + }); + + it('conflicting unset (optional) and required nullability status', () =>{ + expectErrorsWithSchema( + schema, + ` + { + someBox { + ... on IntBox { + scalar + } + ... on StringBox { + scalar! + } + } + } + ` + ).to.deep.equal([ + { + message: + 'Fields "scalar" conflict because they return conflicting types "Int" and "String!". Use different aliases on the fields to fetch both if this was intentional.', + locations: [ + { line: 5, column: 19 }, + { line: 8, column: 19 }, + ], + }, + ]); + }); + + it('matching unset (optional) and optional nullability status', () =>{ + expectErrorsWithSchema( + schema, + ` + { + someBox { + ... on IntBox { + scalar + } + ... on StringBox { + scalar? + } + } + } + ` + ).to.deep.equal([ + { + message: + 'Fields "scalar" conflict because they return conflicting types "Int" and "String". Use different aliases on the fields to fetch both if this was intentional.', + locations: [ + { line: 5, column: 19 }, + { line: 8, column: 19 }, + ], + }, + ]); + }); + + it('matching unset (optional) and unset (optional) nullability status', () =>{ + expectErrorsWithSchema( + schema, + ` + { + someBox { + ... on IntBox { + scalar + } + ... on StringBox { + scalar + } + } + } + ` + ).to.deep.equal([ + { + message: + 'Fields "scalar" conflict because they return conflicting types "Int" and "String". Use different aliases on the fields to fetch both if this was intentional.', + locations: [ + { line: 5, column: 19 }, + { line: 8, column: 19 }, + ], + }, + ]); + }); + }); + it('compatible return shapes on different return types', () => { // In this case `deepBox` returns `SomeBox` in the first usage, and // `StringBox` in the second usage. These return types are not the same! From 9c5a661a96369ace0b924ea6dade10a3786b843f Mon Sep 17 00:00:00 2001 From: Alex Reilly Date: Sun, 19 Sep 2021 16:01:04 -0700 Subject: [PATCH 09/64] corrected executor test name --- src/execution/__tests__/executor-test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/execution/__tests__/executor-test.ts b/src/execution/__tests__/executor-test.ts index 22df100fda..64369df73f 100644 --- a/src/execution/__tests__/executor-test.ts +++ b/src/execution/__tests__/executor-test.ts @@ -1362,7 +1362,7 @@ describe('Execute: Handles basic execution tasks', () => { }); }); - it('null bubbles up when field that returns null is required', () => { + it('null does not bubble up when field that returns does not return null is required', () => { const singleNonNullOnNonNullValueDocument = parse(` query { food { From 8e4c735596cd2fd67a366fb5651b19edc9566879 Mon Sep 17 00:00:00 2001 From: twof Date: Tue, 5 Oct 2021 14:02:17 -0700 Subject: [PATCH 10/64] nonnull fields with aliases tests passing --- .../OverlappingFieldsCanBeMergedRule-test.ts | 96 ++++++++++++++++++- 1 file changed, 93 insertions(+), 3 deletions(-) diff --git a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts index 7e3318a841..378d936b9a 100644 --- a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts +++ b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts @@ -719,7 +719,7 @@ describe('Validate: Overlapping fields can be merged', () => { ]); }); - describe('nullable field on types which potentially overlap', () => { + describe('Nullable field on types which potentially overlap', () => { it('matching required status', () => { expectValidWithSchema( schema, @@ -955,7 +955,7 @@ describe('Validate: Overlapping fields can be merged', () => { }); }); - describe('non-nullable field on types which potentially overlap', () => { + describe('Non-nullable field on types which potentially overlap', () => { it('matching required status', () => { expectValidWithSchema( schema, @@ -1082,7 +1082,61 @@ describe('Validate: Overlapping fields can be merged', () => { ]); }); - it('conflicting nullability status with aliases', () => { + it('conflicting requred and optional nullability status with aliases', () => { + expectValidWithSchema( + schema, + ` + { + someBox { + ...on NonNullStringBox1 { + nonNullable: scalar! + } + ...on NonNullStringBox1Impl { + nullable: scalar? + } + } + } + `, + ); + }); + + it('matching optional and optional nullability status with aliases', () => { + expectValidWithSchema( + schema, + ` + { + someBox { + ...on NonNullStringBox1 { + alsoNullable: scalar? + } + ...on NonNullStringBox1Impl { + nullable: scalar? + } + } + } + `, + ); + }); + + it('matching required and required nullability status with aliases', () => { + expectValidWithSchema( + schema, + ` + { + someBox { + ...on NonNullStringBox1 { + nonNullable: scalar! + } + ...on NonNullStringBox1Impl { + alsoNonNullable: scalar! + } + } + } + `, + ); + }); + + it('conflicting required and unset (requred) nullability status with aliases', () => { expectValidWithSchema( schema, ` @@ -1099,6 +1153,42 @@ describe('Validate: Overlapping fields can be merged', () => { `, ); }); + + it('matching optional and unset (required) nullability status with aliases', () => { + expectValidWithSchema( + schema, + ` + { + someBox { + ...on NonNullStringBox1 { + nullable: scalar? + } + ...on NonNullStringBox1Impl { + nonNullable: scalar + } + } + } + `, + ); + }); + + it('matching unset (required) and unset (required) nullability status with aliases', () => { + expectValidWithSchema( + schema, + ` + { + someBox { + ...on NonNullStringBox1 { + nonNullable: scalar + } + ...on NonNullStringBox1Impl { + alsoNonNullable: scalar + } + } + } + `, + ); + }); }); describe('Exclusive types without aliases', () => { From e7bcecc1c2960d5684f25eee9777349997bb438a Mon Sep 17 00:00:00 2001 From: twof Date: Tue, 5 Oct 2021 14:05:24 -0700 Subject: [PATCH 11/64] revert dependency changes --- package-lock.json | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index 34e17715d6..83efee6395 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3893,15 +3893,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/espree": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", @@ -10179,12 +10170,6 @@ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true }, - "esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", - "dev": true - }, "espree": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", From 461e08652bb536176acaee5046cfc98fd8fd6f27 Mon Sep 17 00:00:00 2001 From: twof Date: Tue, 5 Oct 2021 14:12:52 -0700 Subject: [PATCH 12/64] remove vscode config --- .vscode/launch.json | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 05441b52e4..0000000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "type": "node", - "request": "launch", - "name": "Mocha Tests", - "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha", - "args": ["src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts"], - "internalConsoleOptions": "openOnSessionStart", - "skipFiles": ["/**"] - } - ] -} From c88fa627cc8643ebae50ce5d5ffa9b2fcc7d8a07 Mon Sep 17 00:00:00 2001 From: twof Date: Mon, 11 Oct 2021 18:07:04 -0700 Subject: [PATCH 13/64] code style fixes --- src/execution/__tests__/executor-test.ts | 2 +- src/language/lexer.ts | 7 ++++- src/language/printer.ts | 2 +- src/utilities/applyRequiredStatus.ts | 2 +- src/utilities/index.ts | 2 +- .../OverlappingFieldsCanBeMergedRule-test.ts | 28 +++++++++---------- 6 files changed, 24 insertions(+), 19 deletions(-) diff --git a/src/execution/__tests__/executor-test.ts b/src/execution/__tests__/executor-test.ts index 64369df73f..67e00734fb 100644 --- a/src/execution/__tests__/executor-test.ts +++ b/src/execution/__tests__/executor-test.ts @@ -1361,7 +1361,7 @@ describe('Execute: Handles basic execution tasks', () => { ], }); }); - + it('null does not bubble up when field that returns does not return null is required', () => { const singleNonNullOnNonNullValueDocument = parse(` query { diff --git a/src/language/lexer.ts b/src/language/lexer.ts index a050a52e78..2fac1754cb 100644 --- a/src/language/lexer.ts +++ b/src/language/lexer.ts @@ -282,7 +282,12 @@ function readNextToken(lexer: Lexer, start: number): Token { case 0x007d: // } return createToken(lexer, TokenKind.BRACE_R, position, position + 1); case 0x003f: // ? - return createToken(lexer, TokenKind.QUESTION_MARK, position, position + 1); + return createToken( + lexer, + TokenKind.QUESTION_MARK, + position, + position + 1, + ); // StringValue case 0x0022: // " if ( diff --git a/src/language/printer.ts b/src/language/printer.ts index ec8bfa814d..e920d27c91 100644 --- a/src/language/printer.ts +++ b/src/language/printer.ts @@ -69,7 +69,7 @@ const printDocASTReducer: ASTReducer = { } else if (required === 'optional') { prefix += '?'; } - + let argsLine = prefix + wrap('(', join(args, ', '), ')'); if (argsLine.length > MAX_LINE_LENGTH) { diff --git a/src/utilities/applyRequiredStatus.ts b/src/utilities/applyRequiredStatus.ts index ab74fb27fb..6a554c2585 100644 --- a/src/utilities/applyRequiredStatus.ts +++ b/src/utilities/applyRequiredStatus.ts @@ -16,4 +16,4 @@ export function modifiedOutputType( return getNullableType(type); } return type; -} \ No newline at end of file +} diff --git a/src/utilities/index.ts b/src/utilities/index.ts index e19d00aa19..8c846686e0 100644 --- a/src/utilities/index.ts +++ b/src/utilities/index.ts @@ -107,4 +107,4 @@ export type { BreakingChange, DangerousChange } from './findBreakingChanges'; /** Wrapper type that contains DocumentNode and types that can be deduced from it. */ export type { TypedQueryDocumentNode } from './typedQueryDocumentNode'; -export { modifiedOutputType } from './applyRequiredStatus'; \ No newline at end of file +export { modifiedOutputType } from './applyRequiredStatus'; diff --git a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts index 378d936b9a..a1254c45ed 100644 --- a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts +++ b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts @@ -991,7 +991,7 @@ describe('Validate: Overlapping fields can be merged', () => { `, ); }); - + it('matching optional and optional nullability status', () => { expectValidWithSchema( schema, @@ -1027,7 +1027,7 @@ describe('Validate: Overlapping fields can be merged', () => { `, ); }); - + it('conflicting optional and required nullability status', () => { expectErrorsWithSchema( schema, @@ -1192,7 +1192,7 @@ describe('Validate: Overlapping fields can be merged', () => { }); describe('Exclusive types without aliases', () => { - it('conflicting optional and required nullability status', () =>{ + it('conflicting optional and required nullability status', () => { expectErrorsWithSchema( schema, ` @@ -1206,7 +1206,7 @@ describe('Validate: Overlapping fields can be merged', () => { } } } - ` + `, ).to.deep.equal([ { message: @@ -1219,7 +1219,7 @@ describe('Validate: Overlapping fields can be merged', () => { ]); }); - it('matching optional and optional nullability status', () =>{ + it('matching optional and optional nullability status', () => { expectErrorsWithSchema( schema, ` @@ -1233,7 +1233,7 @@ describe('Validate: Overlapping fields can be merged', () => { } } } - ` + `, ).to.deep.equal([ { message: @@ -1246,7 +1246,7 @@ describe('Validate: Overlapping fields can be merged', () => { ]); }); - it('matching required and required nullability status', () =>{ + it('matching required and required nullability status', () => { expectErrorsWithSchema( schema, ` @@ -1260,7 +1260,7 @@ describe('Validate: Overlapping fields can be merged', () => { } } } - ` + `, ).to.deep.equal([ { message: @@ -1273,7 +1273,7 @@ describe('Validate: Overlapping fields can be merged', () => { ]); }); - it('conflicting unset (optional) and required nullability status', () =>{ + it('conflicting unset (optional) and required nullability status', () => { expectErrorsWithSchema( schema, ` @@ -1287,7 +1287,7 @@ describe('Validate: Overlapping fields can be merged', () => { } } } - ` + `, ).to.deep.equal([ { message: @@ -1300,7 +1300,7 @@ describe('Validate: Overlapping fields can be merged', () => { ]); }); - it('matching unset (optional) and optional nullability status', () =>{ + it('matching unset (optional) and optional nullability status', () => { expectErrorsWithSchema( schema, ` @@ -1314,7 +1314,7 @@ describe('Validate: Overlapping fields can be merged', () => { } } } - ` + `, ).to.deep.equal([ { message: @@ -1327,7 +1327,7 @@ describe('Validate: Overlapping fields can be merged', () => { ]); }); - it('matching unset (optional) and unset (optional) nullability status', () =>{ + it('matching unset (optional) and unset (optional) nullability status', () => { expectErrorsWithSchema( schema, ` @@ -1341,7 +1341,7 @@ describe('Validate: Overlapping fields can be merged', () => { } } } - ` + `, ).to.deep.equal([ { message: From 94dce47a9ad43c4b402f22c7fcc55889685806ca Mon Sep 17 00:00:00 2001 From: twof Date: Mon, 11 Oct 2021 18:35:10 -0700 Subject: [PATCH 14/64] resolved errors with executor-test --- src/execution/__tests__/executor-test.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/execution/__tests__/executor-test.ts b/src/execution/__tests__/executor-test.ts index 67e00734fb..7bfdb6e8ca 100644 --- a/src/execution/__tests__/executor-test.ts +++ b/src/execution/__tests__/executor-test.ts @@ -1324,7 +1324,7 @@ describe('Execute: Handles basic execution tasks', () => { document: singleNonNullOnNullValueDocument, }); - expect(singleNonNullOnNullValueResult).to.deep.equal({ + expectJSON(singleNonNullOnNullValueResult).to.deep.equal({ data: { food: null }, errors: [ { @@ -1350,7 +1350,7 @@ describe('Execute: Handles basic execution tasks', () => { document: bothNonNullOnNullValueDocument, }); - expect(bothNonNullOnNullValueResult).to.deep.equal({ + expectJSON(bothNonNullOnNullValueResult).to.deep.equal({ data: { food: null }, errors: [ { @@ -1393,7 +1393,7 @@ describe('Execute: Handles basic execution tasks', () => { document: nonNullAliasOnNullValueDocument, }); - expect(nonNullAliasOnNullValueResult).to.deep.equal({ + expectJSON(nonNullAliasOnNullValueResult).to.deep.equal({ data: { food: null }, errors: [ { @@ -1420,7 +1420,7 @@ describe('Execute: Handles basic execution tasks', () => { document: nonNullInFragmentDocument, }); - expect(nonNullInFragmentResult).to.deep.equal({ + expectJSON(nonNullInFragmentResult).to.deep.equal({ data: { food: null }, errors: [ { @@ -1451,7 +1451,7 @@ describe('Execute: Handles basic execution tasks', () => { document: aliasedNullAndNonNull, }); - expect(aliasedNullAndNonNullResult).to.deep.equal({ + expectJSON(aliasedNullAndNonNullResult).to.deep.equal({ data: { nonNullable: null, nullable: { calories: 10, name: null } }, errors: [ { From cbeb96d86cf5434c756074373035628d1a62e1cb Mon Sep 17 00:00:00 2001 From: twof Date: Mon, 11 Oct 2021 23:24:42 -0700 Subject: [PATCH 15/64] fix spelling --- src/execution/__tests__/executor-test.ts | 2 +- .../__tests__/OverlappingFieldsCanBeMergedRule-test.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/execution/__tests__/executor-test.ts b/src/execution/__tests__/executor-test.ts index 7bfdb6e8ca..5d33d9a9d8 100644 --- a/src/execution/__tests__/executor-test.ts +++ b/src/execution/__tests__/executor-test.ts @@ -1294,7 +1294,7 @@ describe('Execute: Handles basic execution tasks', () => { }), }); - it('smoketest', () => { + it('smoke test', () => { const plainDocument = parse(` query { food { diff --git a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts index a1254c45ed..6b427aec2c 100644 --- a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts +++ b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts @@ -907,7 +907,7 @@ describe('Validate: Overlapping fields can be merged', () => { { someBox { ...on SomeBox { - otherNonnullable: unrelatedField! + otherNonNullable: unrelatedField! } ...on IntBox { nonNullable: unrelatedField! @@ -1082,7 +1082,7 @@ describe('Validate: Overlapping fields can be merged', () => { ]); }); - it('conflicting requred and optional nullability status with aliases', () => { + it('conflicting required and optional nullability status with aliases', () => { expectValidWithSchema( schema, ` @@ -1136,7 +1136,7 @@ describe('Validate: Overlapping fields can be merged', () => { ); }); - it('conflicting required and unset (requred) nullability status with aliases', () => { + it('conflicting required and unset (required) nullability status with aliases', () => { expectValidWithSchema( schema, ` From 33ba3bdc8cb9ceeeca668322ea064805c77a6e5b Mon Sep 17 00:00:00 2001 From: twof Date: Mon, 1 Nov 2021 23:20:23 -0700 Subject: [PATCH 16/64] fi some comments to reflect the sections from the spec they implement --- src/execution/execute.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/execution/execute.ts b/src/execution/execute.ts index 35bf3b5b6d..031c6baa32 100644 --- a/src/execution/execute.ts +++ b/src/execution/execute.ts @@ -431,7 +431,7 @@ function executeFieldsSerially( } /** - * Implements the "Executing selection sets" section of the spec + * Implements the "Executing Selection Sets" section of the spec * for fields that may be executed in parallel. */ function executeFields( @@ -474,7 +474,7 @@ function executeFields( } /** - * Implements the "Executing field" section of the spec + * Implements the "Executing Fields" section of the spec * In particular, this function figures out the value that the field returns by * calling its resolve function, then calls completeValue to complete promises, * serialize scalars, or execute the sub-selection-set for objects. @@ -596,7 +596,7 @@ function handleFieldError( /** * Implements the instructions for completeValue as defined in the - * "Field entries" section of the spec. + * "Value Completion" section of the spec. * * If the field type is Non-Null, then this recursively completes the value * for the inner type. It throws a field error if that completion returns null, From f70f0d73161b600603919f7dcd0b64a1e03106f3 Mon Sep 17 00:00:00 2001 From: twof Date: Mon, 1 Nov 2021 23:56:57 -0700 Subject: [PATCH 17/64] add docs to modifiedOutputType --- src/utilities/applyRequiredStatus.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/utilities/applyRequiredStatus.ts b/src/utilities/applyRequiredStatus.ts index 6a554c2585..3b9a23fd43 100644 --- a/src/utilities/applyRequiredStatus.ts +++ b/src/utilities/applyRequiredStatus.ts @@ -6,6 +6,12 @@ import { isNonNullType, } from '../type/definition'; +/** + * Implements the "Accounting For Client Controlled Nullability Designators" + * section of the spec. In particular, this function figures out the true return + * type of a field by taking into account both the nullability listed in the + * schema, and the nullability providing by an operation. + */ export function modifiedOutputType( type: GraphQLOutputType, required: RequiredStatus, From f84829e457e0dd1a669f77a75d76155f8408de16 Mon Sep 17 00:00:00 2001 From: twof Date: Mon, 1 Nov 2021 23:58:12 -0700 Subject: [PATCH 18/64] prettier --- src/utilities/applyRequiredStatus.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utilities/applyRequiredStatus.ts b/src/utilities/applyRequiredStatus.ts index 3b9a23fd43..a62d40c243 100644 --- a/src/utilities/applyRequiredStatus.ts +++ b/src/utilities/applyRequiredStatus.ts @@ -7,7 +7,7 @@ import { } from '../type/definition'; /** - * Implements the "Accounting For Client Controlled Nullability Designators" + * Implements the "Accounting For Client Controlled Nullability Designators" * section of the spec. In particular, this function figures out the true return * type of a field by taking into account both the nullability listed in the * schema, and the nullability providing by an operation. From 432499b5c8e38c7afd9a2d4e88d5489b141f5a41 Mon Sep 17 00:00:00 2001 From: twof Date: Tue, 9 Nov 2021 18:44:33 -0800 Subject: [PATCH 19/64] list nullability printer tests --- src/__testUtils__/kitchenSinkQuery.ts | 7 +++++++ src/language/__tests__/printer-test.ts | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/src/__testUtils__/kitchenSinkQuery.ts b/src/__testUtils__/kitchenSinkQuery.ts index 9002a679bb..8c66af347e 100644 --- a/src/__testUtils__/kitchenSinkQuery.ts +++ b/src/__testUtils__/kitchenSinkQuery.ts @@ -14,6 +14,13 @@ query queryName($foo: ComplexType, $site: Site = MOBILE) @onQuery { requiredField4: field4! field5? optionalField6: field6? + unsetListItemsRequiredList: listField[]! + requiredListItemsUnsetList: listField[!] + requiredListItemsRequiredList: listField[!]! + unsetListItemsOptionalList: listField[]? + optionalListItemsUnsetList: listField[?] + optionalListItemsOptionalList: listField[?]? + multidimensionalList: listField[[[!]!]!]! } ... @skip(unless: $foo) { id diff --git a/src/language/__tests__/printer-test.ts b/src/language/__tests__/printer-test.ts index c8dae54e3f..5149f38bfe 100644 --- a/src/language/__tests__/printer-test.ts +++ b/src/language/__tests__/printer-test.ts @@ -170,6 +170,13 @@ describe('Printer: Query document', () => { requiredField4: field4! field5? optionalField6: field6? + unsetListItemsRequiredList: listField[]! + requiredListItemsUnsetList: listField[!] + requiredListItemsRequiredList: listField[!]! + unsetListItemsOptionalList: listField[]? + optionalListItemsUnsetList: listField[?] + optionalListItemsOptionalList: listField[?]? + multidimensionalList: listField[[[!]!]!]! } ... @skip(unless: $foo) { id From 7277ec52d7476094c446007f66dde4ae389af09b Mon Sep 17 00:00:00 2001 From: twof Date: Tue, 9 Nov 2021 23:46:14 -0800 Subject: [PATCH 20/64] Have a more complex required status, and parse it out --- src/language/ast.ts | 18 ++++++++++++- src/language/index.ts | 1 + src/language/lexer.ts | 7 +----- src/language/parser.ts | 57 ++++++++++++++++++++++++++++++++++++------ 4 files changed, 68 insertions(+), 15 deletions(-) diff --git a/src/language/ast.ts b/src/language/ast.ts index 35eb39ec8e..16e9cdc4a9 100644 --- a/src/language/ast.ts +++ b/src/language/ast.ts @@ -1,4 +1,5 @@ import type { Kind } from './kinds'; +import { stat } from 'fs'; import type { Source } from './source'; import type { TokenKind } from './tokenKind'; @@ -354,6 +355,21 @@ export type SelectionNode = FieldNode | FragmentSpreadNode | InlineFragmentNode; export type RequiredStatus = 'required' | 'optional' | 'unset'; + +export class ComplexRequiredStatus { + readonly status: RequiredStatus; + // Exists if status is on a List. + // This setup doesn't leave room for container types + // that have multiple fields like a Dictionary + // so it will need to be fixed when that comes up, but probably prior. + readonly subStatus?: ComplexRequiredStatus; + + constructor(status: RequiredStatus, subStatus?: ComplexRequiredStatus) { + this.status = status; + this.subStatus = subStatus; + } +} + export interface FieldNode { readonly kind: Kind.FIELD; readonly loc?: Location; @@ -362,7 +378,7 @@ export interface FieldNode { readonly arguments?: ReadonlyArray; readonly directives?: ReadonlyArray; readonly selectionSet?: SelectionSetNode; - readonly required: RequiredStatus; + readonly required: ComplexRequiredStatus; } export interface ArgumentNode { diff --git a/src/language/index.ts b/src/language/index.ts index 6095a0f76e..44cd96e88a 100644 --- a/src/language/index.ts +++ b/src/language/index.ts @@ -91,6 +91,7 @@ export type { EnumTypeExtensionNode, InputObjectTypeExtensionNode, RequiredStatus, + ComplexRequiredStatus, } from './ast'; export { diff --git a/src/language/lexer.ts b/src/language/lexer.ts index 2fac1754cb..a050a52e78 100644 --- a/src/language/lexer.ts +++ b/src/language/lexer.ts @@ -282,12 +282,7 @@ function readNextToken(lexer: Lexer, start: number): Token { case 0x007d: // } return createToken(lexer, TokenKind.BRACE_R, position, position + 1); case 0x003f: // ? - return createToken( - lexer, - TokenKind.QUESTION_MARK, - position, - position + 1, - ); + return createToken(lexer, TokenKind.QUESTION_MARK, position, position + 1); // StringValue case 0x0022: // " if ( diff --git a/src/language/parser.ts b/src/language/parser.ts index bffd22738f..8a44929006 100644 --- a/src/language/parser.ts +++ b/src/language/parser.ts @@ -62,7 +62,10 @@ import type { RequiredStatus, } from './ast'; import { Kind } from './kinds'; + import { Location, OperationTypeNode } from './ast'; +import { ComplexRequiredStatus } from './ast'; + import { TokenKind } from './tokenKind'; import { Source, isSource } from './source'; import { DirectiveLocation } from './directiveLocation'; @@ -428,14 +431,7 @@ export class Parser { name = nameOrAlias; } - let required: RequiredStatus; - if (this.expectOptionalToken(TokenKind.BANG)) { - required = 'required'; - } else if (this.expectOptionalToken(TokenKind.QUESTION_MARK)) { - required = 'optional'; - } else { - required = 'unset'; - } + let required = this.parseRequiredStatus(); return this.node(start, { kind: Kind.FIELD, @@ -450,6 +446,51 @@ export class Parser { }); } + parseRequiredStatus(listDepth: number=0, lastRequiredStatus?: ComplexRequiredStatus): ComplexRequiredStatus { + // recursively check for square brackets, which indicate that + // we're changing the nullability of list elements. + + var listDepthCount = listDepth; + if (this.expectOptionalToken(TokenKind.BRACKET_L)) { + listDepthCount += 1; + } + + let required = this.parseSimpleRequiredStatus(); + + let foundClosingBrace = false; + if (this.expectOptionalToken(TokenKind.BRACKET_R)) { + listDepthCount -= 1 + foundClosingBrace = true; + } + + // we're still delving into the list [[[!]]]! + // you are here ^ + if (listDepthCount > 0 && !foundClosingBrace) { + return this.parseRequiredStatus(listDepthCount); + // we're at the center through the end of the list [[[!]]]! + // you are here ^ ^ or maybe here + } else if (listDepthCount >= 0 && foundClosingBrace) { + let complexRequiredStatus = new ComplexRequiredStatus(required, lastRequiredStatus); + return this.parseRequiredStatus(listDepthCount, complexRequiredStatus); + // we're past the end of the list [[[!]]]! + // you are here ^ + } else if (listDepthCount == 0 && !foundClosingBrace) { + return new ComplexRequiredStatus(required, lastRequiredStatus); + } + } + + parseSimpleRequiredStatus(): RequiredStatus { + let required: RequiredStatus; + if (this.expectOptionalToken(TokenKind.BANG)) { + required = 'required'; + } else if (this.expectOptionalToken(TokenKind.QUESTION_MARK)) { + required = 'optional'; + } else { + required = 'unset'; + } + return required; + } + /** * Arguments[Const] : ( Argument[?Const]+ ) */ From e11d5a875615b443f07822d6501d8d464e783691 Mon Sep 17 00:00:00 2001 From: twof Date: Wed, 10 Nov 2021 00:34:54 -0800 Subject: [PATCH 21/64] new modifiedOutputType --- src/utilities/applyRequiredStatus.ts | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/utilities/applyRequiredStatus.ts b/src/utilities/applyRequiredStatus.ts index a62d40c243..7607503952 100644 --- a/src/utilities/applyRequiredStatus.ts +++ b/src/utilities/applyRequiredStatus.ts @@ -4,7 +4,11 @@ import { getNullableType, GraphQLNonNull, isNonNullType, + isListType, + assertListType, + GraphQLList } from '../type/definition'; +import { ComplexRequiredStatus } from '../language/ast'; /** * Implements the "Accounting For Client Controlled Nullability Designators" @@ -12,7 +16,7 @@ import { * type of a field by taking into account both the nullability listed in the * schema, and the nullability providing by an operation. */ -export function modifiedOutputType( + function simpleModifiedOutputType( type: GraphQLOutputType, required: RequiredStatus, ): GraphQLOutputType { @@ -23,3 +27,18 @@ export function modifiedOutputType( } return type; } + +export function modifiedOutputType( + type: GraphQLOutputType, + required: ComplexRequiredStatus, +): GraphQLOutputType { + if (!required.subStatus) { + return simpleModifiedOutputType(type, required.status) + } + + // We expect this to only be used on lists. Everything that's not a list that the [!] operator + // was applied to should have been caught by the validator + let listType = assertListType(type); + let elementType = listType.ofType as GraphQLOutputType; + return simpleModifiedOutputType(new GraphQLList(modifiedOutputType(elementType, required.subStatus)), required.status); +} From ddd1d856a30f8dacb8b59293af54d4684bf62e15 Mon Sep 17 00:00:00 2001 From: twof Date: Wed, 10 Nov 2021 00:43:08 -0800 Subject: [PATCH 22/64] more comments --- src/language/parser.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/language/parser.ts b/src/language/parser.ts index 8a44929006..0c28a8f4a8 100644 --- a/src/language/parser.ts +++ b/src/language/parser.ts @@ -474,6 +474,8 @@ export class Parser { return this.parseRequiredStatus(listDepthCount, complexRequiredStatus); // we're past the end of the list [[[!]]]! // you are here ^ + // we may also be on the singular or lack of designator ! + // you could also be here ^ } else if (listDepthCount == 0 && !foundClosingBrace) { return new ComplexRequiredStatus(required, lastRequiredStatus); } From 70247d11adcebb7b0528fd799bd09842a36086e6 Mon Sep 17 00:00:00 2001 From: twof Date: Wed, 10 Nov 2021 18:11:02 -0800 Subject: [PATCH 23/64] parser tests passing --- src/language/__tests__/parser-test.ts | 25 ++++++++++++++++++++----- src/language/parser.ts | 2 ++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/language/__tests__/parser-test.ts b/src/language/__tests__/parser-test.ts index e64d17f2ea..4ea3567550 100644 --- a/src/language/__tests__/parser-test.ts +++ b/src/language/__tests__/parser-test.ts @@ -375,7 +375,10 @@ describe('Parser', () => { }, ], directives: [], - required: 'unset', + required: { + "status": 'unset', + "subStatus": undefined + }, selectionSet: { kind: Kind.SELECTION_SET, loc: { start: 16, end: 38 }, @@ -391,7 +394,10 @@ describe('Parser', () => { }, arguments: [], directives: [], - required: 'unset', + required: { + "status": 'unset', + "subStatus": undefined + }, selectionSet: undefined, }, { @@ -405,7 +411,10 @@ describe('Parser', () => { }, arguments: [], directives: [], - required: 'unset', + required: { + "status": 'unset', + "subStatus": undefined + }, selectionSet: undefined, }, ], @@ -453,7 +462,10 @@ describe('Parser', () => { }, arguments: [], directives: [], - required: 'unset', + required: { + "status": 'unset', + "subStatus": undefined + }, selectionSet: { kind: Kind.SELECTION_SET, loc: { start: 15, end: 27 }, @@ -469,7 +481,10 @@ describe('Parser', () => { }, arguments: [], directives: [], - required: 'unset', + required: { + "status": 'unset', + "subStatus": undefined + }, selectionSet: undefined, }, ], diff --git a/src/language/parser.ts b/src/language/parser.ts index 0c28a8f4a8..0d0f04bfd0 100644 --- a/src/language/parser.ts +++ b/src/language/parser.ts @@ -479,6 +479,8 @@ export class Parser { } else if (listDepthCount == 0 && !foundClosingBrace) { return new ComplexRequiredStatus(required, lastRequiredStatus); } + + throw new Error("invalid designator should have been caught in validation"); } parseSimpleRequiredStatus(): RequiredStatus { From 4804aed11edee77f293453460f8c047cc2c0c7c0 Mon Sep 17 00:00:00 2001 From: twof Date: Wed, 10 Nov 2021 19:12:48 -0800 Subject: [PATCH 24/64] printer tests passing --- src/language/__tests__/printer-test.ts | 16 +++++++++++++++- src/language/parser.ts | 1 + src/language/printer.ts | 26 ++++++++++++++++++++------ 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src/language/__tests__/printer-test.ts b/src/language/__tests__/printer-test.ts index 5149f38bfe..799f06f7ee 100644 --- a/src/language/__tests__/printer-test.ts +++ b/src/language/__tests__/printer-test.ts @@ -13,7 +13,10 @@ describe('Printer: Query document', () => { const ast = { kind: Kind.FIELD, name: { kind: Kind.NAME, value: 'foo' }, - required: 'unset', + required: { + status: 'unset', + subStatus: undefined + }, } as const; expect(print(ast)).to.equal('foo'); }); @@ -76,6 +79,17 @@ describe('Printer: Query document', () => { `); }); + it('prints required list', () => { + const queryASTWithVariableDirective = parse( + '{ id[[[!]!]!]! }', + ); + expect(print(queryASTWithVariableDirective)).to.equal(dedent` + { + id[[[!]!]!]! + } + `); + }); + it('keeps arguments on one line if line is short (<= 80 chars)', () => { const printed = print( parse('{trip(wheelchair:false arriveBy:false){dateTime}}'), diff --git a/src/language/parser.ts b/src/language/parser.ts index 0d0f04bfd0..5cc929a9d5 100644 --- a/src/language/parser.ts +++ b/src/language/parser.ts @@ -431,6 +431,7 @@ export class Parser { name = nameOrAlias; } + console.log(alias); let required = this.parseRequiredStatus(); return this.node(start, { diff --git a/src/language/printer.ts b/src/language/printer.ts index e920d27c91..4778ec076b 100644 --- a/src/language/printer.ts +++ b/src/language/printer.ts @@ -5,6 +5,7 @@ import type { ASTReducer } from './visitor'; import { visit } from './visitor'; import { printBlockString } from './blockString'; import { printString } from './printString'; +import { ComplexRequiredStatus } from '.'; /** * Converts an AST into a string, using one set of reasonable @@ -63,14 +64,27 @@ const printDocASTReducer: ASTReducer = { selectionSet, required, }) { - let prefix = wrap('', alias, ': ') + name; - if (required === 'required') { - prefix += '!'; - } else if (required === 'optional') { - prefix += '?'; + let buildRequiredDesignator = (required: ComplexRequiredStatus, accumulator: string = '', depth: number = 0): string => { + if (required.subStatus) { + accumulator = buildRequiredDesignator(required.subStatus, accumulator + '[', depth + 1); + } + + if (required.status === 'required') { + accumulator += '!'; + } else if (required.status === 'optional') { + accumulator += '?'; + } + if (depth > 0) { + accumulator += ']'; + } + + return accumulator } - let argsLine = prefix + wrap('(', join(args, ', '), ')'); + let prefix = wrap('', alias, ': ') + name; + let requiredDesignator = buildRequiredDesignator(required); + + let argsLine = prefix + requiredDesignator + wrap('(', join(args, ', '), ')'); if (argsLine.length > MAX_LINE_LENGTH) { argsLine = prefix + wrap('(\n', indent(join(args, '\n')), '\n)'); From 87986c9793596756621e607f93c1c950c5fae3f0 Mon Sep 17 00:00:00 2001 From: twof Date: Wed, 10 Nov 2021 19:13:42 -0800 Subject: [PATCH 25/64] cleanup printer test that was being used for debugging --- src/language/__tests__/printer-test.ts | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/language/__tests__/printer-test.ts b/src/language/__tests__/printer-test.ts index 799f06f7ee..d95f1476b0 100644 --- a/src/language/__tests__/printer-test.ts +++ b/src/language/__tests__/printer-test.ts @@ -79,17 +79,6 @@ describe('Printer: Query document', () => { `); }); - it('prints required list', () => { - const queryASTWithVariableDirective = parse( - '{ id[[[!]!]!]! }', - ); - expect(print(queryASTWithVariableDirective)).to.equal(dedent` - { - id[[[!]!]!]! - } - `); - }); - it('keeps arguments on one line if line is short (<= 80 chars)', () => { const printed = print( parse('{trip(wheelchair:false arriveBy:false){dateTime}}'), From 2f6eb4f597055083648887adeb880b965b7178fa Mon Sep 17 00:00:00 2001 From: twof Date: Wed, 10 Nov 2021 19:37:19 -0800 Subject: [PATCH 26/64] new parser tests pass --- src/language/__tests__/parser-test.ts | 66 +++++++++++++++++++++++++++ src/language/parser.ts | 3 +- 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/src/language/__tests__/parser-test.ts b/src/language/__tests__/parser-test.ts index 4ea3567550..a426397f06 100644 --- a/src/language/__tests__/parser-test.ts +++ b/src/language/__tests__/parser-test.ts @@ -244,6 +244,24 @@ describe('Parser', () => { ).to.not.throw(); }); + it('does not parse field with multiple designators', () => { + expect(() => + parse(` + query { + optionalField?! + } + `), + ).to.throw(); + + expect(() => + parse(` + query { + optionalField!? + } + `), + ).to.throw(); + }); + it('parses required with alias', () => { expect(() => parse(` @@ -324,6 +342,54 @@ describe('Parser', () => { ).to.not.throw(); }); + it('parses field with required list elements', () => { + expect(() => + parse(` + query { + field[!] + } + `), + ).to.not.throw(); + }); + + it('parses field with optional list elements', () => { + expect(() => + parse(` + query { + field[?] + } + `), + ).to.not.throw(); + }); + + it('parses multidimensional field with mixed list elements', () => { + expect(() => + parse(` + query { + field[[[?]!]]! + } + `), + ).to.not.throw(); + }); + + it('does not parse field with unbalanced brackets', () => { + expect(() => + parse(` + query { + field[[] + } + `), + ).to.throw(); + + expect(() => + parse(` + query { + field[]] + } + `), + ).to.throw(); + }); + it('creates ast', () => { const result = parse(dedent` { diff --git a/src/language/parser.ts b/src/language/parser.ts index 5cc929a9d5..b344a3656e 100644 --- a/src/language/parser.ts +++ b/src/language/parser.ts @@ -431,7 +431,6 @@ export class Parser { name = nameOrAlias; } - console.log(alias); let required = this.parseRequiredStatus(); return this.node(start, { @@ -481,7 +480,7 @@ export class Parser { return new ComplexRequiredStatus(required, lastRequiredStatus); } - throw new Error("invalid designator should have been caught in validation"); + throw new Error("Invalid designator"); } parseSimpleRequiredStatus(): RequiredStatus { From 732554bb5fa7211bc20e37edcad5b2e652918b68 Mon Sep 17 00:00:00 2001 From: twof Date: Wed, 10 Nov 2021 20:07:40 -0800 Subject: [PATCH 27/64] errors tell users when they're using unbalenced braces --- src/language/__tests__/parser-test.ts | 59 +++++++++++++++++++++++---- src/language/parser.ts | 16 +++++++- 2 files changed, 66 insertions(+), 9 deletions(-) diff --git a/src/language/__tests__/parser-test.ts b/src/language/__tests__/parser-test.ts index a426397f06..465420b6ca 100644 --- a/src/language/__tests__/parser-test.ts +++ b/src/language/__tests__/parser-test.ts @@ -363,13 +363,58 @@ describe('Parser', () => { }); it('parses multidimensional field with mixed list elements', () => { - expect(() => - parse(` - query { + let result = parse(dedent` + { field[[[?]!]]! } - `), - ).to.not.throw(); + `); + + expectJSON(result).to.deep.equal({ + kind: Kind.DOCUMENT, + loc: { start: 0, end: 20 }, + definitions: [ + { + kind: Kind.OPERATION_DEFINITION, + loc: { start: 0, end: 20 }, + operation: 'query', + name: undefined, + variableDefinitions: [], + directives: [], + selectionSet: { + kind: Kind.SELECTION_SET, + loc: { start: 0, end: 20 }, + selections: [ + { + kind: Kind.FIELD, + loc: { start: 4, end: 18 }, + alias: undefined, + name: { + kind: Kind.NAME, + loc: { start: 4, end: 9 }, + value: 'field', + }, + arguments: [], + directives: [], + required: { + "status": 'required', + "subStatus": { + "status": 'unset', + "subStatus": { + "status": 'required', + "subStatus": { + "status": 'optional', + "subStatus": undefined + } + } + } + }, + selectionSet: undefined + }, + ], + }, + }, + ], + }); }); it('does not parse field with unbalanced brackets', () => { @@ -379,7 +424,7 @@ describe('Parser', () => { field[[] } `), - ).to.throw(); + ).to.throw('Unbalanced braces in nullability designator'); expect(() => parse(` @@ -387,7 +432,7 @@ describe('Parser', () => { field[]] } `), - ).to.throw(); + ).to.throw('Unbalanced braces in nullability designator'); }); it('creates ast', () => { diff --git a/src/language/parser.ts b/src/language/parser.ts index b344a3656e..6b2230043d 100644 --- a/src/language/parser.ts +++ b/src/language/parser.ts @@ -463,9 +463,19 @@ export class Parser { foundClosingBrace = true; } + const stillDefiningNullabilityDesignator = (): boolean => { + let allowedTokens = [TokenKind.BRACKET_L, TokenKind.BRACKET_R, TokenKind.QUESTION_MARK, TokenKind.BANG]; + const reducer = (prv: boolean, current: TokenKindEnum): boolean => { + return prv || this.peek(current) + } + return allowedTokens.reduce(reducer, false); + } + + let finishedDesignator = !stillDefiningNullabilityDesignator(); + // we're still delving into the list [[[!]]]! // you are here ^ - if (listDepthCount > 0 && !foundClosingBrace) { + if (listDepthCount > 0 && !foundClosingBrace && !finishedDesignator) { return this.parseRequiredStatus(listDepthCount); // we're at the center through the end of the list [[[!]]]! // you are here ^ ^ or maybe here @@ -478,9 +488,11 @@ export class Parser { // you could also be here ^ } else if (listDepthCount == 0 && !foundClosingBrace) { return new ComplexRequiredStatus(required, lastRequiredStatus); + } else if ((listDepthCount < 0 || (listDepthCount > 0 && !foundClosingBrace)) && finishedDesignator) { + throw new Error('Unbalanced braces in nullability designator'); } - throw new Error("Invalid designator"); + throw new Error("Invalid nullability designator"); } parseSimpleRequiredStatus(): RequiredStatus { From 3af64872edc786407ddf80abb84c0f377bf2ce82 Mon Sep 17 00:00:00 2001 From: twof Date: Wed, 10 Nov 2021 20:39:41 -0800 Subject: [PATCH 28/64] parser tests passing --- src/language/__tests__/parser-test.ts | 8 ++--- src/language/parser.ts | 51 +++++++++++++++++---------- 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/src/language/__tests__/parser-test.ts b/src/language/__tests__/parser-test.ts index 465420b6ca..1f552880bb 100644 --- a/src/language/__tests__/parser-test.ts +++ b/src/language/__tests__/parser-test.ts @@ -251,7 +251,7 @@ describe('Parser', () => { optionalField?! } `), - ).to.throw(); + ).to.throw("Syntax Error: Invalid nullability designator"); expect(() => parse(` @@ -259,7 +259,7 @@ describe('Parser', () => { optionalField!? } `), - ).to.throw(); + ).to.throw("Syntax Error: Invalid nullability designator"); }); it('parses required with alias', () => { @@ -424,7 +424,7 @@ describe('Parser', () => { field[[] } `), - ).to.throw('Unbalanced braces in nullability designator'); + ).to.throw('Syntax Error: Unbalanced braces in nullability designator'); expect(() => parse(` @@ -432,7 +432,7 @@ describe('Parser', () => { field[]] } `), - ).to.throw('Unbalanced braces in nullability designator'); + ).to.throw('Syntax Error: Unbalanced braces in nullability designator'); }); it('creates ast', () => { diff --git a/src/language/parser.ts b/src/language/parser.ts index 6b2230043d..d0267aa4af 100644 --- a/src/language/parser.ts +++ b/src/language/parser.ts @@ -471,28 +471,41 @@ export class Parser { return allowedTokens.reduce(reducer, false); } + // There are no more characters that could make up a nullability designator let finishedDesignator = !stillDefiningNullabilityDesignator(); - // we're still delving into the list [[[!]]]! - // you are here ^ - if (listDepthCount > 0 && !foundClosingBrace && !finishedDesignator) { - return this.parseRequiredStatus(listDepthCount); - // we're at the center through the end of the list [[[!]]]! - // you are here ^ ^ or maybe here - } else if (listDepthCount >= 0 && foundClosingBrace) { - let complexRequiredStatus = new ComplexRequiredStatus(required, lastRequiredStatus); - return this.parseRequiredStatus(listDepthCount, complexRequiredStatus); - // we're past the end of the list [[[!]]]! - // you are here ^ - // we may also be on the singular or lack of designator ! - // you could also be here ^ - } else if (listDepthCount == 0 && !foundClosingBrace) { - return new ComplexRequiredStatus(required, lastRequiredStatus); - } else if ((listDepthCount < 0 || (listDepthCount > 0 && !foundClosingBrace)) && finishedDesignator) { - throw new Error('Unbalanced braces in nullability designator'); + if (finishedDesignator) { + // we're past the end of the list [[[!]]]! + // you are here ^ + // we may also be on the singular or lack of designator ! + // you could also be here ^ + if (listDepthCount == 0) { + return new ComplexRequiredStatus(required, lastRequiredStatus); + } else if (listDepthCount < 0 || (listDepthCount > 0)) { + throw syntaxError( + this._lexer.source, + this._lexer.token.start, + 'Unbalanced braces in nullability designator', + ); + } + } else { + // we're still delving into the list [[[!]]]! + // you are here ^ + if (listDepthCount > 0 && !foundClosingBrace && !finishedDesignator) { + return this.parseRequiredStatus(listDepthCount); + // we're at the center through the end of the list [[[!]]]! + // you are here ^ ^ or maybe here + } else if (listDepthCount >= 0 && foundClosingBrace) { + let complexRequiredStatus = new ComplexRequiredStatus(required, lastRequiredStatus); + return this.parseRequiredStatus(listDepthCount, complexRequiredStatus); + } } - - throw new Error("Invalid nullability designator"); + + throw syntaxError( + this._lexer.source, + this._lexer.token.start, + 'Invalid nullability designator', + ); } parseSimpleRequiredStatus(): RequiredStatus { From 07d9226fe2e1b0d181477431367d897af5086b6b Mon Sep 17 00:00:00 2001 From: twof Date: Wed, 10 Nov 2021 22:35:28 -0800 Subject: [PATCH 29/64] reworked nullability parser to be easier to follow --- src/language/__tests__/parser-test.ts | 98 ++++++++++++++++++++++++--- src/language/parser.ts | 81 +++++++++------------- 2 files changed, 120 insertions(+), 59 deletions(-) diff --git a/src/language/__tests__/parser-test.ts b/src/language/__tests__/parser-test.ts index 1f552880bb..4903f3b8f6 100644 --- a/src/language/__tests__/parser-test.ts +++ b/src/language/__tests__/parser-test.ts @@ -343,23 +343,101 @@ describe('Parser', () => { }); it('parses field with required list elements', () => { - expect(() => - parse(` - query { + let result = parse(dedent` + { field[!] } - `), - ).to.not.throw(); + `); + + expectJSON(result).to.deep.equal({ + kind: Kind.DOCUMENT, + loc: { start: 0, end: 14 }, + definitions: [ + { + kind: Kind.OPERATION_DEFINITION, + loc: { start: 0, end: 14 }, + operation: 'query', + name: undefined, + variableDefinitions: [], + directives: [], + selectionSet: { + kind: Kind.SELECTION_SET, + loc: { start: 0, end: 14 }, + selections: [ + { + kind: Kind.FIELD, + loc: { start: 4, end: 12 }, + alias: undefined, + name: { + kind: Kind.NAME, + loc: { start: 4, end: 9 }, + value: 'field', + }, + arguments: [], + directives: [], + required: { + "status": 'unset', + "subStatus": { + "status": 'required', + "subStatus": undefined + } + }, + selectionSet: undefined + }, + ], + }, + }, + ], + }); }); it('parses field with optional list elements', () => { - expect(() => - parse(` - query { + let result = parse(dedent` + { field[?] } - `), - ).to.not.throw(); + `); + + expectJSON(result).to.deep.equal({ + kind: Kind.DOCUMENT, + loc: { start: 0, end: 14 }, + definitions: [ + { + kind: Kind.OPERATION_DEFINITION, + loc: { start: 0, end: 14 }, + operation: 'query', + name: undefined, + variableDefinitions: [], + directives: [], + selectionSet: { + kind: Kind.SELECTION_SET, + loc: { start: 0, end: 14 }, + selections: [ + { + kind: Kind.FIELD, + loc: { start: 4, end: 12 }, + alias: undefined, + name: { + kind: Kind.NAME, + loc: { start: 4, end: 9 }, + value: 'field', + }, + arguments: [], + directives: [], + required: { + "status": 'unset', + "subStatus": { + "status": 'optional', + "subStatus": undefined + } + }, + selectionSet: undefined + }, + ], + }, + }, + ], + }); }); it('parses multidimensional field with mixed list elements', () => { diff --git a/src/language/parser.ts b/src/language/parser.ts index d0267aa4af..4043d9671b 100644 --- a/src/language/parser.ts +++ b/src/language/parser.ts @@ -446,23 +446,7 @@ export class Parser { }); } - parseRequiredStatus(listDepth: number=0, lastRequiredStatus?: ComplexRequiredStatus): ComplexRequiredStatus { - // recursively check for square brackets, which indicate that - // we're changing the nullability of list elements. - - var listDepthCount = listDepth; - if (this.expectOptionalToken(TokenKind.BRACKET_L)) { - listDepthCount += 1; - } - - let required = this.parseSimpleRequiredStatus(); - - let foundClosingBrace = false; - if (this.expectOptionalToken(TokenKind.BRACKET_R)) { - listDepthCount -= 1 - foundClosingBrace = true; - } - + parseRequiredStatus(): ComplexRequiredStatus { const stillDefiningNullabilityDesignator = (): boolean => { let allowedTokens = [TokenKind.BRACKET_L, TokenKind.BRACKET_R, TokenKind.QUESTION_MARK, TokenKind.BANG]; const reducer = (prv: boolean, current: TokenKindEnum): boolean => { @@ -472,40 +456,39 @@ export class Parser { } // There are no more characters that could make up a nullability designator - let finishedDesignator = !stillDefiningNullabilityDesignator(); - - if (finishedDesignator) { - // we're past the end of the list [[[!]]]! - // you are here ^ - // we may also be on the singular or lack of designator ! - // you could also be here ^ - if (listDepthCount == 0) { - return new ComplexRequiredStatus(required, lastRequiredStatus); - } else if (listDepthCount < 0 || (listDepthCount > 0)) { - throw syntaxError( - this._lexer.source, - this._lexer.token.start, - 'Unbalanced braces in nullability designator', - ); - } - } else { - // we're still delving into the list [[[!]]]! - // you are here ^ - if (listDepthCount > 0 && !foundClosingBrace && !finishedDesignator) { - return this.parseRequiredStatus(listDepthCount); - // we're at the center through the end of the list [[[!]]]! - // you are here ^ ^ or maybe here - } else if (listDepthCount >= 0 && foundClosingBrace) { - let complexRequiredStatus = new ComplexRequiredStatus(required, lastRequiredStatus); - return this.parseRequiredStatus(listDepthCount, complexRequiredStatus); - } + var listDepthCount = 0; + + var lastRequiredStatus: RequiredStatus = 'unset'; + var outerComplexRequiredStatus: ComplexRequiredStatus | undefined = undefined; + while (stillDefiningNullabilityDesignator()) { + if (this.expectOptionalToken(TokenKind.BRACKET_L)) { + listDepthCount += 1; + } else if (this.expectOptionalToken(TokenKind.BRACKET_R)) { + listDepthCount -= 1; + lastRequiredStatus = this.parseSimpleRequiredStatus(); + outerComplexRequiredStatus = new ComplexRequiredStatus(lastRequiredStatus, outerComplexRequiredStatus); + } else { + if (outerComplexRequiredStatus) { + throw syntaxError( + this._lexer.source, + this._lexer.token.start, + 'Invalid nullability designator', + ); + } + lastRequiredStatus = this.parseSimpleRequiredStatus(); + outerComplexRequiredStatus = new ComplexRequiredStatus(lastRequiredStatus, outerComplexRequiredStatus); + } + } + + if (listDepthCount != 0) { + throw syntaxError( + this._lexer.source, + this._lexer.token.start, + 'Unbalanced braces in nullability designator', + ); } - throw syntaxError( - this._lexer.source, - this._lexer.token.start, - 'Invalid nullability designator', - ); + return outerComplexRequiredStatus ?? new ComplexRequiredStatus(lastRequiredStatus); } parseSimpleRequiredStatus(): RequiredStatus { From af6ebc25d7dde3faf74c336877936572fbbbd738 Mon Sep 17 00:00:00 2001 From: twof Date: Wed, 10 Nov 2021 22:49:14 -0800 Subject: [PATCH 30/64] handle another case --- src/language/__tests__/parser-test.ts | 99 +++++++++++++++++++++++++++ src/language/parser.ts | 5 +- 2 files changed, 103 insertions(+), 1 deletion(-) diff --git a/src/language/__tests__/parser-test.ts b/src/language/__tests__/parser-test.ts index 4903f3b8f6..697bec2fe4 100644 --- a/src/language/__tests__/parser-test.ts +++ b/src/language/__tests__/parser-test.ts @@ -440,6 +440,105 @@ describe('Parser', () => { }); }); + it('parses field with required list', () => { + let result = parse(dedent` + { + field[]! + } + `); + + expectJSON(result).to.deep.equal({ + kind: Kind.DOCUMENT, + loc: { start: 0, end: 14 }, + definitions: [ + { + kind: Kind.OPERATION_DEFINITION, + loc: { start: 0, end: 14 }, + operation: 'query', + name: undefined, + variableDefinitions: [], + directives: [], + selectionSet: { + kind: Kind.SELECTION_SET, + loc: { start: 0, end: 14 }, + selections: [ + { + kind: Kind.FIELD, + loc: { start: 4, end: 12 }, + alias: undefined, + name: { + kind: Kind.NAME, + loc: { start: 4, end: 9 }, + value: 'field', + }, + arguments: [], + directives: [], + required: { + "status": 'required', + "subStatus": { + "status": 'unset', + "subStatus": undefined + } + }, + selectionSet: undefined + }, + ], + }, + }, + ], + }); + }); + + it('parses field with optional list', () => { + console.log(); + let result = parse(dedent` + { + field[]? + } + `); + + expectJSON(result).to.deep.equal({ + kind: Kind.DOCUMENT, + loc: { start: 0, end: 14 }, + definitions: [ + { + kind: Kind.OPERATION_DEFINITION, + loc: { start: 0, end: 14 }, + operation: 'query', + name: undefined, + variableDefinitions: [], + directives: [], + selectionSet: { + kind: Kind.SELECTION_SET, + loc: { start: 0, end: 14 }, + selections: [ + { + kind: Kind.FIELD, + loc: { start: 4, end: 12 }, + alias: undefined, + name: { + kind: Kind.NAME, + loc: { start: 4, end: 9 }, + value: 'field', + }, + arguments: [], + directives: [], + required: { + "status": 'optional', + "subStatus": { + "status": 'unset', + "subStatus": undefined + } + }, + selectionSet: undefined + }, + ], + }, + }, + ], + }); + }); + it('parses multidimensional field with mixed list elements', () => { let result = parse(dedent` { diff --git a/src/language/parser.ts b/src/language/parser.ts index 4043d9671b..6a23bdd092 100644 --- a/src/language/parser.ts +++ b/src/language/parser.ts @@ -466,7 +466,10 @@ export class Parser { } else if (this.expectOptionalToken(TokenKind.BRACKET_R)) { listDepthCount -= 1; lastRequiredStatus = this.parseSimpleRequiredStatus(); - outerComplexRequiredStatus = new ComplexRequiredStatus(lastRequiredStatus, outerComplexRequiredStatus); + outerComplexRequiredStatus = new ComplexRequiredStatus( + lastRequiredStatus, + outerComplexRequiredStatus ?? new ComplexRequiredStatus('unset') + ); } else { if (outerComplexRequiredStatus) { throw syntaxError( From 051c2919a65efdf99a8eb0838490373997e042ba Mon Sep 17 00:00:00 2001 From: twof Date: Thu, 11 Nov 2021 00:28:21 -0800 Subject: [PATCH 31/64] first succeeding execution test --- src/execution/__tests__/executor-test.ts | 95 ++++++++++++++++++++++-- src/execution/execute.ts | 15 +++- src/language/parser.ts | 2 + src/utilities/applyRequiredStatus.ts | 1 - 4 files changed, 106 insertions(+), 7 deletions(-) diff --git a/src/execution/__tests__/executor-test.ts b/src/execution/__tests__/executor-test.ts index 5d33d9a9d8..3c0643283f 100644 --- a/src/execution/__tests__/executor-test.ts +++ b/src/execution/__tests__/executor-test.ts @@ -1290,6 +1290,66 @@ describe('Execute: Handles basic execution tasks', () => { }; }, }, + lists: { + type: new GraphQLObjectType({ + name: 'Lists', + fields: { + list: { type: new GraphQLList(GraphQLInt) }, + twoDList: { + type: new GraphQLList( + new GraphQLList( + GraphQLInt + ) + ) + }, + threeDList: { + type: new GraphQLList( + new GraphQLList( + new GraphQLList( + GraphQLInt + ) + ) + ) + }, + nonNullThreeDList: { + type: new GraphQLNonNull(new GraphQLList( + new GraphQLNonNull(new GraphQLList( + new GraphQLNonNull(new GraphQLList( + GraphQLInt + )) + )) + )) + } + } + }), + resolve() { + return { + list: [null, 1, 2, null], + twoDList: [ + [null, 1, 2, null], + [1, 2, 3] + ], + threeDList: [ + [ + [null], + [null] + ], [ + [null], + [null] + ] + ], + nonNullThreeDList: [ + [ + [null], + [null] + ], [ + [null], + [null] + ] + ], + } + } + } }, }), }); @@ -1310,7 +1370,7 @@ describe('Execute: Handles basic execution tasks', () => { }); }); - it('null bubbles up when field that returns null is required', () => { + it('null propagates when field that returns null is required', () => { const singleNonNullOnNullValueDocument = parse(` query { food { @@ -1336,7 +1396,7 @@ describe('Execute: Handles basic execution tasks', () => { }); }); - it('null bubbles up when field that returns null and field that does not are both required', () => { + it('null propagates when field that returns null and field that does not are both required', () => { const bothNonNullOnNullValueDocument = parse(` query { food { @@ -1380,7 +1440,7 @@ describe('Execute: Handles basic execution tasks', () => { }); }); - it('null bubbles up when field that returns null is aliased and required', () => { + it('null propagates when field that returns null is aliased and required', () => { const nonNullAliasOnNullValueDocument = parse(` query { food { @@ -1405,7 +1465,7 @@ describe('Execute: Handles basic execution tasks', () => { }); }); - it('null bubbles up when field that returns null is required and inside an inline fragment', () => { + it('null propagates when field that returns null is required and inside an inline fragment', () => { const nonNullInFragmentDocument = parse(` query { food { @@ -1432,7 +1492,7 @@ describe('Execute: Handles basic execution tasks', () => { }); }); - it('null bubbles up when field that returns null is required, but other aliased value is unaffected', () => { + it('null propagates when field that returns null is required, but other aliased value is unaffected', () => { const aliasedNullAndNonNull = parse(` query { nonNullable: food { @@ -1462,5 +1522,30 @@ describe('Execute: Handles basic execution tasks', () => { ], }); }); + + it('lists with incorrect depth fail to execute', () => { + const aliasedNullAndNonNull = parse(` + query { + lists { + list[[!]] + } + } + `); + const aliasedNullAndNonNullResult = executeSync({ + schema, + document: aliasedNullAndNonNull, + }); + + expectJSON(aliasedNullAndNonNullResult).to.deep.equal({ + data: { lists: null }, + errors: [ + { + locations: [{ column: 13, line: 4 }], + message: 'Syntax Error: Something is wrong with the nullability designator. Is the correct list depth being used?', + path: ['lists', 'list'], + }, + ], + }); + }); }); }); diff --git a/src/execution/execute.ts b/src/execution/execute.ts index 031c6baa32..8ee58ee9fa 100644 --- a/src/execution/execute.ts +++ b/src/execution/execute.ts @@ -59,6 +59,7 @@ import { collectFields, collectSubfields as _collectSubfields, } from './collectFields'; +import { syntaxError } from '../error/syntaxError'; /** * A memoized collection of relevant subfields with regard to the return @@ -491,7 +492,19 @@ function executeField( return; } - const returnType = modifiedOutputType(fieldDef.type, fieldNodes[0].required); + let returnType: GraphQLOutputType; + try { + returnType = modifiedOutputType(fieldDef.type, fieldNodes[0].required); + } catch (error) { + throw new GraphQLError( + 'Syntax Error: Something is wrong with the nullability designator. Is the correct list depth being used?', + undefined, + fieldNodes[0].loc!.source, + [fieldNodes[0].loc!.start], + pathToArray(path), + ); + } + const resolveFn = fieldDef.resolve ?? exeContext.fieldResolver; const info = buildResolveInfo( diff --git a/src/language/parser.ts b/src/language/parser.ts index 6a23bdd092..6ef3500804 100644 --- a/src/language/parser.ts +++ b/src/language/parser.ts @@ -468,9 +468,11 @@ export class Parser { lastRequiredStatus = this.parseSimpleRequiredStatus(); outerComplexRequiredStatus = new ComplexRequiredStatus( lastRequiredStatus, + // handles unset elements on the innermost list outerComplexRequiredStatus ?? new ComplexRequiredStatus('unset') ); } else { + // throws on multiple designators in a row eg ?!! if (outerComplexRequiredStatus) { throw syntaxError( this._lexer.source, diff --git a/src/utilities/applyRequiredStatus.ts b/src/utilities/applyRequiredStatus.ts index 7607503952..214066ae7f 100644 --- a/src/utilities/applyRequiredStatus.ts +++ b/src/utilities/applyRequiredStatus.ts @@ -4,7 +4,6 @@ import { getNullableType, GraphQLNonNull, isNonNullType, - isListType, assertListType, GraphQLList } from '../type/definition'; From 73d816467635e27518067be0fe896209b3762dc9 Mon Sep 17 00:00:00 2001 From: twof Date: Mon, 15 Nov 2021 21:01:31 -0800 Subject: [PATCH 32/64] executor tests pass --- src/execution/__tests__/executor-test.ts | 122 +++++++++++++++++++++-- src/language/parser.ts | 2 +- src/utilities/applyRequiredStatus.ts | 33 +++++- 3 files changed, 147 insertions(+), 10 deletions(-) diff --git a/src/execution/__tests__/executor-test.ts b/src/execution/__tests__/executor-test.ts index 3c0643283f..560e57f962 100644 --- a/src/execution/__tests__/executor-test.ts +++ b/src/execution/__tests__/executor-test.ts @@ -21,6 +21,8 @@ import { } from '../../type/definition'; import { execute, executeSync } from '../execute'; +import { modifiedOutputType } from '../..'; +import { ComplexRequiredStatus } from '../../language/ast'; describe('Execute: Handles basic execution tasks', () => { it('throws if no document is provided', () => { @@ -1311,14 +1313,23 @@ describe('Execute: Handles basic execution tasks', () => { ) ) }, - nonNullThreeDList: { + nonNullThreeDList: { // [[[!]!]!]! type: new GraphQLNonNull(new GraphQLList( new GraphQLNonNull(new GraphQLList( new GraphQLNonNull(new GraphQLList( - GraphQLInt + new GraphQLNonNull(GraphQLInt) )) )) )) + }, + mixedThreeDList: { //[[[?]!]!]? + type: new GraphQLList( + new GraphQLNonNull(new GraphQLList( + new GraphQLNonNull(new GraphQLList( + GraphQLInt + )) + )) + ) } } }), @@ -1347,6 +1358,15 @@ describe('Execute: Handles basic execution tasks', () => { [null] ] ], + mixedThreeDList: [ + [ + [null], + [null] + ], [ + [null], + [null] + ] + ], } } } @@ -1524,19 +1544,19 @@ describe('Execute: Handles basic execution tasks', () => { }); it('lists with incorrect depth fail to execute', () => { - const aliasedNullAndNonNull = parse(` + const listsQuery = parse(` query { lists { list[[!]] } } `); - const aliasedNullAndNonNullResult = executeSync({ + const listsQueryResult = executeSync({ schema, - document: aliasedNullAndNonNull, + document: listsQuery, }); - expectJSON(aliasedNullAndNonNullResult).to.deep.equal({ + expectJSON(listsQueryResult).to.deep.equal({ data: { lists: null }, errors: [ { @@ -1547,5 +1567,95 @@ describe('Execute: Handles basic execution tasks', () => { ], }); }); + + it('lists with required element propagates null to top level list', () => { + const listsQuery = parse(` + query { + lists { + mixedThreeDList[[[!]]] + } + } + `); + const listsQueryResult = executeSync({ + schema, + document: listsQuery, + }); + + expectJSON(listsQueryResult).to.deep.equal({ + data: { lists: { mixedThreeDList: null } }, + errors: [ + { + locations: [{ column: 13, line: 4 }], + message: 'Cannot return null for non-nullable field Lists.mixedThreeDList.', + path: ['lists', 'mixedThreeDList', 0, 0, 0], + }, + ], + }); + }); + + it('lists with required element propagates null to first error boundary', () => { + const listsQuery = parse(` + query { + lists { + mixedThreeDList[[[!]]?] + } + } + `); + const listsQueryResult = executeSync({ + schema, + document: listsQuery, + }); + + expectJSON(listsQueryResult).to.deep.equal({ + data: { lists: { mixedThreeDList: [null, null] } }, + errors: [ + { + locations: [{ column: 13, line: 4 }], + message: 'Cannot return null for non-nullable field Lists.mixedThreeDList.', + path: ['lists', 'mixedThreeDList', 0, 0, 0], + }, + { + locations: [{ column: 13, line: 4 }], + message: 'Cannot return null for non-nullable field Lists.mixedThreeDList.', + path: ['lists', 'mixedThreeDList', 1, 0, 0], + }, + ], + }); + }); + + it('modifiedOutputType produces correct output types', () => { + let type = new GraphQLList( + new GraphQLNonNull(new GraphQLList( + new GraphQLNonNull(new GraphQLList( + GraphQLInt + )) + )) + ) + + let requiredStatus = new ComplexRequiredStatus( + 'unset', + new ComplexRequiredStatus( + 'optional', + new ComplexRequiredStatus( + 'unset', + new ComplexRequiredStatus( + 'required', + undefined + ) + ) + ) + ) + + let outputType = modifiedOutputType(type, requiredStatus); + let expectedOutputType = new GraphQLList( + new GraphQLList( + new GraphQLNonNull(new GraphQLList( + new GraphQLNonNull(GraphQLInt) + )) + ) + ) + + expect(outputType).to.deep.equal(expectedOutputType); + }); }); }); diff --git a/src/language/parser.ts b/src/language/parser.ts index 6ef3500804..96eaf1acf4 100644 --- a/src/language/parser.ts +++ b/src/language/parser.ts @@ -454,7 +454,7 @@ export class Parser { } return allowedTokens.reduce(reducer, false); } - + // There are no more characters that could make up a nullability designator var listDepthCount = 0; diff --git a/src/utilities/applyRequiredStatus.ts b/src/utilities/applyRequiredStatus.ts index 214066ae7f..592197280d 100644 --- a/src/utilities/applyRequiredStatus.ts +++ b/src/utilities/applyRequiredStatus.ts @@ -5,9 +5,11 @@ import { GraphQLNonNull, isNonNullType, assertListType, - GraphQLList + GraphQLList, + isListType } from '../type/definition'; import { ComplexRequiredStatus } from '../language/ast'; +import { print } from '..'; /** * Implements the "Accounting For Client Controlled Nullability Designators" @@ -31,13 +33,38 @@ export function modifiedOutputType( type: GraphQLOutputType, required: ComplexRequiredStatus, ): GraphQLOutputType { + // this works if (!required.subStatus) { return simpleModifiedOutputType(type, required.status) } + /* + cast: [[[!]]] + original: [[[?]!]!]? + output: [[[!]!]!]? + + modifiedOutputType([[[?]!]!]?, [[[!]]]) + listType = [[[?]!]!]? + elementType = [[?]!]! + modifiedOutputType([!]!, [!]) + */ + // We expect this to only be used on lists. Everything that's not a list that the [!] operator // was applied to should have been caught by the validator - let listType = assertListType(type); + let listType = assertListType(getNullableType(type)); let elementType = listType.ofType as GraphQLOutputType; - return simpleModifiedOutputType(new GraphQLList(modifiedOutputType(elementType, required.subStatus)), required.status); + let prev = modifiedOutputType(elementType, required.subStatus); + var constructedType = prev; + + // build up new type + if (isListType(getNullableType(type))) { + constructedType = new GraphQLList(constructedType); + } + + if (isNonNullType(type)) { + constructedType = new GraphQLNonNull(constructedType); + } + + let returnValue = simpleModifiedOutputType(constructedType, required.status); + return returnValue; } From d9d34d941417466370fce4727bd48357f10f77da Mon Sep 17 00:00:00 2001 From: twof Date: Mon, 15 Nov 2021 22:54:26 -0800 Subject: [PATCH 33/64] added new rule to deal with required list operator validation --- src/index.ts | 1 + .../OverlappingFieldsCanBeMergedRule-test.ts | 32 +++++++++ ...StatusOnFieldMatchesDefinitionRule-test.ts | 68 +++++++++++++++++++ src/validation/index.ts | 2 + .../rules/OverlappingFieldsCanBeMergedRule.ts | 31 ++++++++- ...uiredStatusOnFieldMatchesDefinitionRule.ts | 54 +++++++++++++++ src/validation/specifiedRules.ts | 3 + 7 files changed, 189 insertions(+), 2 deletions(-) create mode 100644 src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts create mode 100644 src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts diff --git a/src/index.ts b/src/index.ts index 215ca3c6e8..46daf311f3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -373,6 +373,7 @@ export { /** Custom validation rules */ NoDeprecatedCustomRule, NoSchemaIntrospectionCustomRule, + RequiredStatusOnFieldMatchesDefinitionRule } from './validation/index'; export type { ValidationRule } from './validation/index'; diff --git a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts index 6b427aec2c..55c9cb0645 100644 --- a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts +++ b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts @@ -682,9 +682,15 @@ describe('Validate: Overlapping fields can be merged', () => { name: String } + type Lists { + list: [Int] + mixedThreeDList: [[[Int]!]!] + } + type Query { someBox: SomeBox connection: Connection + lists: Lists } `); @@ -1355,6 +1361,32 @@ describe('Validate: Overlapping fields can be merged', () => { }); }); + describe('Varying required statuses on lists', () => { + it('incorrect depth', () => { + expectErrorsWithSchema( + schema, + ` + { + lists { + list[[]] + list[[]] + } + } + `, + ).to.deep.equal([ + { + message: + 'Fields "scalar" conflict because they return conflicting types "Int" and "String". Use different aliases on the fields to fetch both if this was intentional.', + locations: [ + { line: 5, column: 19 }, + { line: 8, column: 19 }, + ], + }, + ]); + }); + }); + + it('compatible return shapes on different return types', () => { // In this case `deepBox` returns `SomeBox` in the first usage, and // `StringBox` in the second usage. These return types are not the same! diff --git a/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts b/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts new file mode 100644 index 0000000000..9276b637eb --- /dev/null +++ b/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts @@ -0,0 +1,68 @@ +import { expect } from 'chai'; +import { describe, it } from 'mocha'; + +import { parse } from '../../language/parser'; + +import type { GraphQLSchema } from '../../type/schema'; + +import { buildSchema } from '../../utilities/buildASTSchema'; + +import { validate } from '../validate'; + +import { expectValidationErrorsWithSchema } from './harness'; +import { RequiredStatusOnFieldMatchesDefinitionRule } from '../rules/RequiredStatusOnFieldMatchesDefinitionRule'; + +function expectErrors(queryStr: string) { + return expectValidationErrorsWithSchema( + testSchema, + RequiredStatusOnFieldMatchesDefinitionRule, + queryStr, + ); +} + +function expectValid(queryStr: string) { + expectErrors(queryStr).to.deep.equal([]); +} + +const testSchema = buildSchema(` + type Lists { + nonList: Int + list: [Int] + mixedThreeDList: [[[Int]!]!] + } + + type Query { + lists: Lists + } +`); + +describe('Validate: Field uses correct list depth', () => { + it('Fields are valid', () => { + expectValid(` + fragment typeKnownAgain on Lists { + list[!] + nonList! + mixedThreeDList[[[!]!]!]! + } + `); + }); + + it('reports errors when type is known again', () => { + expectErrors(` + fragment typeKnownAgain on Lists { + list[[]] + notAList: nonList[!] + mixedThreeDList[[!]!]! + } + `).to.deep.equal([ + { + message: 'Syntax Error: Something is wrong with the nullability designator on list. The type for that field in the schema is [Int] Is the correct list depth being used?', + locations: [{ line: 3, column: 9 }], + }, + { + message: 'Syntax Error: Something is wrong with the nullability designator on notAList. The type for that field in the schema is Int Is the correct list depth being used?', + locations: [{ line: 4, column: 9 }], + }, + ]); + }); +}); diff --git a/src/validation/index.ts b/src/validation/index.ts index 584faf3440..f5aa69d708 100644 --- a/src/validation/index.ts +++ b/src/validation/index.ts @@ -84,6 +84,8 @@ export { VariablesAreInputTypesRule } from './rules/VariablesAreInputTypesRule'; /** Spec Section: "All Variable Usages Are Allowed" */ export { VariablesInAllowedPositionRule } from './rules/VariablesInAllowedPositionRule'; +export { RequiredStatusOnFieldMatchesDefinitionRule } from './rules/RequiredStatusOnFieldMatchesDefinitionRule'; + /** SDL-specific validation rules */ export { LoneSchemaDefinitionRule } from './rules/LoneSchemaDefinitionRule'; export { UniqueOperationTypesRule } from './rules/UniqueOperationTypesRule'; diff --git a/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts b/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts index b400b61111..da16f6ba2e 100644 --- a/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts +++ b/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts @@ -548,6 +548,7 @@ function findConflict( const [parentType1, node1, def1] = field1; const [parentType2, node2, def2] = field2; + // If it is known that two fields could not possibly apply at the same // time, due to the parent types, then it is safe to permit them to diverge // in aliased field or arguments used as they will not present any ambiguity @@ -593,8 +594,34 @@ function findConflict( const type2 = def2?.type; if (type1 && type2) { - const modifiedType1 = modifiedOutputType(type1, node1.required); - const modifiedType2 = modifiedOutputType(type2, node2.required); + var modifiedType1: GraphQLOutputType; + var modifiedType2: GraphQLOutputType; + try { + modifiedType1 = modifiedOutputType(type1, node1.required); + } catch (error) { + throw new GraphQLError( + 'Syntax Error: Something is wrong with the nullability designator. Is the correct list depth being used?', + undefined, + node1.loc!.source, + [node1.loc!.start], + field1, + ); + } + + try { + modifiedType2 = modifiedOutputType(type2, node2.required); + } catch (error) { + throw new GraphQLError( + 'Syntax Error: Something is wrong with the nullability designator. Is the correct list depth being used?', + undefined, + node2.loc!.source, + [node2.loc!.start], + pathToArray(path), + ); + } + + + if (doTypesConflict(modifiedType1, modifiedType2)) { return [ diff --git a/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts b/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts new file mode 100644 index 0000000000..5c89637227 --- /dev/null +++ b/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts @@ -0,0 +1,54 @@ +import { didYouMean } from '../../jsutils/didYouMean'; +import { suggestionList } from '../../jsutils/suggestionList'; +import { naturalCompare } from '../../jsutils/naturalCompare'; + +import { GraphQLError } from '../../error/GraphQLError'; + +import type { FieldNode } from '../../language/ast'; +import type { ASTVisitor } from '../../language/visitor'; + +import type { GraphQLSchema } from '../../type/schema'; +import type { + GraphQLOutputType, + GraphQLObjectType, + GraphQLInterfaceType, + GraphQLField, +} from '../../type/definition'; +import { + isObjectType, + isInterfaceType, + isAbstractType, +} from '../../type/definition'; + +import type { ValidationContext } from '../ValidationContext'; +import { modifiedOutputType } from '../..'; + +/** + * Fields on correct type + * + * A GraphQL document is only valid if all fields selected are defined by the + * parent type, or are an allowed meta field such as __typename. + * + * See https://spec.graphql.org/draft/#sec-Field-Selections + */ +export function RequiredStatusOnFieldMatchesDefinitionRule( + context: ValidationContext, +): ASTVisitor { + return { + Field(node: FieldNode) { + if (context.getFieldDef()) { + const fieldDef = context.getFieldDef() as GraphQLField; + try { + modifiedOutputType(fieldDef.type, node.required) + } catch { + context.reportError( + new GraphQLError( + `Syntax Error: Something is wrong with the nullability designator on ${node.alias?.value ?? node.name.value}. The type for that field in the schema is ${fieldDef.type} Is the correct list depth being used?`, + node, + ), + ); + } + } + }, + }; +} diff --git a/src/validation/specifiedRules.ts b/src/validation/specifiedRules.ts index 930e9f0f58..becd207cc7 100644 --- a/src/validation/specifiedRules.ts +++ b/src/validation/specifiedRules.ts @@ -84,6 +84,8 @@ import { OverlappingFieldsCanBeMergedRule } from './rules/OverlappingFieldsCanBe // Spec Section: "Input Object Field Uniqueness" import { UniqueInputFieldNamesRule } from './rules/UniqueInputFieldNamesRule'; +import { RequiredStatusOnFieldMatchesDefinitionRule } from './rules/RequiredStatusOnFieldMatchesDefinitionRule'; + // SDL-specific validation rules import { LoneSchemaDefinitionRule } from './rules/LoneSchemaDefinitionRule'; import { UniqueOperationTypesRule } from './rules/UniqueOperationTypesRule'; @@ -127,6 +129,7 @@ export const specifiedRules: ReadonlyArray = Object.freeze([ VariablesInAllowedPositionRule, OverlappingFieldsCanBeMergedRule, UniqueInputFieldNamesRule, + RequiredStatusOnFieldMatchesDefinitionRule ]); /** From 8898a6ce130449139e1b1e8d558f5a80eb28fdaa Mon Sep 17 00:00:00 2001 From: twof Date: Mon, 15 Nov 2021 23:12:50 -0800 Subject: [PATCH 34/64] overlapping fields new tests --- .../OverlappingFieldsCanBeMergedRule-test.ts | 40 ++++++++++++++++--- .../rules/OverlappingFieldsCanBeMergedRule.ts | 5 --- src/validation/specifiedRules.ts | 2 +- 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts index 55c9cb0645..5b0b894348 100644 --- a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts +++ b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts @@ -1362,28 +1362,56 @@ describe('Validate: Overlapping fields can be merged', () => { }); describe('Varying required statuses on lists', () => { - it('incorrect depth', () => { + it('matching fields merge', () => { + expectValidWithSchema( + schema, + ` + { + lists { + list[] + list[] + } + } + `, + ); + }); + + it('conflicting fields do not merge', () => { expectErrorsWithSchema( schema, ` { lists { - list[[]] - list[[]] + list[!]! + list[] } } `, ).to.deep.equal([ { message: - 'Fields "scalar" conflict because they return conflicting types "Int" and "String". Use different aliases on the fields to fetch both if this was intentional.', + 'Fields "list" conflict because they return conflicting types "[Int!]!" and "[Int]". Use different aliases on the fields to fetch both if this was intentional.', locations: [ - { line: 5, column: 19 }, - { line: 8, column: 19 }, + { column: 17, line: 4 }, + { column: 17, line: 5 }, ], }, ]); }); + + it('matching fields with different nullability indicators merge', () => { + expectValidWithSchema( + schema, + ` + { + lists { + list[]! + list! + } + } + `, + ); + }); }); diff --git a/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts b/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts index da16f6ba2e..0a995aac5b 100644 --- a/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts +++ b/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts @@ -604,7 +604,6 @@ function findConflict( undefined, node1.loc!.source, [node1.loc!.start], - field1, ); } @@ -616,13 +615,9 @@ function findConflict( undefined, node2.loc!.source, [node2.loc!.start], - pathToArray(path), ); } - - - if (doTypesConflict(modifiedType1, modifiedType2)) { return [ [ diff --git a/src/validation/specifiedRules.ts b/src/validation/specifiedRules.ts index becd207cc7..5a11d0dd24 100644 --- a/src/validation/specifiedRules.ts +++ b/src/validation/specifiedRules.ts @@ -127,9 +127,9 @@ export const specifiedRules: ReadonlyArray = Object.freeze([ ValuesOfCorrectTypeRule, ProvidedRequiredArgumentsRule, VariablesInAllowedPositionRule, + RequiredStatusOnFieldMatchesDefinitionRule, OverlappingFieldsCanBeMergedRule, UniqueInputFieldNamesRule, - RequiredStatusOnFieldMatchesDefinitionRule ]); /** From e0b6ff994c3d74777c2d89e220541948f5c521f6 Mon Sep 17 00:00:00 2001 From: twof Date: Mon, 15 Nov 2021 23:15:48 -0800 Subject: [PATCH 35/64] cleanup unused branch in modify type funciton --- src/utilities/applyRequiredStatus.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/utilities/applyRequiredStatus.ts b/src/utilities/applyRequiredStatus.ts index 592197280d..3b22c1895b 100644 --- a/src/utilities/applyRequiredStatus.ts +++ b/src/utilities/applyRequiredStatus.ts @@ -54,12 +54,7 @@ export function modifiedOutputType( let listType = assertListType(getNullableType(type)); let elementType = listType.ofType as GraphQLOutputType; let prev = modifiedOutputType(elementType, required.subStatus); - var constructedType = prev; - - // build up new type - if (isListType(getNullableType(type))) { - constructedType = new GraphQLList(constructedType); - } + var constructedType = new GraphQLList(prev); if (isNonNullType(type)) { constructedType = new GraphQLNonNull(constructedType); From 235026cefc3daaca3c2f0a4fbbc6d8a8d3186a10 Mon Sep 17 00:00:00 2001 From: twof Date: Mon, 15 Nov 2021 23:18:33 -0800 Subject: [PATCH 36/64] cleanup some debugging scratchpad mess --- src/utilities/applyRequiredStatus.ts | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/src/utilities/applyRequiredStatus.ts b/src/utilities/applyRequiredStatus.ts index 3b22c1895b..eaccc7bcb6 100644 --- a/src/utilities/applyRequiredStatus.ts +++ b/src/utilities/applyRequiredStatus.ts @@ -33,24 +33,11 @@ export function modifiedOutputType( type: GraphQLOutputType, required: ComplexRequiredStatus, ): GraphQLOutputType { - // this works if (!required.subStatus) { return simpleModifiedOutputType(type, required.status) } - /* - cast: [[[!]]] - original: [[[?]!]!]? - output: [[[!]!]!]? - - modifiedOutputType([[[?]!]!]?, [[[!]]]) - listType = [[[?]!]!]? - elementType = [[?]!]! - modifiedOutputType([!]!, [!]) - */ - - // We expect this to only be used on lists. Everything that's not a list that the [!] operator - // was applied to should have been caught by the validator + // If execution reaches this point, type is a list. let listType = assertListType(getNullableType(type)); let elementType = listType.ofType as GraphQLOutputType; let prev = modifiedOutputType(elementType, required.subStatus); @@ -60,6 +47,5 @@ export function modifiedOutputType( constructedType = new GraphQLNonNull(constructedType); } - let returnValue = simpleModifiedOutputType(constructedType, required.status); - return returnValue; + return simpleModifiedOutputType(constructedType, required.status); } From 1181aa327bf37175212b22f1c0bd99112950fe21 Mon Sep 17 00:00:00 2001 From: twof Date: Mon, 15 Nov 2021 23:33:58 -0800 Subject: [PATCH 37/64] overlapping type cleanup --- .../rules/OverlappingFieldsCanBeMergedRule.ts | 53 +++++++------------ 1 file changed, 19 insertions(+), 34 deletions(-) diff --git a/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts b/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts index 0a995aac5b..399cac9b4d 100644 --- a/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts +++ b/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts @@ -594,42 +594,27 @@ function findConflict( const type2 = def2?.type; if (type1 && type2) { - var modifiedType1: GraphQLOutputType; - var modifiedType2: GraphQLOutputType; + + // Errors will have already been handled by RequiredStatusOnFieldMatchesDefinitionRule + // so there's no need to do anything here in the event that modifiedOutputType throws + // an error. try { - modifiedType1 = modifiedOutputType(type1, node1.required); - } catch (error) { - throw new GraphQLError( - 'Syntax Error: Something is wrong with the nullability designator. Is the correct list depth being used?', - undefined, - node1.loc!.source, - [node1.loc!.start], - ); - } + var modifiedType1 = modifiedOutputType(type1, node1.required); + var modifiedType2 = modifiedOutputType(type2, node2.required); - try { - modifiedType2 = modifiedOutputType(type2, node2.required); - } catch (error) { - throw new GraphQLError( - 'Syntax Error: Something is wrong with the nullability designator. Is the correct list depth being used?', - undefined, - node2.loc!.source, - [node2.loc!.start], - ); - } - - if (doTypesConflict(modifiedType1, modifiedType2)) { - return [ - [ - responseName, - `they return conflicting types "${inspect( - modifiedType1, - )}" and "${inspect(modifiedType2)}"`, - ], - [node1], - [node2], - ]; - } + if (doTypesConflict(modifiedType1, modifiedType2)) { + return [ + [ + responseName, + `they return conflicting types "${inspect( + modifiedType1, + )}" and "${inspect(modifiedType2)}"`, + ], + [node1], + [node2], + ]; + } + } catch { } } // Collect and compare sub-fields. Use the same "visited fragment names" list From 03c96c72cc63fc2c82f64e266934d86b2f0eed7d Mon Sep 17 00:00:00 2001 From: twof Date: Wed, 17 Nov 2021 02:18:10 -0800 Subject: [PATCH 38/64] typeinfo edit passing --- src/language/__tests__/visitor-test.ts | 2 +- src/utilities/__tests__/TypeInfo-test.ts | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/language/__tests__/visitor-test.ts b/src/language/__tests__/visitor-test.ts index 0dd5639238..2e9e11209b 100644 --- a/src/language/__tests__/visitor-test.ts +++ b/src/language/__tests__/visitor-test.ts @@ -702,7 +702,7 @@ describe('Visitor', () => { ['enter', 'Name', 'name', 'Field'], ['leave', 'Name', 'name', 'Field'], ['leave', 'Field', 0, undefined], - ['leave', 'SelectionSet', 'selectionSet', 'InlineFragment'], + x['leave', 'SelectionSet', 'selectionSet', 'InlineFragment'], ['leave', 'InlineFragment', 3, undefined], ['leave', 'SelectionSet', 'selectionSet', 'Field'], ['leave', 'Field', 0, undefined], diff --git a/src/utilities/__tests__/TypeInfo-test.ts b/src/utilities/__tests__/TypeInfo-test.ts index 6008e1d927..8a0a1b2555 100644 --- a/src/utilities/__tests__/TypeInfo-test.ts +++ b/src/utilities/__tests__/TypeInfo-test.ts @@ -12,6 +12,7 @@ import { getNamedType, isCompositeType } from '../../type/definition'; import { buildSchema } from '../buildASTSchema'; import { TypeInfo, visitWithTypeInfo } from '../TypeInfo'; +import { ComplexRequiredStatus } from '../../language/ast'; const testSchema = buildSchema(` interface Pet { @@ -268,6 +269,7 @@ describe('visitWithTypeInfo', () => { { kind: 'Field', name: { kind: 'Name', value: '__typename' }, + required: new ComplexRequiredStatus('unset') }, ], }, From d6882349755743c3fda527ce27995dbe32e7698a Mon Sep 17 00:00:00 2001 From: twof Date: Wed, 17 Nov 2021 20:54:19 -0800 Subject: [PATCH 39/64] prettier and all tests passing --- src/__testUtils__/kitchenSinkQuery.ts | 5 + src/execution/__tests__/executor-test.ts | 132 ++++++++---------- src/execution/execute.ts | 2 +- src/index.ts | 2 +- src/language/__tests__/parser-test.ts | 104 +++++++------- src/language/__tests__/printer-test.ts | 2 +- src/language/__tests__/visitor-test.ts | 85 ++++++++++- src/language/ast.ts | 1 - src/language/lexer.ts | 7 +- src/language/parser.ts | 36 +++-- src/language/printer.ts | 21 ++- src/utilities/__tests__/TypeInfo-test.ts | 2 +- src/utilities/applyRequiredStatus.ts | 6 +- .../OverlappingFieldsCanBeMergedRule-test.ts | 1 - ...StatusOnFieldMatchesDefinitionRule-test.ts | 6 +- .../rules/OverlappingFieldsCanBeMergedRule.ts | 4 +- ...uiredStatusOnFieldMatchesDefinitionRule.ts | 13 +- 17 files changed, 264 insertions(+), 165 deletions(-) diff --git a/src/__testUtils__/kitchenSinkQuery.ts b/src/__testUtils__/kitchenSinkQuery.ts index 8c66af347e..6f6d5bffff 100644 --- a/src/__testUtils__/kitchenSinkQuery.ts +++ b/src/__testUtils__/kitchenSinkQuery.ts @@ -77,3 +77,8 @@ query { __typename } `; +// requiredListItemsRequiredList: listField[!]! +// unsetListItemsOptionalList: listField[]? +// optionalListItemsUnsetList: listField[?] +// optionalListItemsOptionalList: listField[?]? +// multidimensionalList: listField[[[!]!]!]! diff --git a/src/execution/__tests__/executor-test.ts b/src/execution/__tests__/executor-test.ts index 560e57f962..a98933de51 100644 --- a/src/execution/__tests__/executor-test.ts +++ b/src/execution/__tests__/executor-test.ts @@ -1297,79 +1297,62 @@ describe('Execute: Handles basic execution tasks', () => { name: 'Lists', fields: { list: { type: new GraphQLList(GraphQLInt) }, - twoDList: { - type: new GraphQLList( - new GraphQLList( - GraphQLInt - ) - ) + twoDList: { + type: new GraphQLList(new GraphQLList(GraphQLInt)), }, threeDList: { type: new GraphQLList( - new GraphQLList( - new GraphQLList( - GraphQLInt - ) - ) - ) + new GraphQLList(new GraphQLList(GraphQLInt)), + ), }, - nonNullThreeDList: { // [[[!]!]!]! - type: new GraphQLNonNull(new GraphQLList( - new GraphQLNonNull(new GraphQLList( - new GraphQLNonNull(new GraphQLList( - new GraphQLNonNull(GraphQLInt) - )) - )) - )) + nonNullThreeDList: { + // [[[!]!]!]! + type: new GraphQLNonNull( + new GraphQLList( + new GraphQLNonNull( + new GraphQLList( + new GraphQLNonNull( + new GraphQLList(new GraphQLNonNull(GraphQLInt)), + ), + ), + ), + ), + ), }, - mixedThreeDList: { //[[[?]!]!]? + mixedThreeDList: { + //[[[?]!]!]? type: new GraphQLList( - new GraphQLNonNull(new GraphQLList( - new GraphQLNonNull(new GraphQLList( - GraphQLInt - )) - )) - ) - } - } + new GraphQLNonNull( + new GraphQLList( + new GraphQLNonNull(new GraphQLList(GraphQLInt)), + ), + ), + ), + }, + }, }), resolve() { return { list: [null, 1, 2, null], twoDList: [ [null, 1, 2, null], - [1, 2, 3] + [1, 2, 3], ], threeDList: [ - [ - [null], - [null] - ], [ - [null], - [null] - ] + [[null], [null]], + [[null], [null]], ], nonNullThreeDList: [ - [ - [null], - [null] - ], [ - [null], - [null] - ] + [[null], [null]], + [[null], [null]], ], mixedThreeDList: [ - [ - [null], - [null] - ], [ - [null], - [null] - ] + [[null], [null]], + [[null], [null]], ], - } - } - } + }; + }, + }, }, }), }); @@ -1561,7 +1544,8 @@ describe('Execute: Handles basic execution tasks', () => { errors: [ { locations: [{ column: 13, line: 4 }], - message: 'Syntax Error: Something is wrong with the nullability designator. Is the correct list depth being used?', + message: + 'Syntax Error: Something is wrong with the nullability designator. Is the correct list depth being used?', path: ['lists', 'list'], }, ], @@ -1586,7 +1570,8 @@ describe('Execute: Handles basic execution tasks', () => { errors: [ { locations: [{ column: 13, line: 4 }], - message: 'Cannot return null for non-nullable field Lists.mixedThreeDList.', + message: + 'Cannot return null for non-nullable field Lists.mixedThreeDList.', path: ['lists', 'mixedThreeDList', 0, 0, 0], }, ], @@ -1611,12 +1596,14 @@ describe('Execute: Handles basic execution tasks', () => { errors: [ { locations: [{ column: 13, line: 4 }], - message: 'Cannot return null for non-nullable field Lists.mixedThreeDList.', + message: + 'Cannot return null for non-nullable field Lists.mixedThreeDList.', path: ['lists', 'mixedThreeDList', 0, 0, 0], }, { locations: [{ column: 13, line: 4 }], - message: 'Cannot return null for non-nullable field Lists.mixedThreeDList.', + message: + 'Cannot return null for non-nullable field Lists.mixedThreeDList.', path: ['lists', 'mixedThreeDList', 1, 0, 0], }, ], @@ -1625,12 +1612,10 @@ describe('Execute: Handles basic execution tasks', () => { it('modifiedOutputType produces correct output types', () => { let type = new GraphQLList( - new GraphQLNonNull(new GraphQLList( - new GraphQLNonNull(new GraphQLList( - GraphQLInt - )) - )) - ) + new GraphQLNonNull( + new GraphQLList(new GraphQLNonNull(new GraphQLList(GraphQLInt))), + ), + ); let requiredStatus = new ComplexRequiredStatus( 'unset', @@ -1638,22 +1623,17 @@ describe('Execute: Handles basic execution tasks', () => { 'optional', new ComplexRequiredStatus( 'unset', - new ComplexRequiredStatus( - 'required', - undefined - ) - ) - ) - ) + new ComplexRequiredStatus('required', undefined), + ), + ), + ); let outputType = modifiedOutputType(type, requiredStatus); let expectedOutputType = new GraphQLList( new GraphQLList( - new GraphQLNonNull(new GraphQLList( - new GraphQLNonNull(GraphQLInt) - )) - ) - ) + new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(GraphQLInt))), + ), + ); expect(outputType).to.deep.equal(expectedOutputType); }); diff --git a/src/execution/execute.ts b/src/execution/execute.ts index 8ee58ee9fa..e0efbad697 100644 --- a/src/execution/execute.ts +++ b/src/execution/execute.ts @@ -499,7 +499,7 @@ function executeField( throw new GraphQLError( 'Syntax Error: Something is wrong with the nullability designator. Is the correct list depth being used?', undefined, - fieldNodes[0].loc!.source, + fieldNodes[0].loc!.source, [fieldNodes[0].loc!.start], pathToArray(path), ); diff --git a/src/index.ts b/src/index.ts index 46daf311f3..8c46c12fb1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -373,7 +373,7 @@ export { /** Custom validation rules */ NoDeprecatedCustomRule, NoSchemaIntrospectionCustomRule, - RequiredStatusOnFieldMatchesDefinitionRule + RequiredStatusOnFieldMatchesDefinitionRule, } from './validation/index'; export type { ValidationRule } from './validation/index'; diff --git a/src/language/__tests__/parser-test.ts b/src/language/__tests__/parser-test.ts index 697bec2fe4..670a3b82fb 100644 --- a/src/language/__tests__/parser-test.ts +++ b/src/language/__tests__/parser-test.ts @@ -251,7 +251,7 @@ describe('Parser', () => { optionalField?! } `), - ).to.throw("Syntax Error: Invalid nullability designator"); + ).to.throw('Syntax Error: Invalid nullability designator'); expect(() => parse(` @@ -259,7 +259,7 @@ describe('Parser', () => { optionalField!? } `), - ).to.throw("Syntax Error: Invalid nullability designator"); + ).to.throw('Syntax Error: Invalid nullability designator'); }); it('parses required with alias', () => { @@ -348,7 +348,7 @@ describe('Parser', () => { field[!] } `); - + expectJSON(result).to.deep.equal({ kind: Kind.DOCUMENT, loc: { start: 0, end: 14 }, @@ -376,13 +376,13 @@ describe('Parser', () => { arguments: [], directives: [], required: { - "status": 'unset', - "subStatus": { - "status": 'required', - "subStatus": undefined - } + status: 'unset', + subStatus: { + status: 'required', + subStatus: undefined, + }, }, - selectionSet: undefined + selectionSet: undefined, }, ], }, @@ -397,7 +397,7 @@ describe('Parser', () => { field[?] } `); - + expectJSON(result).to.deep.equal({ kind: Kind.DOCUMENT, loc: { start: 0, end: 14 }, @@ -425,13 +425,13 @@ describe('Parser', () => { arguments: [], directives: [], required: { - "status": 'unset', - "subStatus": { - "status": 'optional', - "subStatus": undefined - } + status: 'unset', + subStatus: { + status: 'optional', + subStatus: undefined, + }, }, - selectionSet: undefined + selectionSet: undefined, }, ], }, @@ -446,7 +446,7 @@ describe('Parser', () => { field[]! } `); - + expectJSON(result).to.deep.equal({ kind: Kind.DOCUMENT, loc: { start: 0, end: 14 }, @@ -474,13 +474,13 @@ describe('Parser', () => { arguments: [], directives: [], required: { - "status": 'required', - "subStatus": { - "status": 'unset', - "subStatus": undefined - } + status: 'required', + subStatus: { + status: 'unset', + subStatus: undefined, + }, }, - selectionSet: undefined + selectionSet: undefined, }, ], }, @@ -496,7 +496,7 @@ describe('Parser', () => { field[]? } `); - + expectJSON(result).to.deep.equal({ kind: Kind.DOCUMENT, loc: { start: 0, end: 14 }, @@ -524,13 +524,13 @@ describe('Parser', () => { arguments: [], directives: [], required: { - "status": 'optional', - "subStatus": { - "status": 'unset', - "subStatus": undefined - } + status: 'optional', + subStatus: { + status: 'unset', + subStatus: undefined, + }, }, - selectionSet: undefined + selectionSet: undefined, }, ], }, @@ -573,19 +573,19 @@ describe('Parser', () => { arguments: [], directives: [], required: { - "status": 'required', - "subStatus": { - "status": 'unset', - "subStatus": { - "status": 'required', - "subStatus": { - "status": 'optional', - "subStatus": undefined - } - } - } + status: 'required', + subStatus: { + status: 'unset', + subStatus: { + status: 'required', + subStatus: { + status: 'optional', + subStatus: undefined, + }, + }, + }, }, - selectionSet: undefined + selectionSet: undefined, }, ], }, @@ -664,8 +664,8 @@ describe('Parser', () => { ], directives: [], required: { - "status": 'unset', - "subStatus": undefined + status: 'unset', + subStatus: undefined, }, selectionSet: { kind: Kind.SELECTION_SET, @@ -683,8 +683,8 @@ describe('Parser', () => { arguments: [], directives: [], required: { - "status": 'unset', - "subStatus": undefined + status: 'unset', + subStatus: undefined, }, selectionSet: undefined, }, @@ -700,8 +700,8 @@ describe('Parser', () => { arguments: [], directives: [], required: { - "status": 'unset', - "subStatus": undefined + status: 'unset', + subStatus: undefined, }, selectionSet: undefined, }, @@ -751,8 +751,8 @@ describe('Parser', () => { arguments: [], directives: [], required: { - "status": 'unset', - "subStatus": undefined + status: 'unset', + subStatus: undefined, }, selectionSet: { kind: Kind.SELECTION_SET, @@ -770,8 +770,8 @@ describe('Parser', () => { arguments: [], directives: [], required: { - "status": 'unset', - "subStatus": undefined + status: 'unset', + subStatus: undefined, }, selectionSet: undefined, }, diff --git a/src/language/__tests__/printer-test.ts b/src/language/__tests__/printer-test.ts index d95f1476b0..8bd5283f2f 100644 --- a/src/language/__tests__/printer-test.ts +++ b/src/language/__tests__/printer-test.ts @@ -15,7 +15,7 @@ describe('Printer: Query document', () => { name: { kind: Kind.NAME, value: 'foo' }, required: { status: 'unset', - subStatus: undefined + subStatus: undefined, }, } as const; expect(print(ast)).to.equal('foo'); diff --git a/src/language/__tests__/visitor-test.ts b/src/language/__tests__/visitor-test.ts index 2e9e11209b..56a7e799b2 100644 --- a/src/language/__tests__/visitor-test.ts +++ b/src/language/__tests__/visitor-test.ts @@ -505,6 +505,47 @@ describe('Visitor', () => { ]); }); + it('for debugging', () => { + const query = String.raw`{ + requiredListItemsRequiredList: listField[!]! + unsetListItemsOptionalList: listField[]? + optionalListItemsUnsetList: listField[?] + optionalListItemsOptionalList: listField[?]? + multidimensionalList: listField[[[!]!]!]! + }`; + const ast = parse(query); + const visited: Array = []; + const argsStack: Array = []; + + visit(ast, { + enter(node, key, parent) { + visited.push([ + 'enter', + node.kind, + key, + isNode(parent) ? parent.kind : undefined, + ]); + + checkVisitorFnArgs(ast, arguments); + argsStack.push([...arguments]); + }, + + leave(node, key, parent) { + visited.push([ + 'leave', + node.kind, + key, + isNode(parent) ? parent.kind : undefined, + ]); + + expect(argsStack.pop()).to.deep.equal([...arguments]); + }, + }); + + console.log(visited); + console.log(); + }); + it('visits kitchen sink', () => { const ast = parse(kitchenSinkQuery); const visited: Array = []; @@ -674,6 +715,48 @@ describe('Visitor', () => { ['enter', 'Name', 'name', 'Field'], ['leave', 'Name', 'name', 'Field'], ['leave', 'Field', 4, undefined], + ['enter', 'Field', 5, undefined], + ['enter', 'Name', 'alias', 'Field'], + ['leave', 'Name', 'alias', 'Field'], + ['enter', 'Name', 'name', 'Field'], + ['leave', 'Name', 'name', 'Field'], + ['leave', 'Field', 5, undefined], + ['enter', 'Field', 6, undefined], + ['enter', 'Name', 'alias', 'Field'], + ['leave', 'Name', 'alias', 'Field'], + ['enter', 'Name', 'name', 'Field'], + ['leave', 'Name', 'name', 'Field'], + ['leave', 'Field', 6, undefined], + ['enter', 'Field', 7, undefined], + ['enter', 'Name', 'alias', 'Field'], + ['leave', 'Name', 'alias', 'Field'], + ['enter', 'Name', 'name', 'Field'], + ['leave', 'Name', 'name', 'Field'], + ['leave', 'Field', 7, undefined], + ['enter', 'Field', 8, undefined], + ['enter', 'Name', 'alias', 'Field'], + ['leave', 'Name', 'alias', 'Field'], + ['enter', 'Name', 'name', 'Field'], + ['leave', 'Name', 'name', 'Field'], + ['leave', 'Field', 8, undefined], + ['enter', 'Field', 9, undefined], + ['enter', 'Name', 'alias', 'Field'], + ['leave', 'Name', 'alias', 'Field'], + ['enter', 'Name', 'name', 'Field'], + ['leave', 'Name', 'name', 'Field'], + ['leave', 'Field', 9, undefined], + ['enter', 'Field', 10, undefined], + ['enter', 'Name', 'alias', 'Field'], + ['leave', 'Name', 'alias', 'Field'], + ['enter', 'Name', 'name', 'Field'], + ['leave', 'Name', 'name', 'Field'], + ['leave', 'Field', 10, undefined], + ['enter', 'Field', 11, undefined], + ['enter', 'Name', 'alias', 'Field'], + ['leave', 'Name', 'alias', 'Field'], + ['enter', 'Name', 'name', 'Field'], + ['leave', 'Name', 'name', 'Field'], + ['leave', 'Field', 11, undefined], ['leave', 'SelectionSet', 'selectionSet', 'InlineFragment'], ['leave', 'InlineFragment', 1, undefined], ['enter', 'InlineFragment', 2, undefined], @@ -702,7 +785,7 @@ describe('Visitor', () => { ['enter', 'Name', 'name', 'Field'], ['leave', 'Name', 'name', 'Field'], ['leave', 'Field', 0, undefined], - x['leave', 'SelectionSet', 'selectionSet', 'InlineFragment'], + ['leave', 'SelectionSet', 'selectionSet', 'InlineFragment'], ['leave', 'InlineFragment', 3, undefined], ['leave', 'SelectionSet', 'selectionSet', 'Field'], ['leave', 'Field', 0, undefined], diff --git a/src/language/ast.ts b/src/language/ast.ts index 16e9cdc4a9..6933f6d9e0 100644 --- a/src/language/ast.ts +++ b/src/language/ast.ts @@ -355,7 +355,6 @@ export type SelectionNode = FieldNode | FragmentSpreadNode | InlineFragmentNode; export type RequiredStatus = 'required' | 'optional' | 'unset'; - export class ComplexRequiredStatus { readonly status: RequiredStatus; // Exists if status is on a List. diff --git a/src/language/lexer.ts b/src/language/lexer.ts index a050a52e78..2fac1754cb 100644 --- a/src/language/lexer.ts +++ b/src/language/lexer.ts @@ -282,7 +282,12 @@ function readNextToken(lexer: Lexer, start: number): Token { case 0x007d: // } return createToken(lexer, TokenKind.BRACE_R, position, position + 1); case 0x003f: // ? - return createToken(lexer, TokenKind.QUESTION_MARK, position, position + 1); + return createToken( + lexer, + TokenKind.QUESTION_MARK, + position, + position + 1, + ); // StringValue case 0x0022: // " if ( diff --git a/src/language/parser.ts b/src/language/parser.ts index 96eaf1acf4..f30d840835 100644 --- a/src/language/parser.ts +++ b/src/language/parser.ts @@ -448,18 +448,24 @@ export class Parser { parseRequiredStatus(): ComplexRequiredStatus { const stillDefiningNullabilityDesignator = (): boolean => { - let allowedTokens = [TokenKind.BRACKET_L, TokenKind.BRACKET_R, TokenKind.QUESTION_MARK, TokenKind.BANG]; + let allowedTokens = [ + TokenKind.BRACKET_L, + TokenKind.BRACKET_R, + TokenKind.QUESTION_MARK, + TokenKind.BANG, + ]; const reducer = (prv: boolean, current: TokenKindEnum): boolean => { - return prv || this.peek(current) - } + return prv || this.peek(current); + }; return allowedTokens.reduce(reducer, false); - } - + }; + // There are no more characters that could make up a nullability designator var listDepthCount = 0; var lastRequiredStatus: RequiredStatus = 'unset'; - var outerComplexRequiredStatus: ComplexRequiredStatus | undefined = undefined; + var outerComplexRequiredStatus: ComplexRequiredStatus | undefined = + undefined; while (stillDefiningNullabilityDesignator()) { if (this.expectOptionalToken(TokenKind.BRACKET_L)) { listDepthCount += 1; @@ -467,9 +473,9 @@ export class Parser { listDepthCount -= 1; lastRequiredStatus = this.parseSimpleRequiredStatus(); outerComplexRequiredStatus = new ComplexRequiredStatus( - lastRequiredStatus, + lastRequiredStatus, // handles unset elements on the innermost list - outerComplexRequiredStatus ?? new ComplexRequiredStatus('unset') + outerComplexRequiredStatus ?? new ComplexRequiredStatus('unset'), ); } else { // throws on multiple designators in a row eg ?!! @@ -481,8 +487,11 @@ export class Parser { ); } lastRequiredStatus = this.parseSimpleRequiredStatus(); - outerComplexRequiredStatus = new ComplexRequiredStatus(lastRequiredStatus, outerComplexRequiredStatus); - } + outerComplexRequiredStatus = new ComplexRequiredStatus( + lastRequiredStatus, + outerComplexRequiredStatus, + ); + } } if (listDepthCount != 0) { @@ -492,8 +501,11 @@ export class Parser { 'Unbalanced braces in nullability designator', ); } - - return outerComplexRequiredStatus ?? new ComplexRequiredStatus(lastRequiredStatus); + + return ( + outerComplexRequiredStatus ?? + new ComplexRequiredStatus(lastRequiredStatus) + ); } parseSimpleRequiredStatus(): RequiredStatus { diff --git a/src/language/printer.ts b/src/language/printer.ts index 4778ec076b..03b77a0a09 100644 --- a/src/language/printer.ts +++ b/src/language/printer.ts @@ -64,11 +64,19 @@ const printDocASTReducer: ASTReducer = { selectionSet, required, }) { - let buildRequiredDesignator = (required: ComplexRequiredStatus, accumulator: string = '', depth: number = 0): string => { + let buildRequiredDesignator = ( + required: ComplexRequiredStatus, + accumulator: string = '', + depth: number = 0, + ): string => { if (required.subStatus) { - accumulator = buildRequiredDesignator(required.subStatus, accumulator + '[', depth + 1); + accumulator = buildRequiredDesignator( + required.subStatus, + accumulator + '[', + depth + 1, + ); } - + if (required.status === 'required') { accumulator += '!'; } else if (required.status === 'optional') { @@ -78,13 +86,14 @@ const printDocASTReducer: ASTReducer = { accumulator += ']'; } - return accumulator - } + return accumulator; + }; let prefix = wrap('', alias, ': ') + name; let requiredDesignator = buildRequiredDesignator(required); - let argsLine = prefix + requiredDesignator + wrap('(', join(args, ', '), ')'); + let argsLine = + prefix + requiredDesignator + wrap('(', join(args, ', '), ')'); if (argsLine.length > MAX_LINE_LENGTH) { argsLine = prefix + wrap('(\n', indent(join(args, '\n')), '\n)'); diff --git a/src/utilities/__tests__/TypeInfo-test.ts b/src/utilities/__tests__/TypeInfo-test.ts index 8a0a1b2555..8a557fc664 100644 --- a/src/utilities/__tests__/TypeInfo-test.ts +++ b/src/utilities/__tests__/TypeInfo-test.ts @@ -269,7 +269,7 @@ describe('visitWithTypeInfo', () => { { kind: 'Field', name: { kind: 'Name', value: '__typename' }, - required: new ComplexRequiredStatus('unset') + required: new ComplexRequiredStatus('unset'), }, ], }, diff --git a/src/utilities/applyRequiredStatus.ts b/src/utilities/applyRequiredStatus.ts index eaccc7bcb6..a3d039f9d4 100644 --- a/src/utilities/applyRequiredStatus.ts +++ b/src/utilities/applyRequiredStatus.ts @@ -6,7 +6,7 @@ import { isNonNullType, assertListType, GraphQLList, - isListType + isListType, } from '../type/definition'; import { ComplexRequiredStatus } from '../language/ast'; import { print } from '..'; @@ -17,7 +17,7 @@ import { print } from '..'; * type of a field by taking into account both the nullability listed in the * schema, and the nullability providing by an operation. */ - function simpleModifiedOutputType( +function simpleModifiedOutputType( type: GraphQLOutputType, required: RequiredStatus, ): GraphQLOutputType { @@ -34,7 +34,7 @@ export function modifiedOutputType( required: ComplexRequiredStatus, ): GraphQLOutputType { if (!required.subStatus) { - return simpleModifiedOutputType(type, required.status) + return simpleModifiedOutputType(type, required.status); } // If execution reaches this point, type is a list. diff --git a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts index 5b0b894348..88112f9c66 100644 --- a/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts +++ b/src/validation/__tests__/OverlappingFieldsCanBeMergedRule-test.ts @@ -1414,7 +1414,6 @@ describe('Validate: Overlapping fields can be merged', () => { }); }); - it('compatible return shapes on different return types', () => { // In this case `deepBox` returns `SomeBox` in the first usage, and // `StringBox` in the second usage. These return types are not the same! diff --git a/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts b/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts index 9276b637eb..f233f14312 100644 --- a/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts +++ b/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts @@ -56,11 +56,13 @@ describe('Validate: Field uses correct list depth', () => { } `).to.deep.equal([ { - message: 'Syntax Error: Something is wrong with the nullability designator on list. The type for that field in the schema is [Int] Is the correct list depth being used?', + message: + 'Syntax Error: Something is wrong with the nullability designator on list. The type for that field in the schema is [Int] Is the correct list depth being used?', locations: [{ line: 3, column: 9 }], }, { - message: 'Syntax Error: Something is wrong with the nullability designator on notAList. The type for that field in the schema is Int Is the correct list depth being used?', + message: + 'Syntax Error: Something is wrong with the nullability designator on notAList. The type for that field in the schema is Int Is the correct list depth being used?', locations: [{ line: 4, column: 9 }], }, ]); diff --git a/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts b/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts index 399cac9b4d..9d856c1a6e 100644 --- a/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts +++ b/src/validation/rules/OverlappingFieldsCanBeMergedRule.ts @@ -548,7 +548,6 @@ function findConflict( const [parentType1, node1, def1] = field1; const [parentType2, node2, def2] = field2; - // If it is known that two fields could not possibly apply at the same // time, due to the parent types, then it is safe to permit them to diverge // in aliased field or arguments used as they will not present any ambiguity @@ -594,7 +593,6 @@ function findConflict( const type2 = def2?.type; if (type1 && type2) { - // Errors will have already been handled by RequiredStatusOnFieldMatchesDefinitionRule // so there's no need to do anything here in the event that modifiedOutputType throws // an error. @@ -614,7 +612,7 @@ function findConflict( [node2], ]; } - } catch { } + } catch {} } // Collect and compare sub-fields. Use the same "visited fragment names" list diff --git a/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts b/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts index 5c89637227..1ebab20134 100644 --- a/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts +++ b/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts @@ -37,13 +37,20 @@ export function RequiredStatusOnFieldMatchesDefinitionRule( return { Field(node: FieldNode) { if (context.getFieldDef()) { - const fieldDef = context.getFieldDef() as GraphQLField; + const fieldDef = context.getFieldDef() as GraphQLField< + unknown, + unknown + >; try { - modifiedOutputType(fieldDef.type, node.required) + modifiedOutputType(fieldDef.type, node.required); } catch { context.reportError( new GraphQLError( - `Syntax Error: Something is wrong with the nullability designator on ${node.alias?.value ?? node.name.value}. The type for that field in the schema is ${fieldDef.type} Is the correct list depth being used?`, + `Syntax Error: Something is wrong with the nullability designator on ${ + node.alias?.value ?? node.name.value + }. The type for that field in the schema is ${ + fieldDef.type + } Is the correct list depth being used?`, node, ), ); From 0f5c158e19e31058b40e2b8f1733ff9174c77b80 Mon Sep 17 00:00:00 2001 From: twof Date: Wed, 17 Nov 2021 22:34:45 -0800 Subject: [PATCH 40/64] additional parser tests --- src/__testUtils__/kitchenSinkQuery.ts | 5 --- src/language/__tests__/parser-test.ts | 42 +++++++++++++++++++++++++ src/language/__tests__/visitor-test.ts | 41 ------------------------ src/language/ast.ts | 2 +- src/language/parser.ts | 43 ++++++++++++++++++-------- 5 files changed, 73 insertions(+), 60 deletions(-) diff --git a/src/__testUtils__/kitchenSinkQuery.ts b/src/__testUtils__/kitchenSinkQuery.ts index 6f6d5bffff..8c66af347e 100644 --- a/src/__testUtils__/kitchenSinkQuery.ts +++ b/src/__testUtils__/kitchenSinkQuery.ts @@ -77,8 +77,3 @@ query { __typename } `; -// requiredListItemsRequiredList: listField[!]! -// unsetListItemsOptionalList: listField[]? -// optionalListItemsUnsetList: listField[?] -// optionalListItemsOptionalList: listField[?]? -// multidimensionalList: listField[[[!]!]!]! diff --git a/src/language/__tests__/parser-test.ts b/src/language/__tests__/parser-test.ts index 670a3b82fb..4a3037e861 100644 --- a/src/language/__tests__/parser-test.ts +++ b/src/language/__tests__/parser-test.ts @@ -610,6 +610,48 @@ describe('Parser', () => { } `), ).to.throw('Syntax Error: Unbalanced braces in nullability designator'); + + expect(() => + parse(` + query { + field] + } + `), + ).to.throw('Syntax Error: Unbalanced braces in nullability designator'); + + expect(() => + parse(` + query { + field[ + } + `), + ).to.throw('Syntax Error: Unbalanced braces in nullability designator'); + }); + + it('does not parse field with assorted invalid nullability designators', () => { + expect(() => + parse(` + query { + field[][] + } + `), + ).to.throw('Syntax Error: Invalid nullability designator'); + + expect(() => + parse(` + query { + field[!!] + } + `), + ).to.throw('Syntax Error: Invalid nullability designator'); + + expect(() => + parse(` + query { + field[]?! + } + `), + ).to.throw('Syntax Error: Invalid nullability designator'); }); it('creates ast', () => { diff --git a/src/language/__tests__/visitor-test.ts b/src/language/__tests__/visitor-test.ts index 56a7e799b2..ab502f3217 100644 --- a/src/language/__tests__/visitor-test.ts +++ b/src/language/__tests__/visitor-test.ts @@ -505,47 +505,6 @@ describe('Visitor', () => { ]); }); - it('for debugging', () => { - const query = String.raw`{ - requiredListItemsRequiredList: listField[!]! - unsetListItemsOptionalList: listField[]? - optionalListItemsUnsetList: listField[?] - optionalListItemsOptionalList: listField[?]? - multidimensionalList: listField[[[!]!]!]! - }`; - const ast = parse(query); - const visited: Array = []; - const argsStack: Array = []; - - visit(ast, { - enter(node, key, parent) { - visited.push([ - 'enter', - node.kind, - key, - isNode(parent) ? parent.kind : undefined, - ]); - - checkVisitorFnArgs(ast, arguments); - argsStack.push([...arguments]); - }, - - leave(node, key, parent) { - visited.push([ - 'leave', - node.kind, - key, - isNode(parent) ? parent.kind : undefined, - ]); - - expect(argsStack.pop()).to.deep.equal([...arguments]); - }, - }); - - console.log(visited); - console.log(); - }); - it('visits kitchen sink', () => { const ast = parse(kitchenSinkQuery); const visited: Array = []; diff --git a/src/language/ast.ts b/src/language/ast.ts index 6933f6d9e0..ad96e7dd84 100644 --- a/src/language/ast.ts +++ b/src/language/ast.ts @@ -360,7 +360,7 @@ export class ComplexRequiredStatus { // Exists if status is on a List. // This setup doesn't leave room for container types // that have multiple fields like a Dictionary - // so it will need to be fixed when that comes up, but probably prior. + // so it will need to be fixed when that comes up. readonly subStatus?: ComplexRequiredStatus; constructor(status: RequiredStatus, subStatus?: ComplexRequiredStatus) { diff --git a/src/language/parser.ts b/src/language/parser.ts index f30d840835..319bc0dd71 100644 --- a/src/language/parser.ts +++ b/src/language/parser.ts @@ -3,6 +3,9 @@ import type { Maybe } from '../jsutils/Maybe'; import type { GraphQLError } from '../error/GraphQLError'; import { syntaxError } from '../error/syntaxError'; +import type { TokenKindEnum } from './tokenKind'; +import { TokenKind } from './tokenKind'; + import type { Token, NameNode, @@ -61,12 +64,10 @@ import type { InputObjectTypeExtensionNode, RequiredStatus, } from './ast'; -import { Kind } from './kinds'; -import { Location, OperationTypeNode } from './ast'; -import { ComplexRequiredStatus } from './ast'; +import { Location, OperationTypeNode, ComplexRequiredStatus } from './ast'; -import { TokenKind } from './tokenKind'; +import { Kind } from './kinds'; import { Source, isSource } from './source'; import { DirectiveLocation } from './directiveLocation'; import { Lexer, isPunctuatorTokenKind } from './lexer'; @@ -460,23 +461,18 @@ export class Parser { return allowedTokens.reduce(reducer, false); }; - // There are no more characters that could make up a nullability designator var listDepthCount = 0; var lastRequiredStatus: RequiredStatus = 'unset'; var outerComplexRequiredStatus: ComplexRequiredStatus | undefined = undefined; + + // The spec expects !, ?, or [ until there's a ] while (stillDefiningNullabilityDesignator()) { if (this.expectOptionalToken(TokenKind.BRACKET_L)) { listDepthCount += 1; - } else if (this.expectOptionalToken(TokenKind.BRACKET_R)) { - listDepthCount -= 1; - lastRequiredStatus = this.parseSimpleRequiredStatus(); - outerComplexRequiredStatus = new ComplexRequiredStatus( - lastRequiredStatus, - // handles unset elements on the innermost list - outerComplexRequiredStatus ?? new ComplexRequiredStatus('unset'), - ); + } else if (this.peek(TokenKind.BRACKET_R)) { + break; } else { // throws on multiple designators in a row eg ?!! if (outerComplexRequiredStatus) { @@ -494,6 +490,27 @@ export class Parser { } } + // once there's been a ], no more [ are allowed + while (stillDefiningNullabilityDesignator()) { + if (this.expectOptionalToken(TokenKind.BRACKET_R)) { + listDepthCount -= 1; + lastRequiredStatus = this.parseSimpleRequiredStatus(); + outerComplexRequiredStatus = new ComplexRequiredStatus( + lastRequiredStatus, + // handles unset elements on the innermost list + outerComplexRequiredStatus ?? new ComplexRequiredStatus('unset'), + ); + } else { + throw syntaxError( + this._lexer.source, + this._lexer.token.start, + 'Invalid nullability designator', + ); + } + } + // There are no more characters that could make up a nullability designator + + // Indicates unbalanced braces eg [[] or []] if (listDepthCount != 0) { throw syntaxError( this._lexer.source, From ad1df1ac3f2429228e90441e33eeedc3fba69b1b Mon Sep 17 00:00:00 2001 From: twof Date: Thu, 18 Nov 2021 00:00:31 -0800 Subject: [PATCH 41/64] assorted self review cleanup --- src/execution/__tests__/executor-test.ts | 4 +-- src/language/parser.ts | 25 ++++++++++++++++--- src/language/printer.ts | 2 +- src/utilities/applyRequiredStatus.ts | 2 -- ...StatusOnFieldMatchesDefinitionRule-test.ts | 13 +++------- ...uiredStatusOnFieldMatchesDefinitionRule.ts | 25 ++++--------------- 6 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/execution/__tests__/executor-test.ts b/src/execution/__tests__/executor-test.ts index a98933de51..8782e4e57e 100644 --- a/src/execution/__tests__/executor-test.ts +++ b/src/execution/__tests__/executor-test.ts @@ -21,7 +21,7 @@ import { } from '../../type/definition'; import { execute, executeSync } from '../execute'; -import { modifiedOutputType } from '../..'; +import { modifiedOutputType } from '../../utilities/applyRequiredStatus'; import { ComplexRequiredStatus } from '../../language/ast'; describe('Execute: Handles basic execution tasks', () => { @@ -1425,7 +1425,7 @@ describe('Execute: Handles basic execution tasks', () => { }); }); - it('null does not bubble up when field that returns does not return null is required', () => { + it('null does not propagate up when field that returns does not return null is required', () => { const singleNonNullOnNonNullValueDocument = parse(` query { food { diff --git a/src/language/parser.ts b/src/language/parser.ts index 319bc0dd71..1b5eac8ce5 100644 --- a/src/language/parser.ts +++ b/src/language/parser.ts @@ -414,7 +414,7 @@ export class Parser { } /** - * Field : Alias? Name Arguments? Directives? SelectionSet? + * Field : Alias? Name Nullability? Arguments? Directives? SelectionSet? * * Alias : Name : */ @@ -447,6 +447,19 @@ export class Parser { }); } + /** + * Nullability : + * - ! + * - ? + * + * NOTES: + * parseRequiredStatus assumes that if you have a designator like [[[!]!]!]! , the tokens can be + * grouped like ([[[) (!) (]!) (]!) (]!) . The center designator is on its own, and the rest are + * attached to a right bracket. This thinking simplifies parsing. + * + * A designator on its own like with `field!` is found using the same subroutine that's used to + * find the center designator mentioned above. + */ parseRequiredStatus(): ComplexRequiredStatus { const stillDefiningNullabilityDesignator = (): boolean => { let allowedTokens = [ @@ -490,7 +503,7 @@ export class Parser { } } - // once there's been a ], no more [ are allowed + // Once there's been a ], no more [ are allowed while (stillDefiningNullabilityDesignator()) { if (this.expectOptionalToken(TokenKind.BRACKET_R)) { listDepthCount -= 1; @@ -524,7 +537,13 @@ export class Parser { new ComplexRequiredStatus(lastRequiredStatus) ); } - + + /** + * Nullability : + * - ! + * - ? + * + */ parseSimpleRequiredStatus(): RequiredStatus { let required: RequiredStatus; if (this.expectOptionalToken(TokenKind.BANG)) { diff --git a/src/language/printer.ts b/src/language/printer.ts index 03b77a0a09..e13abe2eb4 100644 --- a/src/language/printer.ts +++ b/src/language/printer.ts @@ -5,7 +5,7 @@ import type { ASTReducer } from './visitor'; import { visit } from './visitor'; import { printBlockString } from './blockString'; import { printString } from './printString'; -import { ComplexRequiredStatus } from '.'; +import { ComplexRequiredStatus } from './ast'; /** * Converts an AST into a string, using one set of reasonable diff --git a/src/utilities/applyRequiredStatus.ts b/src/utilities/applyRequiredStatus.ts index a3d039f9d4..f61bb77231 100644 --- a/src/utilities/applyRequiredStatus.ts +++ b/src/utilities/applyRequiredStatus.ts @@ -6,10 +6,8 @@ import { isNonNullType, assertListType, GraphQLList, - isListType, } from '../type/definition'; import { ComplexRequiredStatus } from '../language/ast'; -import { print } from '..'; /** * Implements the "Accounting For Client Controlled Nullability Designators" diff --git a/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts b/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts index f233f14312..3db47326fc 100644 --- a/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts +++ b/src/validation/__tests__/RequiredStatusOnFieldMatchesDefinitionRule-test.ts @@ -1,14 +1,7 @@ -import { expect } from 'chai'; import { describe, it } from 'mocha'; -import { parse } from '../../language/parser'; - -import type { GraphQLSchema } from '../../type/schema'; - import { buildSchema } from '../../utilities/buildASTSchema'; -import { validate } from '../validate'; - import { expectValidationErrorsWithSchema } from './harness'; import { RequiredStatusOnFieldMatchesDefinitionRule } from '../rules/RequiredStatusOnFieldMatchesDefinitionRule'; @@ -39,7 +32,7 @@ const testSchema = buildSchema(` describe('Validate: Field uses correct list depth', () => { it('Fields are valid', () => { expectValid(` - fragment typeKnownAgain on Lists { + fragment listFragment on Lists { list[!] nonList! mixedThreeDList[[[!]!]!]! @@ -47,9 +40,9 @@ describe('Validate: Field uses correct list depth', () => { `); }); - it('reports errors when type is known again', () => { + it('reports errors when list depth is too high', () => { expectErrors(` - fragment typeKnownAgain on Lists { + fragment listFragment on Lists { list[[]] notAList: nonList[!] mixedThreeDList[[!]!]! diff --git a/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts b/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts index 1ebab20134..0831f6defd 100644 --- a/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts +++ b/src/validation/rules/RequiredStatusOnFieldMatchesDefinitionRule.ts @@ -1,33 +1,18 @@ -import { didYouMean } from '../../jsutils/didYouMean'; -import { suggestionList } from '../../jsutils/suggestionList'; -import { naturalCompare } from '../../jsutils/naturalCompare'; - import { GraphQLError } from '../../error/GraphQLError'; import type { FieldNode } from '../../language/ast'; import type { ASTVisitor } from '../../language/visitor'; -import type { GraphQLSchema } from '../../type/schema'; -import type { - GraphQLOutputType, - GraphQLObjectType, - GraphQLInterfaceType, - GraphQLField, -} from '../../type/definition'; -import { - isObjectType, - isInterfaceType, - isAbstractType, -} from '../../type/definition'; +import type { GraphQLField } from '../../type/definition'; import type { ValidationContext } from '../ValidationContext'; -import { modifiedOutputType } from '../..'; +import { modifiedOutputType } from '../../utilities/applyRequiredStatus'; /** - * Fields on correct type + * List element nullability designators need to use a depth that is the same as or less than the + * type of the field it's applied to. * - * A GraphQL document is only valid if all fields selected are defined by the - * parent type, or are an allowed meta field such as __typename. + * Otherwise the GraphQL document is invalid. * * See https://spec.graphql.org/draft/#sec-Field-Selections */ From c5d1cb66a1c309fb60083296b1dfda1da19d29de Mon Sep 17 00:00:00 2001 From: twof Date: Thu, 18 Nov 2021 09:52:22 -0800 Subject: [PATCH 42/64] npm test passing --- graphql-16.0.0-rc.3.tgz | Bin 277476 -> 0 bytes src/execution/__tests__/executor-test.ts | 36 +++++------ src/execution/execute.ts | 13 +++- src/index.ts | 3 - src/language/__tests__/parser-test.ts | 58 +++++++++--------- src/language/__tests__/printer-test.ts | 7 +-- src/language/ast.ts | 12 +++- src/language/index.ts | 4 -- src/language/parser.ts | 46 +++++++------- src/language/printer.ts | 35 ++++++----- src/utilities/__tests__/TypeInfo-test.ts | 4 +- src/utilities/applyRequiredStatus.ts | 16 ++--- .../OverlappingFieldsCanBeMergedRule-test.ts | 32 +++++----- ...StatusOnFieldMatchesDefinitionRule-test.ts | 7 ++- .../rules/OverlappingFieldsCanBeMergedRule.ts | 8 ++- 15 files changed, 148 insertions(+), 133 deletions(-) delete mode 100644 graphql-16.0.0-rc.3.tgz diff --git a/graphql-16.0.0-rc.3.tgz b/graphql-16.0.0-rc.3.tgz deleted file mode 100644 index 7012e9e912d5f129f903e3b6cc7fc6eac2eeece8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 277476 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%0DhrAtBTNW?)EpR55!_%IQ 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