diff --git a/packages/graphql-printer/src/PrinterTest~export-InputObjectTypeDefinition.graphql b/packages/graphql-printer/src/PrinterTest~export-InputObjectTypeDefinition.graphql index a91f16e8f..6f48b9565 100644 --- a/packages/graphql-printer/src/PrinterTest~export-InputObjectTypeDefinition.graphql +++ b/packages/graphql-printer/src/PrinterTest~export-InputObjectTypeDefinition.graphql @@ -9,8 +9,8 @@ input InputUnused { Directive description """ directive @directive( - hidden: InputHidden location: String + hidden: InputHidden ) repeatable on | ARGUMENT_DEFINITION diff --git a/packages/graphql-printer/src/PrinterTest~export-InterfaceType.graphql b/packages/graphql-printer/src/PrinterTest~export-InterfaceType.graphql index 4f53e8bb0..f49e972b5 100644 --- a/packages/graphql-printer/src/PrinterTest~export-InterfaceType.graphql +++ b/packages/graphql-printer/src/PrinterTest~export-InterfaceType.graphql @@ -18,8 +18,8 @@ Directive description """ directive @directive( - hidden: InputHidden location: String + hidden: InputHidden ) repeatable on | ARGUMENT_DEFINITION diff --git a/packages/graphql-printer/src/PrinterTest~export-ObjectType.graphql b/packages/graphql-printer/src/PrinterTest~export-ObjectType.graphql index 1655a163b..5118ba20f 100644 --- a/packages/graphql-printer/src/PrinterTest~export-ObjectType.graphql +++ b/packages/graphql-printer/src/PrinterTest~export-ObjectType.graphql @@ -32,8 +32,8 @@ implements Directive description """ directive @directive( - hidden: InputHidden location: String + hidden: InputHidden ) repeatable on | ARGUMENT_DEFINITION diff --git a/packages/graphql-printer/src/PrinterTest~export-UnionType.graphql b/packages/graphql-printer/src/PrinterTest~export-UnionType.graphql index 229c754c5..2f803ad6c 100644 --- a/packages/graphql-printer/src/PrinterTest~export-UnionType.graphql +++ b/packages/graphql-printer/src/PrinterTest~export-UnionType.graphql @@ -5,8 +5,8 @@ union Union = Directive description """ directive @directive( - hidden: InputHidden location: String + hidden: InputHidden ) repeatable on | ARGUMENT_DEFINITION diff --git a/packages/graphql-printer/src/PrinterTest~export-UnionTypeDefinitionNode.graphql b/packages/graphql-printer/src/PrinterTest~export-UnionTypeDefinitionNode.graphql index 0ca8a38ab..9f74c3a40 100644 --- a/packages/graphql-printer/src/PrinterTest~export-UnionTypeDefinitionNode.graphql +++ b/packages/graphql-printer/src/PrinterTest~export-UnionTypeDefinitionNode.graphql @@ -5,8 +5,8 @@ Directive description """ directive @directive( - hidden: InputHidden location: String + hidden: InputHidden ) repeatable on | ARGUMENT_DEFINITION diff --git a/packages/graphql-printer/src/PrinterTest~print-Schema-DefaultSettings.graphql b/packages/graphql-printer/src/PrinterTest~print-Schema-DefaultSettings.graphql index 11b06f237..e792df6c4 100644 --- a/packages/graphql-printer/src/PrinterTest~print-Schema-DefaultSettings.graphql +++ b/packages/graphql-printer/src/PrinterTest~print-Schema-DefaultSettings.graphql @@ -2,8 +2,8 @@ Directive description """ directive @directive( - hidden: InputHidden location: String + hidden: InputHidden ) repeatable on | ARGUMENT_DEFINITION @@ -139,12 +139,12 @@ scalar Scalar type Mutation { mutate( - a: InputA - scalar: Int! = 123 @directive( location: "argument" ) + + a: InputA ): [TypeB!] } @@ -161,13 +161,13 @@ type Query { scalar: Scalar type( - a: InputA - scalar: Int! = 123 @directive( - hidden: null location: "argument" + hidden: null ) + + a: InputA ): TypeA! union: Union diff --git a/packages/graphql-printer/src/PrinterTest~print-Schema-TestSettings-DirectiveDefinitionFilter.graphql b/packages/graphql-printer/src/PrinterTest~print-Schema-TestSettings-DirectiveDefinitionFilter.graphql index cd4109bf7..0f9fe7c3b 100644 --- a/packages/graphql-printer/src/PrinterTest~print-Schema-TestSettings-DirectiveDefinitionFilter.graphql +++ b/packages/graphql-printer/src/PrinterTest~print-Schema-TestSettings-DirectiveDefinitionFilter.graphql @@ -126,12 +126,12 @@ scalar Scalar type Mutation { mutate( - a: InputA - scalar: Int! = 123 @directive( location: "argument" ) + + a: InputA ): [TypeB!] } @@ -148,13 +148,13 @@ type Query { scalar: Scalar type( - a: InputA - scalar: Int! = 123 @directive( - hidden: null location: "argument" + hidden: null ) + + a: InputA ): TypeA! union: Union diff --git a/packages/graphql-printer/src/PrinterTest~print-Schema-TestSettings-Everything.graphql b/packages/graphql-printer/src/PrinterTest~print-Schema-TestSettings-Everything.graphql index c465c0085..84ec71810 100644 --- a/packages/graphql-printer/src/PrinterTest~print-Schema-TestSettings-Everything.graphql +++ b/packages/graphql-printer/src/PrinterTest~print-Schema-TestSettings-Everything.graphql @@ -17,8 +17,8 @@ on Directive description """ directive @directive( - hidden: InputHidden location: String + hidden: InputHidden ) repeatable on | ARGUMENT_DEFINITION @@ -174,12 +174,12 @@ scalar String type Mutation { mutate( - a: InputA - scalar: Int! = 123 @directive( location: "argument" ) + + a: InputA ): [TypeB!] } @@ -196,13 +196,13 @@ type Query { scalar: Scalar type( - a: InputA - scalar: Int! = 123 @directive( - hidden: null location: "argument" + hidden: null ) + + a: InputA ): TypeA! union: Union diff --git a/packages/graphql-printer/src/PrinterTest~print-Schema-TestSettings-NoDirectivesDefinitions.graphql b/packages/graphql-printer/src/PrinterTest~print-Schema-TestSettings-NoDirectivesDefinitions.graphql index bb38bf6cd..a177f2eaf 100644 --- a/packages/graphql-printer/src/PrinterTest~print-Schema-TestSettings-NoDirectivesDefinitions.graphql +++ b/packages/graphql-printer/src/PrinterTest~print-Schema-TestSettings-NoDirectivesDefinitions.graphql @@ -111,12 +111,12 @@ scalar Scalar type Mutation { mutate( - a: InputA - scalar: Int! = 123 @directive( location: "argument" ) + + a: InputA ): [TypeB!] } @@ -133,13 +133,13 @@ type Query { scalar: Scalar type( - a: InputA - scalar: Int! = 123 @directive( - hidden: null location: "argument" + hidden: null ) + + a: InputA ): TypeA! union: Union diff --git a/packages/graphql-printer/src/PrinterTest~print-Schema-TestSettings-TypeDefinitionFilter.graphql b/packages/graphql-printer/src/PrinterTest~print-Schema-TestSettings-TypeDefinitionFilter.graphql index ce2256fcf..81781bab8 100644 --- a/packages/graphql-printer/src/PrinterTest~print-Schema-TestSettings-TypeDefinitionFilter.graphql +++ b/packages/graphql-printer/src/PrinterTest~print-Schema-TestSettings-TypeDefinitionFilter.graphql @@ -2,8 +2,8 @@ Directive description """ directive @directive( - hidden: InputHidden location: String + hidden: InputHidden ) repeatable on | ARGUMENT_DEFINITION @@ -139,12 +139,12 @@ scalar Scalar type Mutation { mutate( - a: InputA - scalar: Int! = 123 @directive( location: "argument" ) + + a: InputA ): [TypeB!] } @@ -161,13 +161,13 @@ type Query { scalar: Scalar type( - a: InputA - scalar: Int! = 123 @directive( - hidden: null location: "argument" + hidden: null ) + + a: InputA ): TypeA! union: Union diff --git a/packages/graphql-printer/src/PrinterTest~print-Schema-TestSettings-TypeFilter.graphql b/packages/graphql-printer/src/PrinterTest~print-Schema-TestSettings-TypeFilter.graphql index c54f6514d..0ccc5783f 100644 --- a/packages/graphql-printer/src/PrinterTest~print-Schema-TestSettings-TypeFilter.graphql +++ b/packages/graphql-printer/src/PrinterTest~print-Schema-TestSettings-TypeFilter.graphql @@ -132,12 +132,12 @@ scalar Scalar type Mutation { mutate( - a: InputA - scalar: Int! = 123 @directive( location: "argument" ) + + a: InputA ): [TypeB!] } @@ -149,12 +149,12 @@ type Query { scalar: Scalar type( - a: InputA - scalar: Int! = 123 @directive( location: "argument" ) + + a: InputA ): TypeA! union: Union diff --git a/packages/graphql-printer/src/PrinterTest~print-Schema-TestSettings.graphql b/packages/graphql-printer/src/PrinterTest~print-Schema-TestSettings.graphql index 11b06f237..e792df6c4 100644 --- a/packages/graphql-printer/src/PrinterTest~print-Schema-TestSettings.graphql +++ b/packages/graphql-printer/src/PrinterTest~print-Schema-TestSettings.graphql @@ -2,8 +2,8 @@ Directive description """ directive @directive( - hidden: InputHidden location: String + hidden: InputHidden ) repeatable on | ARGUMENT_DEFINITION @@ -139,12 +139,12 @@ scalar Scalar type Mutation { mutate( - a: InputA - scalar: Int! = 123 @directive( location: "argument" ) + + a: InputA ): [TypeB!] } @@ -161,13 +161,13 @@ type Query { scalar: Scalar type( - a: InputA - scalar: Int! = 123 @directive( - hidden: null location: "argument" + hidden: null ) + + a: InputA ): TypeA! union: Union diff --git a/packages/graphql-printer/src/Settings/ImmutableSettings.php b/packages/graphql-printer/src/Settings/ImmutableSettings.php index b347fcd26..07f627b2c 100644 --- a/packages/graphql-printer/src/Settings/ImmutableSettings.php +++ b/packages/graphql-printer/src/Settings/ImmutableSettings.php @@ -21,7 +21,7 @@ abstract class ImmutableSettings implements Settings { protected bool $normalizeEnums = true; protected bool $normalizeInterfaces = true; protected bool $normalizeFields = true; - protected bool $normalizeArguments = true; + protected bool $normalizeArguments = false; protected bool $normalizeDescription = true; protected bool $normalizeDirectiveLocations = true; protected bool $alwaysMultilineUnions = true; diff --git a/packages/graphql-printer/src/Testing/TestSettings.php b/packages/graphql-printer/src/Testing/TestSettings.php index 33e2273d8..5e002e773 100644 --- a/packages/graphql-printer/src/Testing/TestSettings.php +++ b/packages/graphql-printer/src/Testing/TestSettings.php @@ -21,7 +21,7 @@ class TestSettings extends ImmutableSettings { protected bool $normalizeEnums = true; protected bool $normalizeInterfaces = true; protected bool $normalizeFields = true; - protected bool $normalizeArguments = true; + protected bool $normalizeArguments = false; protected bool $normalizeDescription = true; protected bool $normalizeDirectiveLocations = true; protected bool $alwaysMultilineUnions = true; diff --git a/packages/graphql/src/Printer/PrinterTest~print-Schema-DefaultSettings.graphql b/packages/graphql/src/Printer/PrinterTest~print-Schema-DefaultSettings.graphql index 30410db67..52eb5ad9f 100644 --- a/packages/graphql/src/Printer/PrinterTest~print-Schema-DefaultSettings.graphql +++ b/packages/graphql/src/Printer/PrinterTest~print-Schema-DefaultSettings.graphql @@ -1,8 +1,8 @@ directive @codeDirective( - custom: [CodeDirectiveScalarCustomClass] enum: CodeDirectiveEnum input: CodeDirectiveInput scalar: CodeDirectiveScalar! + custom: [CodeDirectiveScalarCustomClass] ) repeatable on | INTERFACE @@ -202,17 +202,17 @@ type Query { c( a: SchemaInput = { - a: "aaa" - b: A - c: "ccc" - d: A e: { - a: "aaa" - b: A - c: "ccc" - d: A f: ["aaa", "bbb", "ccc", "ddd"] + d: A + c: "ccc" + b: A + a: "aaa" } + d: A + c: "ccc" + b: A + a: "aaa" } ): CodeScalar @mock diff --git a/packages/graphql/src/Printer/PrinterTest~print-Schema-TestSettings-DirectiveDefinitionFilter.graphql b/packages/graphql/src/Printer/PrinterTest~print-Schema-TestSettings-DirectiveDefinitionFilter.graphql index ae8989899..f9509ad29 100644 --- a/packages/graphql/src/Printer/PrinterTest~print-Schema-TestSettings-DirectiveDefinitionFilter.graphql +++ b/packages/graphql/src/Printer/PrinterTest~print-Schema-TestSettings-DirectiveDefinitionFilter.graphql @@ -150,17 +150,17 @@ type Query { c( a: SchemaInput = { - a: "aaa" - b: A - c: "ccc" - d: A e: { - a: "aaa" - b: A - c: "ccc" - d: A f: ["aaa", "bbb", "ccc", "ddd"] + d: A + c: "ccc" + b: A + a: "aaa" } + d: A + c: "ccc" + b: A + a: "aaa" } ): CodeScalar @mock diff --git a/packages/graphql/src/Printer/PrinterTest~print-Schema-TestSettings-Everything.graphql b/packages/graphql/src/Printer/PrinterTest~print-Schema-TestSettings-Everything.graphql index b605c531d..9b18575e1 100644 --- a/packages/graphql/src/Printer/PrinterTest~print-Schema-TestSettings-Everything.graphql +++ b/packages/graphql/src/Printer/PrinterTest~print-Schema-TestSettings-Everything.graphql @@ -1,8 +1,8 @@ directive @codeDirective( - custom: [CodeDirectiveScalarCustomClass] enum: CodeDirectiveEnum input: CodeDirectiveInput scalar: CodeDirectiveScalar! + custom: [CodeDirectiveScalarCustomClass] ) repeatable on | INTERFACE @@ -235,17 +235,17 @@ type Query { c( a: SchemaInput = { - a: "aaa" - b: A - c: "ccc" - d: A e: { - a: "aaa" - b: A - c: "ccc" - d: A f: ["aaa", "bbb", "ccc", "ddd"] + d: A + c: "ccc" + b: A + a: "aaa" } + d: A + c: "ccc" + b: A + a: "aaa" } ): CodeScalar @mock diff --git a/packages/graphql/src/Printer/PrinterTest~print-Schema-TestSettings-NoDirectivesDefinitions.graphql b/packages/graphql/src/Printer/PrinterTest~print-Schema-TestSettings-NoDirectivesDefinitions.graphql index 1a21e4592..e5cc8c9a9 100644 --- a/packages/graphql/src/Printer/PrinterTest~print-Schema-TestSettings-NoDirectivesDefinitions.graphql +++ b/packages/graphql/src/Printer/PrinterTest~print-Schema-TestSettings-NoDirectivesDefinitions.graphql @@ -131,17 +131,17 @@ type Query { c( a: SchemaInput = { - a: "aaa" - b: A - c: "ccc" - d: A e: { - a: "aaa" - b: A - c: "ccc" - d: A f: ["aaa", "bbb", "ccc", "ddd"] + d: A + c: "ccc" + b: A + a: "aaa" } + d: A + c: "ccc" + b: A + a: "aaa" } ): CodeScalar @mock diff --git a/packages/graphql/src/Printer/PrinterTest~print-Schema-TestSettings-TypeDefinitionFilter.graphql b/packages/graphql/src/Printer/PrinterTest~print-Schema-TestSettings-TypeDefinitionFilter.graphql index c778fc140..aeb2eb144 100644 --- a/packages/graphql/src/Printer/PrinterTest~print-Schema-TestSettings-TypeDefinitionFilter.graphql +++ b/packages/graphql/src/Printer/PrinterTest~print-Schema-TestSettings-TypeDefinitionFilter.graphql @@ -1,8 +1,8 @@ directive @codeDirective( - custom: [CodeDirectiveScalarCustomClass] enum: CodeDirectiveEnum input: CodeDirectiveInput scalar: CodeDirectiveScalar! + custom: [CodeDirectiveScalarCustomClass] ) repeatable on | INTERFACE @@ -145,17 +145,17 @@ type Query { c( a: SchemaInput = { - a: "aaa" - b: A - c: "ccc" - d: A e: { - a: "aaa" - b: A - c: "ccc" - d: A f: ["aaa", "bbb", "ccc", "ddd"] + d: A + c: "ccc" + b: A + a: "aaa" } + d: A + c: "ccc" + b: A + a: "aaa" } ): CodeScalar @mock diff --git a/packages/graphql/src/Printer/PrinterTest~print-Schema-TestSettings.graphql b/packages/graphql/src/Printer/PrinterTest~print-Schema-TestSettings.graphql index 30410db67..52eb5ad9f 100644 --- a/packages/graphql/src/Printer/PrinterTest~print-Schema-TestSettings.graphql +++ b/packages/graphql/src/Printer/PrinterTest~print-Schema-TestSettings.graphql @@ -1,8 +1,8 @@ directive @codeDirective( - custom: [CodeDirectiveScalarCustomClass] enum: CodeDirectiveEnum input: CodeDirectiveInput scalar: CodeDirectiveScalar! + custom: [CodeDirectiveScalarCustomClass] ) repeatable on | INTERFACE @@ -202,17 +202,17 @@ type Query { c( a: SchemaInput = { - a: "aaa" - b: A - c: "ccc" - d: A e: { - a: "aaa" - b: A - c: "ccc" - d: A f: ["aaa", "bbb", "ccc", "ddd"] + d: A + c: "ccc" + b: A + a: "aaa" } + d: A + c: "ccc" + b: A + a: "aaa" } ): CodeScalar @mock diff --git a/packages/graphql/src/SortBy/Directives/DirectiveTest~full-expected.graphql b/packages/graphql/src/SortBy/Directives/DirectiveTest~full-expected.graphql index 1ad4007c9..8827cf191 100644 --- a/packages/graphql/src/SortBy/Directives/DirectiveTest~full-expected.graphql +++ b/packages/graphql/src/SortBy/Directives/DirectiveTest~full-expected.graphql @@ -557,8 +557,8 @@ interface Placeholder { interface Scout { scout( - order: [SortByScoutClauseProperties!] search: String + order: [SortByScoutClauseProperties!] ): ID! } @@ -671,11 +671,11 @@ implements ) scout( - order: [SortByScoutClauseProperties!] - @sortBy - search: String @search + + order: [SortByScoutClauseProperties!] + @sortBy ): ID! @all } diff --git a/packages/graphql/src/Stream/Directives/DirectiveTest~expected.graphql b/packages/graphql/src/Stream/Directives/DirectiveTest~expected.graphql index 290c29589..565d26dab 100644 --- a/packages/graphql/src/Stream/Directives/DirectiveTest~expected.graphql +++ b/packages/graphql/src/Stream/Directives/DirectiveTest~expected.graphql @@ -54,33 +54,33 @@ by an offset or a cursor. """ directive @stream( """ - Overrides default builder. Useful if the standard detection - algorithm doesn't fit/work. By default, the directive will use - the field and its type to determine the Builder to query. + Overrides default searchable status. """ - builder: StreamBuilder + searchable: Boolean """ - Overrides default unique key. Useful if the standard detection - algorithm doesn't fit/work. By default, the directive will use - the name of field with `ID!` type. + Overrides default sortable status. """ - key: String + sortable: Boolean """ - Overrides default limit. + Overrides default builder. Useful if the standard detection + algorithm doesn't fit/work. By default, the directive will use + the field and its type to determine the Builder to query. """ - limit: Int + builder: StreamBuilder """ - Overrides default searchable status. + Overrides default limit. """ - searchable: Boolean + limit: Int """ - Overrides default sortable status. + Overrides default unique key. Useful if the standard detection + algorithm doesn't fit/work. By default, the directive will use + the name of field with `ID!` type. """ - sortable: Boolean + key: String ) on | FIELD_DEFINITION @@ -217,10 +217,10 @@ input StreamBuilder { interface InterfaceA { fieldWithArguments( argument: String - cursor: StreamCursor - limit: Int! - order: [SortByClauseTestObject!] where: SearchByConditionTestObject + order: [SortByClauseTestObject!] + limit: Int! + cursor: StreamCursor ): TestObjectsStream! } @@ -229,9 +229,9 @@ implements & InterfaceC { fieldNotSearchable( - cursor: StreamCursor - limit: Int! order: [SortByClauseTestObject!] + limit: Int! + cursor: StreamCursor ): TestObjectsStream! } @@ -263,11 +263,8 @@ implements & InterfaceB { fieldNotSearchable( - """ - The cursor or offset within the stream to start. - """ - cursor: StreamCursor - @streamCursor + order: [SortByClauseTestObject!] + @sortBy """ Maximum count of items to return. The value must be between `1` and `100`. @@ -278,8 +275,11 @@ implements apply: ["integer", "min:1", "max:100"] ) - order: [SortByClauseTestObject!] - @sortBy + """ + The cursor or offset within the stream to start. + """ + cursor: StreamCursor + @streamCursor ): TestObjectsStream! @stream( searchable: false @@ -287,11 +287,8 @@ implements @validate fieldNotSortable( - """ - The cursor or offset within the stream to start. - """ - cursor: StreamCursor - @streamCursor + where: SearchByConditionTestObject + @searchBy """ Maximum count of items to return. The value must be between `1` and `100`. @@ -302,8 +299,11 @@ implements apply: ["integer", "min:1", "max:100"] ) - where: SearchByConditionTestObject - @searchBy + """ + The cursor or offset within the stream to start. + """ + cursor: StreamCursor + @streamCursor ): TestObjectsStream! @stream( sortable: false @@ -313,11 +313,11 @@ implements fieldWithArguments( argument: String - """ - The cursor or offset within the stream to start. - """ - cursor: StreamCursor - @streamCursor + where: SearchByConditionTestObject + @searchBy + + order: [SortByClauseTestObject!] + @sortBy """ Maximum count of items to return. The value must be between `1` and `100`. @@ -328,11 +328,11 @@ implements apply: ["integer", "min:1", "max:100"] ) - order: [SortByClauseTestObject!] - @sortBy - - where: SearchByConditionTestObject - @searchBy + """ + The cursor or offset within the stream to start. + """ + cursor: StreamCursor + @streamCursor ): TestObjectsStream! @stream @validate @@ -359,12 +359,6 @@ implements apply: ["integer", "min:1", "max:123"] ) - """ - The cursor or offset within the stream to start. - """ - cursor: StreamCursor - @streamCursor - """ The cursor or offset within the stream to start. """ @@ -372,6 +366,12 @@ implements @deprecated @streamCursor + where: SearchByConditionTestObject + @searchBy + + order: [SortByClauseTestObject!] + @sortBy + """ Maximum count of items to return. The value must be between `1` and `100`. """ @@ -383,11 +383,11 @@ implements apply: ["integer", "min:1", "max:100"] ) - order: [SortByClauseTestObject!] - @sortBy - - where: SearchByConditionTestObject - @searchBy + """ + The cursor or offset within the stream to start. + """ + cursor: StreamCursor + @streamCursor ): TestObjectsStream! @stream( limit: 15 @@ -452,11 +452,14 @@ implements @validate fieldWithSearch( - """ - The cursor or offset within the stream to start. - """ - cursor: StreamCursor - @streamCursor + search: String! + @search + + where: SearchByScoutConditionTestObject + @searchBy + + order: [SortByScoutClauseTestObject!] + @sortBy """ Maximum count of items to return. The value must be between `1` and `100`. @@ -467,24 +470,21 @@ implements apply: ["integer", "min:1", "max:100"] ) - order: [SortByScoutClauseTestObject!] - @sortBy - - search: String! - @search - - where: SearchByScoutConditionTestObject - @searchBy - ): TestObjectsStream! - @stream - @validate - - fieldWithoutArguments( """ The cursor or offset within the stream to start. """ cursor: StreamCursor @streamCursor + ): TestObjectsStream! + @stream + @validate + + fieldWithoutArguments( + where: SearchByConditionTestObject + @searchBy + + order: [SortByClauseTestObject!] + @sortBy """ Maximum count of items to return. The value must be between `1` and `100`. @@ -495,11 +495,11 @@ implements apply: ["integer", "min:1", "max:100"] ) - order: [SortByClauseTestObject!] - @sortBy - - where: SearchByConditionTestObject - @searchBy + """ + The cursor or offset within the stream to start. + """ + cursor: StreamCursor + @streamCursor ): TestObjectsStream! @stream @validate